인증서는 갱신됐는데 브라우저는 옛것을 보여줬다 · 인증서 한 장을 네 조각으로 읽는다 · 실습
인증서 한 장을 네 조각으로 읽는다
목표
자체 CA 로 서버 인증서를 발급하고, 사슬·유효기간·SAN·키 일치를 각각 openssl 로 검증합니다. 중간 CA 를 세워 fullchain 을 조립하고 이름 검사 결과를 표로 남깁니다.
왜 중요한가
인증서 장애는 넷 중 하나입니다 — 사슬이 끊겼거나, 만료됐거나, 이름이 다르거나, 키가 짝이 아니거나. 고치는 법이 전부 달라서 어느 것인지 먼저 읽어야 합니다. 이 실습은 그 네 가지를 고의로 만들고 검증기가 무엇이라고 말하는지 봅니다. 특히 OpenSSL 3.0 의 x509 -req 가 CSR 의 확장을 기본으로 버린다는 사실은 발급이 성공한 것처럼 보이는 함정이라 직접 겪어 두는 편이 낫습니다.
단계
1. /root/pki/ca.key 와 자기 서명 인증서 /root/pki/ca.crt 를 만드세요. 주체는 CN=Lab Root CA, 유효기간 30일입니다.
2. 서버 키 /root/pki/server.key 와 CSR /root/pki/server.csr 을 만드세요. 주체 CN=www.lab.internal, SAN 은 DNS:www.lab.internal 과 DNS:api.lab.internal 두 개입니다.
3. CA 로 서명해 /root/pki/server.crt 를 만드세요. 유효기간은 3일, SAN 이 인증서에 남아 있어야 합니다.
4. server.crt 의 일련번호·만료일·SHA-256 지문·SAN 을 /root/pki/04-fields.txt 에 저장하세요.
5. 비교용 키 /root/pki/other.key 를 하나 더 만들고, /root/pki/05-keymatch.txt 에 cert=·key=·other= 세 줄(각 공개키 PEM 의 sha256 64자리)과 verdict=match 를 적으세요.
6. /root/pki/06-expiry.txt 에 openssl x509 -enddate 의 출력 줄과 renew_within_7d=yes|no 를 적으세요. 판정은 -checkend 604800 의 종료 코드로 합니다.
7. 중간 CA(/root/pki/inter.key, /root/pki/inter.crt, CN=Lab Intermediate CA, CA:TRUE)를 루트로 서명해 만들고, 그 중간 CA 로 리프 /root/pki/api.crt(키 /root/pki/api.key, SAN DNS:api.lab.internal)를 발급하세요. 리프와 중간 CA 를 이 순서로 이어 /root/pki/fullchain.pem 을 만드세요.
8. server.crt 에 대해 www.lab.internal·api.lab.internal·other.lab.internal 세 이름의 검증 결과를 /root/pki/08-hostname.txt 에 이름=OK|FAIL 로 적으세요.
참고
- 키 생성:
openssl genrsa -out <파일> 2048. 자기 서명:openssl req -x509 -new -key ... -days ... -subj .... - CSR 에 SAN:
openssl req -new ... -addext "subjectAltName=DNS:a,DNS:b". 서명 때 확장 유지:openssl x509 -req ... -copy_extensions copy. - 중간 CA 에는
-extfile로basicConstraints=critical,CA:TRUE,pathlen:0과keyUsage=critical,keyCertSign,cRLSign을 주세요. - 이름 검사:
openssl verify -CAfile ca.crt -verify_hostname <이름> server.crt. - 흔한 실수: 3단계에서
-copy_extensions copy를 빠뜨리면 발급은 되는데 SAN 이 사라집니다. 7단계에서 리프를 루트로 직접 서명하면 사슬이 아닙니다.
단계 8개
- 루트 CA 만들기
- SAN 이 든 CSR
- 3일짜리 서버 인증서 발급
- 식별값 읽기
- 키가 짝인지 판정하기
- 7일 창으로 만료 판정
- 중간 CA 와 fullchain
- 이름 검사 표