본문으로 건너뛰기

실무 — OpenSSL과 인증서 운영

이론을 실제 명령·운영으로 연결합니다. (아래 명령은 본인 소유 서버·도메인의 인증서를 관리하기 위한 표준 작업입니다.)

I. 키와 CSR 생성​

# 1) 개인키 생성 (ECC 권장: P-256)
openssl ecparam -genkey -name prime256v1 -out server.key
# (RSA를 쓰면) openssl genrsa -out server.key 2048

# 2) CSR 생성 (공개키 + 신원). SAN 포함이 중요
openssl req -new -key server.key -out server.csr \
-subj "/C=KR/O=SecureNomad/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
  • 개인키 server.key는 서버 밖으로 내보내지 않음
  • CSR을 CA(또는 ACME)에 제출 → 인증서 수령

II. 인증서 내용 확인·디버깅​

# 인증서 상세 보기 (Subject/Issuer/SAN/유효기간/확장)
openssl x509 -in server.crt -noout -text

# 유효기간만
openssl x509 -in server.crt -noout -dates

# SAN만 확인
openssl x509 -in server.crt -noout -ext subjectAltName

# 키와 인증서가 짝이 맞는지(모듈러스/공개키 해시 비교)
openssl pkey -in server.key -pubout -outform der | openssl sha256
openssl x509 -in server.crt -pubkey -noout -outform der | openssl sha256
# 두 해시가 같으면 짝이 맞음

서버에 실제 적용된 체인 점검 (원격)​

# 핸드셰이크·제시된 체인·만료 확인
openssl s_client -connect example.com:443 -servername example.com -showcerts

# 만료일만 빠르게
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates

:::tip 가장 흔한 사고 — 중간 CA 누락 s_client 결과에 Intermediate가 안 보이면 체인 불완전입니다. 일부 클라이언트(모바일·구형)에서만 오류가 나 재현이 까다롭습니다. 풀체인(fullchain)으로 배포하세요. (03. 신뢰 체인) :::

III. 형식 변환​

# PEM → PKCS#12(.pfx) (인증서+키+체인 묶음, Windows/IIS 등)
openssl pkcs12 -export -out bundle.pfx \
-inkey server.key -in server.crt -certfile chain.crt

# PKCS#12(.pfx) → PEM
openssl pkcs12 -in bundle.pfx -nodes -out all.pem

# DER ↔ PEM
openssl x509 -in cert.der -inform der -out cert.pem -outform pem

IV. 풀체인 배포​

fullchain.pem = [ Leaf 인증서 ]
[ Intermediate 인증서 ] ← 반드시 포함
(Root는 보통 생략 — 클라이언트 트러스트 스토어에 이미 있음)
  • Nginx: ssl_certificate fullchain.pem; ssl_certificate_key server.key;
  • 순서 주의: Leaf가 먼저, 그 다음 Intermediate

V. 만료 모니터링 (자동화)​

짧아진 수명 때문에 만료 감시는 필수입니다.

# 만료까지 남은 일수 체크 (크론/모니터링에 연결)
exp=$(echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -enddate | cut -d= -f2)
echo "만료: $exp"
# -checkend: 30일 내 만료면 종료코드 1
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -checkend 2592000 && echo "30일 이상 여유" || echo "⚠ 30일 내 만료"
  • 실무: Prometheus blackbox exporter, Uptime 모니터, 클라우드 인증서 관리자의 만료 알림 활용
  • 가능하면 ACME 자동 갱신으로 수작업 자체를 없애기 (05. 수명주기)

VI. 사내 CA(Private CA) — 개념​

내부 서비스·mTLS용으로 사설 CA를 운영하기도 합니다.

# (개념) 사내 Root CA 생성
openssl req -x509 -newkey rsa:4096 -days 3650 -nodes \
-keyout rootCA.key -out rootCA.crt -subj "/O=SecureNomad Internal/CN=SecureNomad Root CA"
  • 사내 Root를 직원 기기 트러스트 스토어에 배포해야 신뢰됨(그룹정책/MDM)
  • 용도: 내부망 HTTPS, 서비스 간 mTLS(04), 테스트 환경
  • 운영엔 전용 도구(step-ca, HashiCorp Vault PKI, EJBCA 등) 권장

VII. 보안 체크리스트​

  • 개인키 권한 최소화(chmod 600), 서버 밖 유출 금지
  • 키 길이·알고리즘 적정(ECC P-256 / RSA 2048 이상)
  • 풀체인 배포(중간 CA 포함)
  • TLS 1.2+ 만 허용, 취약 암호군 비활성화
  • OCSP Stapling 활성화
  • 만료 모니터링·자동 갱신
  • CT 로그로 자사 도메인 미승인 발급 감시

VIII. 결론​

실무의 핵심은 키 보호 · 풀체인 배포 · 자동 갱신 · 만료 감시입니다. OpenSSL로 생성·검증·변환을 다루되, 운영은 ACME·관리형 서비스로 자동화하는 것이 짧아진 인증서 수명 시대의 정답입니다.