개인키 발급 및 SSL 인증서 생성
WEB 서비스에 https를 적용할 경우 SSL 인증서를 Verisign, Thawte, GeoTrust등에서 인증서를 발급 받아야 하지만, 이는 비용이 발생하며 실 운용 서버가 아닌 경우 다른 방법을 사용 함. 이럴 때, OpenSSL을 이용하여 Self Signed Certificate를 생성하고 SSL 인증서를 발급하여 사용할 수 있다.
Sefl Signed Certificate(SSC)란?
모든 인증서는 발급기관(CA)가 있어야 하나, 최상위에 있는 인증기관(root ca)은 서명해줄 상위 인증기관이 없으므로 root ca의 개인키로 스스로의 인증서에 서명하여 최상위 인증기관 인증서를 만든다. 이렇게 스스로 서명한 root ca 인증서를 Self Signed Certificate라고 한다.
보통의 인증서는 개인키와 공개키가 쌍으로 이루어 만들어진 다음 공개키를 인증기관의 개인키로 전자서명을 한 것을 인증서라고 한다. OpenSSL로 만든 Root CA와 SSL 인증서는 Browser가 모르는 기관이 발급한 인증서 이므로 보안 경고를 발생 시키나, TEST에는 지장 없다.
인증서 서명 요청
PKI(공개키 기반)은 개인키(Private Key)와 공개키 (Public Key)가 쌍으로 이루어진다.
인증서는 나의 공개키가 맞다고 인증기관 (CA)의 개인키로 전자서명을 한 것이며, 나와 보안 통신을 하려는 상대방이 내 인증서를 확인하고 그 인증서 안에 있는 나의 공개키를 이용하여 나에게 암호화된 데이터를 만들어 보낼 수 있다.
이 때, 인증기관(CA)에 나의 인증서를 만들어 달라고 요청하기 위해서 CSR (Certificate Signing Request)이라는 ASN.1 이라는 형식의 파일을 만들어 인증기관에 요청하게 된다. 개인키는 외부에 유출되면 안되기 때문에 이렇게 특별한 형식(CSR)의 파일을 만들어서 인증기관에 전달하여 인증기관으로 하여금 나의 인증서를 만들어서 전달받게 되는 것 (이게 인증서 발급)
Root CA 인증서 생성
1. RSA Key 생성
- 2048bit RSA 암호화 인증서 생성
- 만약 옵션 -aes256을 준다면, 암호를 입력하게 됨
$ openssl genrsa -out rootca.key 2048
2. test_rootca.conf
[ req ]
default_bits = 2048
default_md = sha1
default_keyfile = rootca.key
distinguished_name = req_distinguished_name
extensions = v3_ca
req_extensions = v3_ca
[ v3_ca ]
basicConstraints = critical, CA:TRUE, pathlen:0
subjectKeyIdentifier = hash
##authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = keyCertSign, cRLSign
nsCertType = sslCA, emailCA, objCA
[req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = KR
countryName_min = 2
countryName_max = 2
# 회사명 입력
organizationName = Organization Name (eg, company)
organizationName_default = tmax
# 부서 입력
#organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default = CA Project
# SSL 서비스할 domain 명 입력
commonName = Common Name (eg, your name or your server's hostname)
commonName_default = indienote Self Signed CA
commonName_max = 64
3. csr 생성
$ openssl req -new -key rootca.key -out rootca.csr -config test_rootca.conf
4. 개인키 패스워드 제거
키에 패스워드 존재 시, WebServer 구동 시 마다 물어봄. 패스워드가 없어도 SSL 암호화 통신에는 문제가 없으므로 제거
$ cp rootca.key rootca.key_backup
$ openssl rsa -in rootca.key_backup -out rootca.key
5. Self Signed 인증서 생성
개인키와 인증 요청서를 가지고 인증서 생성, 인증기간이 10년 짜리인 인증서 생성
$ openssl x509 -req -days 3650 -extensions v3_ca -set_serial 1 -in rootca.csr -signkey rootca.key -out rootca.crt -extfile test_rootca.conf
6. 인증서 정상 생서 여부 확인
$ openssl x509 -text -in rootca.crt
7. 인증서 정리
- rootca.key : Root CA의 개인 키
- rootca.crt : Root CA의 공개 키
SSL 인증서 발급
1. SSL 인증서에서 사용할 RSA Private Key 생성
2048bit RSA 암호화 인증서 생성
$ openssl genrsa -out server.key 2048
2. test_cert.conf 파일
[ req ]
default_bits = 2048
default_md = sha1
default_keyfile = rootca.key
distinguished_name = req_distinguished_name
extensions = v3_user
## 인증서 요청시에도 extension 이 들어가면 authorityKeyIdentifier 를 찾지 못해 에러가 나므로 막아둔다.
## req_extensions = v3_user
[ v3_user ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
authorityKeyIdentifier = keyid,issuer
subjectKeyIdentifier = hash
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
## SSL 용 확장키 필드
extendedKeyUsage = serverAuth,clientAuth
subjectAltName = @alt_names
[ alt_names]
## Subject AltName의 DNSName field 에 SSL Host 의 도메인 이름을 적어준다.
## 멀티 도메인일 경우 *.indienote.com 처럼 쓸 수 있다.
DNS.1 = www.test1.co.kr
DNS.2 = test1.co.kr
DNS.3 = *.test1.co.kr
[req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = KR
countryName_min = 2
countryName_max = 2
# 회사명 입력
organizationName = Organization Name (eg, company)
organizationName_default = tmax
# 부서 입력
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = mtax SSL Project
# SSL 서비스할 domain 명 입력
commonName = Common Name (eg, your name or your server's hostname)
commonName_default = www.test1.co.kr
commonName_max = 64
3. CSR 파일 생성
$ openssl req -new -key server.key -out server.csr -config test_cert.conf
4. 5년 짜리 인증서를 Root CA의 개인키로 서명하여 발급
$ openssl x509 -req -days 1825 -in server.csr -CA rootca.crt -CAcreateserial -CAkey rootca.key -out server.crt
SAN 인증서 Sample ext
SAN 인증서 생성 예시
- harbor.ext 파일 내용
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=*.ssu.co.kr
DNS.2=harbor.ssu.co.kr
DNS.3=harbor
- 위 ext 파일 기준으로 인증서 생성
$ openssl x509 -req -days 1825 -in harbor.csr -CA rootca.crt -CAcreateserial -CAkey rootca.key -out server.crt -extfile harbor.ext