[openssl] RootCA 및 SSL 인증서 만들기 for Windows

REM ##################################################################
REM #
REM # openssl 인증서 생성
REM #
REM ##################################################################
@ECHO OFF
CHCP 65001 1> NUL 2> NUL

SET "CERT_NAME=https_cert"
SET "DOMAIN_NAME=apache.org"
SET "COMMON_NAME=apache-httpd"
SET "COMPANY_NAME= Apache Software Foundation"
SET "DEFAULT_DAYS=36500"
DEL *.cnf
DEL *.crt
DEL *.csr
DEL *.key
DEL *.orig
CLS

ECHO ###########################################################################
ECHO #
ECHO # openssl.cnf 파일 쓰기
ECHO #
ECHO ###########################################################################
ECHO [ req ]> rootca_openssl.cnf
ECHO default_bits = 2048>> rootca_openssl.cnf
ECHO default_md = sha256>> rootca_openssl.cnf
ECHO default_keyfile = %CERT_NAME%_private.key>> rootca_openssl.cnf
ECHO distinguished_name = req_distinguished_name>> rootca_openssl.cnf
ECHO extensions = v3_ca>> rootca_openssl.cnf
ECHO req_extensions = v3_ca>> rootca_openssl.cnf
ECHO.>> rootca_openssl.cnf
ECHO [ v3_ca ]>> rootca_openssl.cnf
ECHO basicConstraints = critical, CA:TRUE, pathlen:0>> rootca_openssl.cnf
ECHO subjectKeyIdentifier = hash>> rootca_openssl.cnf
ECHO ##authorityKeyIdentifier = keyid:always, issuer:always>> rootca_openssl.cnf
ECHO keyUsage = keyCertSign, cRLSign>> rootca_openssl.cnf
ECHO nsCertType = sslCA, emailCA, objCA>> rootca_openssl.cnf
ECHO.>> rootca_openssl.cnf
ECHO [req_distinguished_name ]>> rootca_openssl.cnf
ECHO countryName = KR>> rootca_openssl.cnf
ECHO countryName_default = KR>> rootca_openssl.cnf
ECHO countryName_min = 2 >> rootca_openssl.cnf
ECHO countryName_max = 2 >> rootca_openssl.cnf
ECHO.>> rootca_openssl.cnf
ECHO # 회사명 입력>> rootca_openssl.cnf
ECHO organizationName = %COMPANY_NAME%>> rootca_openssl.cnf
ECHO organizationName_default = %COMPANY_NAME%>> rootca_openssl.cnf
ECHO.>> rootca_openssl.cnf
ECHO # 부서 입력>> rootca_openssl.cnf
ECHO organizationalUnitName = %COMPANY_NAME%>> rootca_openssl.cnf
ECHO organizationalUnitName_default = %COMPANY_NAME%>> rootca_openssl.cnf
ECHO.>> rootca_openssl.cnf
ECHO # SSL 서비스할 domain 명 입력>> rootca_openssl.cnf
ECHO commonName = %COMMON_NAME%>> rootca_openssl.cnf
ECHO commonName_default = %COMMON_NAME%>> rootca_openssl.cnf
ECHO commonName_max  = 64>> rootca_openssl.cnf
ECHO [ req ]> server_openssl.cnf
ECHO default_bits            = 2048>> server_openssl.cnf
ECHO default_md              = sha1>> server_openssl.cnf
ECHO default_keyfile         = %COMPANY_NAME%-rootca.key>> server_openssl.cnf
ECHO distinguished_name      = req_distinguished_name>> server_openssl.cnf
ECHO extensions              = v3_user>> server_openssl.cnf
ECHO.>> server_openssl.cnf
ECHO [ v3_user ]>> server_openssl.cnf
ECHO # Extensions to add to a certificate request>> server_openssl.cnf
ECHO basicConstraints = CA:FALSE>> server_openssl.cnf
ECHO authorityKeyIdentifier = keyid,issuer>> server_openssl.cnf
ECHO subjectKeyIdentifier = hash>> server_openssl.cnf
ECHO keyUsage = nonRepudiation, digitalSignature, keyEncipherment>> server_openssl.cnf
ECHO ## SSL 용 확장키 필드>> server_openssl.cnf
ECHO extendedKeyUsage = serverAuth,clientAuth>> server_openssl.cnf
ECHO subjectAltName          = @alt_names>> server_openssl.cnf
ECHO.>> server_openssl.cnf
ECHO [ alt_names]>> server_openssl.cnf
ECHO ## Subject AltName의 DNSName field에 SSL Host 의 도메인 이름을 적어준다.>> server_openssl.cnf
ECHO ## 멀티 도메인일 경우 *.%COMPANY_NAME%.com 처럼 쓸 수 있다.>> server_openssl.cnf
ECHO DNS.1 = %COMMON_NAME%>> server_openssl.cnf
ECHO DNS.2 = *.%DOMAIN_NAME%>> server_openssl.cnf
ECHO.>> server_openssl.cnf
ECHO [req_distinguished_name ]>> server_openssl.cnf
ECHO countryName                     = KR>> server_openssl.cnf
ECHO countryName_default             = KR>> server_openssl.cnf
ECHO countryName_min                 = 2 >> server_openssl.cnf
ECHO countryName_max                 = 2 >> server_openssl.cnf
ECHO.>> server_openssl.cnf
ECHO # 회사명 입력>> server_openssl.cnf
ECHO organizationName              = %COMPANY_NAME%>> server_openssl.cnf
ECHO organizationName_default      = %COMPANY_NAME%>> server_openssl.cnf
ECHO.>> server_openssl.cnf
ECHO # 부서 입력>> server_openssl.cnf
ECHO organizationalUnitName          = %COMPANY_NAME%>> server_openssl.cnf
ECHO organizationalUnitName_default  = %COMPANY_NAME%>> server_openssl.cnf
ECHO.>> server_openssl.cnf
ECHO # SSL 서비스할 domain 명 입력>> server_openssl.cnf
ECHO commonName                      = %COMMON_NAME%>> server_openssl.cnf
ECHO commonName_default              = %COMMON_NAME%>> server_openssl.cnf
ECHO commonName_max                  = 64>> server_openssl.cnf

CLS
ECHO ###########################################################################
ECHO #
ECHO # rootCA 인증서 만들기
ECHO #
ECHO ###########################################################################

ECHO.
ECHO ###########################################################################
ECHO Step 1: [RootCA Cert] Private 키를 만든다.
ECHO ###########################################################################
ECHO openssl genrsa -aes256 -out %CERT_NAME%_rootca.key 2048
openssl genrsa -aes256 -out %CERT_NAME%_rootca.key 2048
PAUSE

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 2: [RootCA Cert] 인증요청서(Certificate Signing Request) 생성
ECHO ###########################################################################
ECHO openssl req -new -config rootca_openssl.cnf -key %CERT_NAME%_rootca.key -out %CERT_NAME%_rootca.csr
openssl req -new -config rootca_openssl.cnf -key %CERT_NAME%_rootca.key -out %CERT_NAME%_rootca.csr
PAUSE

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 3: [RootCA Cert] 개인키의 비밀번호 제거
ECHO ###########################################################################
COPY /V %CERT_NAME%_rootca.key %CERT_NAME%_rootca.key.orig
ECHO openssl rsa -in %CERT_NAME%_rootca.key.orig -out %CERT_NAME%_rootca.key
openssl rsa -in %CERT_NAME%_rootca.key.orig -out %CERT_NAME%_rootca.key
PAUSE

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 4: [RootCA Cert] 인증서(Certificate) 생성
ECHO ###########################################################################
ECHO openssl x509 -req -days %DEFAULT_DAYS% -extensions v3_ca -set_serial 1 -extfile rootca_openssl.cnf -in %CERT_NAME%_rootca.csr -signkey %CERT_NAME%_rootca.key -out %CERT_NAME%_rootca.crt
openssl x509 -req -days %DEFAULT_DAYS% -extensions v3_ca -set_serial 1 -extfile rootca_openssl.cnf -in %CERT_NAME%_rootca.csr -signkey %CERT_NAME%_rootca.key -out %CERT_NAME%_rootca.crt
PAUSE

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 5: [RootCA Cert] 확인
ECHO ###########################################################################
openssl x509 -text -in %CERT_NAME%_rootca.crt

CLS
ECHO ###########################################################################
ECHO #
ECHO # rootCA를 기준으로 한 Server SSL 인증서 만들기
ECHO #
ECHO ###########################################################################

ECHO.
ECHO ###########################################################################
ECHO Step 1: [SSL Cert] Private 키를 만든다.
ECHO ###########################################################################
openssl genrsa -aes256 -out %CERT_NAME%_server_private.key 2048

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 2: [SSL Cert] 인증요청서(Certificate Signing Request) 생성
ECHO ###########################################################################
openssl req -new -config server_openssl.cnf -key %CERT_NAME%_server_private.key -out %CERT_NAME%_server.csr

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 3: [SSL Cert] 개인키의 비밀번호 제거
ECHO ###########################################################################
COPY /V  %CERT_NAME%_server_private.key %CERT_NAME%_server_private.key.orig
openssl rsa -in %CERT_NAME%_server_private.key.orig -out %CERT_NAME%_server_private.key

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 4: [SSL Cert] 인증서(Certificate) 생성
ECHO ###########################################################################
openssl x509 -req -set_serial 01 -days %DEFAULT_DAYS% -extensions v3_user -extfile server_openssl.cnf -in %CERT_NAME%_server.csr -CA %CERT_NAME%_rootca.crt -CAcreateserial -CAkey %CERT_NAME%_rootca.key -out %CERT_NAME%_server.crt

CLS
ECHO.
ECHO ###########################################################################
ECHO Step 5: [SSL Cert] 확인
ECHO ###########################################################################
openssl x509 -text -in %CERT_NAME%_server.crt

PAUSE
위로 스크롤