사설 인증서가 있다면, 개발 환경에서 테스트하거나, 실제 내부망에 적용하여 서버, 클라이언트, 애플리케이션 간에 안전하고 신뢰할 수 있는 통신을 구현할 수 있습니다. OpenSSL을 사용하여 상위 인증서(Root CA)와 하위 인증서(Sub Certificate)를 만들어서 계층 구조의 인증서를 만드는 방법을 간단하게 정리해 보았습니다.
Root CA를 생성하기 위해서 처음 해야하는 작업은 바로 Root CA의 개인키를 생성하는 것입니다. 이 개인키는 Root CA의 신원을 보장함과 동시에 인증서를 생성하는 데 사용됩니다.
openssl genrsa -out rootca.key 2048
-aes256
플래그를 추가하면 AES 256bit로 암호화할 수 있습니다.
openssl rsa -in rootca.key -pubout -out rootca_public.key
만약 Root CA에 대한 공개키를 따로 추출하고 싶다면 위와 같은 명령어를 사용하시면 됩니다.
openssl rsa -text -in rootca.key -noout
rootca.key
가 제대로 생성되었는지 확인합니다.
CSR은 인증서에 포함될 정보와 공캐키를 담고 있는 파일입니다. CSR은 조직 정보, 도메인 이름 등의 정보가 포함되어 있으며, CSR을 기반으로 인증서를 생성하게 됩니다.
[ 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
keyUsage = keyCertSign, cRLSign
nsCertType = sslCA, emailCA, objCA
[ req_distinguished_name ]
countryName = Country Name
countryName_default = KR
countryName_min = 2
countryName_max = 2
organizationName = Organization Name
organizationName_default = gweowe Company
organizationalUnitName = Organizational Unit Name
organizationalUnitName_default = SE Team
commonName = Common Name
commonName_default = gweowe
commonName_max = 64
CSR을 생성하기 위한 설정 파일을 먼저 만들어야 합니다.
openssl req -new -key rootca.key -out rootca.csr -config rootca.conf
명령어를 입력합니다. 설정 파일을 참조하여 CSR을 생성하게 됩니다.
Country Name [KR]:
Organization Name [gweowe Company]:
Organizational Unit Name [SE Team]:
Common Name [gweowe]:
공란으로 Enter를 입력하면 default 값이 지정되며, 이 Output에서 각 옵션에 대해 직접 입력할 수도 있습니다.
개인키, 설정 파일, CSR을 이용하여 인증서를 생성합니다. 이 인증서는 Root CA의 공개키와 서명 등을 포함하고 있으며, Root CA의 개인키로 서명된 인증서는 신뢰할 수 있는 인증 기관의 역할을 수행합니다.
openssl x509 -req \
-days 365 \
-extensions v3_ca \
-set_serial 1 \
-in rootca.csr \
-signkey rootca.key \
-out rootca.crt \
-extfile rootca.conf
명령어를 입력합니다. 개인키, CSR, 설정 파일을 모두 사용하여 인증서를 생성합니다.
openssl x509 -text -in rootca.crt -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=KR, O=gweowe Company, OU=SE Team, CN=gweowe
Validity
Not Before: Jun 29 01:10:39 2023 GMT
Not After : Jun 28 01:10:39 2024 GMT
Subject: C=KR, O=gweowe Company, OU=SE Team, CN=gweowe
# ..............................생략..............................
Output을 살펴보면, 설정 파일에 입력되어 있는 정보들이 출력되는 것을 확인하실 수 있습니다.
인증서를 생성하는 방법은 Root CA와 매우 유사합니다. 우선 개인키를 생성해야 합니다.
openssl genrsa -out subcert.key 2048
-aes256
플래그를 추가하면 AES 256bit로 암호화할 수 있습니다.
openssl rsa -in subcert.key -pubout -out subcert_public.key
만약 Sub Certificate에 대한 공개키를 따로 추출하고 싶다면 위와 같은 명령어를 사용하시면 됩니다.
openssl rsa -text -in subcert.key -noout
subcert.key
가 제대로 생성되었는지 확인합니다.
[ req ]
default_bits = 2048
default_md = sha1
default_keyfile = rootca.key
distinguished_name = req_distinguished_name
extensions = v3_user
[ v3_user ]
basicConstraints = CA:FALSE
authorityKeyIdentifier = keyid,issuer
subjectKeyIdentifier = hash
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = gweowe.test-domain.com
DNS.2 = example.com
[ req_distinguished_name ]
countryName = Country Name
countryName_default = KR
countryName_min = 2
countryName_max = 2
organizationName = Organization Name
organizationName_default = gweowe Sub Company
organizationalUnitName = Organizational Unit Name
organizationalUnitName_default = DevOps Team
commonName = Common Name
commonName_default = Sub gweowe
commonName_max = 64
설정 파일의 [ alt_names ]
를 보면, gweowe.test-domain.com
은 DNS.1
에, example.com
은 DNS.2
에 지정되었습니다. 이러한 설정은 CSR 파일을 통해 다양한 Domain을 포함하는 단일 인증서를 생성할 수 있도록 합니다.
openssl req -new -key subcert.key -out subcert.csr -config subcert.conf
명령어를 입력합니다. 설정 파일을 참조하여 CSR을 생성하게 됩니다.
Country Name [KR]:
Organization Name [gweowe Company]:
Organizational Unit Name [SE Team]:
Common Name [gweowe]:
공란으로 Enter를 입력하면 default 값이 지정되며, 이 Output에서 각 옵션에 대해 직접 입력할 수도 있습니다.
openssl x509 -req \
-days 365 \
-extensions v3_user \
-CA rootca.crt \
-CAcreateserial \
-CAkey rootca.key \
-in subcert.csr \
-out subcert.crt \
-extfile subcert.conf
Root CA와 같은 방법으로 인증서를 생성합니다.
openssl x509 -text -in subcert.crt -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=KR, O=gweowe Company, OU=SE Team, CN=gweowe
Validity
Not Before: Jun 29 04:14:12 2023 GMT
Not After : Jun 28 04:14:12 2024 GMT
Subject: C=KR, O=gweowe Sub Company, OU=DevOps Team, CN=Sub gweowe
# ..............................생략..............................
Output을 살펴보면, Issuer
에는 Root CA의 정보가 출력되고, Subject
에는 Sub Certificate의 정보가 출력되는 것을 보실 수 있습니다.