인디노트

OpenSSL 로 Root CA 생성하여 Self signed SSL 인증서 발급하기 본문

인증기술/CA

OpenSSL 로 Root CA 생성하여 Self signed SSL 인증서 발급하기

인디개발자 2021. 6. 25. 23:16

웹서버에 보안을 추가하려면 SSL 인증서를 설치해야한다.

주로 베리싸인이나 기타 SSL 인증서 발급 기관에서 유료로 발급을 받거니 Let's Encrypt 같은곳에서 무료 SSL 인증서를 발급 받으면 된다.

하지만 그냥 서비스 운영이 아니라 개발 진행만의 목적으로는 (혹은 외부의 서비스가 아닌 내부 서비스 개발) Self Signed Certificate 를 생성하여 Self Signed SSL 인증서를 만들어 사용할 수도 있다.

Self Signed Certificate 란 스스로 서명한 인증서라는 뜻이며, 보통의 인증서는 개인키와 공개키가 쌍을 이루어 만들어진 다음 공개키를 인증기관의 개인키로 전자서명을 한 것을 인증서라고 할 수 있다.

따라서 모든 인증서는 CA 가 존재하지만 최상위 인증기관 (Root CA)은 상위의 인증기관이 없기 때문에 Root CA 의 개인키로 스스로의 인증서에 서명을 하여 최상위 인증기관의 인증서 (Root CA 인증서) 로 사용하게 된다.

이렇게 스스로 서명한 Root CA 인증서를 Self Signed Certificate (SSC) 라고 한다.

인증서 서명 요청 (CSR)

PKI (공개키 기반) 은 개인키 (Private Key) 와 공개키 (Public Key) 가 쌍으로 이루어진다.

인증서는 나의 공개키가 나의 공개키가 맞다고 인증기관 (CA) 의 개인키로 전자서명을 한 것이며, 나와 보안통신을 하려는 상대방이 내 인증서를 확인하고 그 인증서 안에 있는 나의 공개키를 이용하여 나에게 암호화된 데이터를 만들어 보낼 수 있다.

이때 인증기관 (CA) 에 나의 인증서를 만들어 달라고 요청하기 위해서 CSR (Certificate Signing Request) 이라는 ASN.1 이라는 형식의 파일을 만들어 인증기관에 요청하게 된다. 이에 대한 표준문서는 PKCS#10 - RFC2986 를 참고하면 된다. CSR 에는 내 공개키 정보와 사용하려는 알고리즘 정보 등이 들어있다.

개인키는 외부에 유출되면 안되기 때문에 이렇게 특별한 형식 (CSR) 의 파일을 만들어서 인증기관에 전달하여 인증기관으로 하여금 나의 인증서를 만들어서 전달 받게 되는 것이다. - 인증서 발급 -

CSR 을 만들기 위해서는 나의 개인키를 만들고 몇가지 작업을 해 줘야 하는데 이게 번거롭고 방법을 잘 모르기 때문에 보통의 인증서 발급 대행 업체에서 개인키까지 생성한 후 SSL 인증서를 발급받아 함께 제공해 주기도 한다.

Root CA 인증서 생성

OpenSSL 명령으로 Root CA 의 개인키와 인증서를 만드는 방법을 설명한다.

1. RSA 키  생성

openssl genrsa -aes256 -out indienote-rootca.key 2048

이 명령은 AES-256 비트로 암호화된 indienote-rootca.key 라는 개인키 파일을 생성한다. 생성될 개인키의 길이는 2048 비트이다.

생성할 때 개인키를 암호화할 암호를 입력하게 되는데 암호를 꼭 기억해 두자.

2. 보안을 위해서 개인키 권한 설정을 chmod 600 indienote-rootca.key 으로하여 그룹과 기타 접근 권한을 모두 제거한다.

3. CSR 파일을 생성하기 위해서 indienote-rootca.conf 파일을 생성한다.

[ req ]
default_bits            = 2048
default_md              = sha1
default_keyfile         = indienote-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      = Indie-Note Blog
 
# 부서 입력
#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 

4. CSR 파일을 생성한다.

openssl req -new -key indienote-rootca.key -out indienote-rootca.csr -config indienote-rootca.conf

5. 10 년짜리 (3650 일) Self Signed 인증서 생성

openssl x509 -req \
-days 3650 \
-extensions v3_ca \
-set_serial 1 \
-in indienote-rootca.csr \
-signkey indienote-rootca.key \
-out indienote-rootca.crt \
-extfile indienote-rootca.conf

서명에 사용할 해시 알고리즘을 변경하려면 -sha256, -sha384, -sha512 처럼 해시를 지정하는 옵션을 추가해 주면 된다. 생략하면 기본값으로 -sha256 이 적용된다.

6. 정상적으로 Root CA 인증서가 생성되었는지 확인

openssl x509 -text -in indienote-rootca.crt

indienote-rootca.key : Root CA 의 개인키

indienote-rootca.crt : Root CA 의 공개키

 

 

SSL 인증서 발급을 위한 개인키 생성

앞에서 생성한 Root CA 개인키로 서명한 SSL 인증서를 발급

키 생성

1. SSL 인증서에서 사용할 RSA Private Key 를 생성

openssl genrsa -aes256 -out indienote.com.key 2048

2. Key 에서 암호를 제거 (웹서버 같은데서 사용할 것으로 암호를 원하지 않을 때)

mv indienote.com.key indienote.com.key.enc
openssl rsa -in indienote.com.key.enc -out indienote.com.key

3. 개인키 유출 방지를 위해서 파일 권한을 600 으로 변경

chmod 600 indienote.com.key*

 

SSL 인증서 발급

1. CSR 생성을 위한 config 파일 indienote.com.conf 생성

[ req ]
default_bits            = 2048
default_md              = sha1
default_keyfile         = indienote-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.indienote.com
DNS.2   = indienote.com
DNS.3   = *.indienote.com

[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      = indienote blog

# 부서 입력
organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = indienote SSL Project

# SSL 서비스할 domain 명 입력
commonName                      = Common Name (eg, your name or your server's hostname)
commonName_default              = indienote.com
commonName_max                  = 64

2. CSR 파일 생성

openssl req -new -key indienote.com.key -out indienote.com.csr -config indienote.com.conf

3. 5년 (1825 일) 짜리 indienote.com 용 SSL 인증서를 Root CA 의 개인키로 서명하여 발급

openssl x509 -req -days 1825 -extensions v3_user -in indienote.com.csr \
-CA indienote-rootca.crt -CAcreateserial \
-CAkey  indienote-rootca.key \
-out indienote.com.crt -extfile indienote.com.conf

4. 생성된 SSL 인증서 확인

openssl x509 -text -in indienote.com.crt

 

 

CSR 의 이상유무 확인

openssl req -text -in indienote.com.csr

반응형
Comments