OpenSSL 로 사설 root CA 를 만들고, 그 CA 로 서버 인증서를 발급하는 절차다. 내부망 서비스 · 실습 환경처럼 공인 CA 를 쓸 수 없거나 쓸 필요가 없을 때 쓴다. 발급한 서버 인증서를 클라이언트가 믿게 하려면 root CA 인증서(ca.crt)를 각 클라이언트의 신뢰 목록에 등록해야 한다.
서명 해시는 sha256 을 쓴다. RHEL 9 이상은 SHA-1 서명을 거부한다 — RHEL9 이상 invalid digest.
ca.key 는 CA 의 비밀이므로 발급 작업이 끝나면 오프라인 보관한다.루트 CA 인증서는 CA 가 자기 키로 자기 자신을 서명한(self-signed) 인증서다. 아래에서 발급하는 모든 인증서는 이 root CA 로 이어지는 체인 위에 놓인다.
openssl genrsa -aes256 -out ca.key 4096
비밀번호를 물어본다. CA 키는 반드시 비밀번호로 보호한다.
[ req ]
default_bits = 4096
default_md = sha256
default_keyfile = ca.key
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
prompt = no
[ v3_ca ]
basicConstraints = critical, CA:TRUE, pathlen:0
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, keyCertSign, cRLSign
[ req_distinguished_name ]
countryName = KR
organizationName = HaeDong Inc.
commonName = HaeDong Root CA
prompt = no 를 두면 위 값이 그대로 들어가고 대화형 입력을 하지 않는다. 대화형으로 입력하고 싶으면 prompt 줄을 빼고 countryName_default 식으로 기본값을 적는다.
요청서(CSR)를 거치지 않고 한 번에 자체 서명 인증서를 만든다. 유효기간은 10년(3650일)으로 둔다.
openssl req -x509 -new -key ca.key -sha256 -days 3650 -config ca.conf -out ca.crt
openssl x509 -noout -text -in ca.crt
# Signature Algorithm: sha256WithRSAEncryption
# X509v3 Basic Constraints: critical CA:TRUE, pathlen:0
서버 키는 서비스가 기동할 때마다 읽으므로 보통 비밀번호를 걸지 않는다.
openssl genrsa -out haedongg.net.key 2048
이미 비밀번호가 걸린 키가 있으면 인증서 변환 의 방법으로 푼다.
[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = haedongg.net
DNS.2 = *.haedongg.net
DNS.3 = *.was.haedongg.net
IP.1 = 192.168.0.10
[ req_distinguished_name ]
countryName = KR
organizationName = haedong Inc.
organizationalUnitName = haedong SSL Project
commonName = haedongg.net
commonName 이 아니라 subjectAltName 으로 호스트를 대조한다. 서비스할 호스트명과 IP 를 모두 alt_names 에 적는다.IP.n 에는 실제 IP 하나를 적는다. 와일드카드는 DNS 항목에만 쓸 수 있다.openssl req -new -key haedongg.net.key -config haedongg.net.conf -out haedongg.net.csr
openssl req -noout -text -in haedongg.net.csr | grep -A1 "Subject Alternative Name"
공인 CA 와 브라우저는 서버 인증서 유효기간을 200일 이하로 제한한다[2]. 2026-03-15 부터 적용된 값이고, 2027-03-15 에 100일, 2029-03-15 에 47일로 더 줄어든다. 사설 CA 는 강제되지 않지만 같은 기준으로 맞춰 두면 나중에 공인 인증서로 바꿀 때 문제가 없다. 유효기간이 짧아진 만큼 갱신은 자동화해 둔다.
openssl x509 -req -days 200 -sha256 \
-in haedongg.net.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-extfile haedongg.net.conf -extensions v3_req \
-out haedongg.net.crt
-CAcreateserial 은 ca.srl 을 만들어 일련번호를 관리한다. 두 번째 발급부터는 이 파일이 있으므로 그대로 두면 된다.
openssl x509 -noout -text -in haedongg.net.crt
openssl verify -CAfile ca.crt haedongg.net.crt
# haedongg.net.crt: OK
RHEL 계열의 관례 위치다. 서비스마다 설정에서 경로를 지정하므로 위치 자체는 자유다.
cp haedongg.net.crt /etc/pki/tls/certs/
cp haedongg.net.key /etc/pki/tls/private/
chmod 600 /etc/pki/tls/private/haedongg.net.key
서버 인증서와 함께 CA 인증서를 이어 붙인 체인 파일이 필요한 서비스(nginx 등)는 다음처럼 만든다.
cat haedongg.net.crt ca.crt > haedongg.net.fullchain.crt
PKCS#12 · Java KeyStore 로 바꿔야 하면 인증서 변환 을 본다.
OpenSSL 최신 4.0.2, LTS 3.5.8 — 2026-09-20 확인. https://openssl-library.org/source/ · openssl-req(1) https://docs.openssl.org/master/man1/openssl-req/ · openssl-x509(1) https://docs.openssl.org/master/man1/openssl-x509/ ↩︎
CA/Browser Forum Baseline Requirements §6.3.2 · §1.2.2 Relevant Dates — Subscriber Certificate 최대 유효기간 2026-03-15 200일 · 2027-03-15 100일 · 2029-03-15 47일. 2026-09-20 확인. https://cabforum.org/working-groups/server/baseline-requirements/requirements/ ↩︎