LabHub
배우기 러닝패스 코스

The certificate was renewed, but the browser still showed the old one

Read one certificate in four pieces

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

자체 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.internalDNS: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.txtcert=·key=·other= 세 줄(각 공개키 PEM 의 sha256 64자리)과 verdict=match 를 적으세요.
  6. /root/pki/06-expiry.txtopenssl 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 로 적으세요.

참고

루트 CA 만들기

/root/pki/ca.key 와 자기 서명 /root/pki/ca.crt(CN=Lab Root CA, 30일)를 만드세요.

req 에 -x509 를 주면 CSR 대신 자기 서명 인증서가 나옵니다. 발급자와 주체가 같고 basicConstraints 가 CA:TRUE 인지 openssl x509 -text 로 확인하세요.

SAN 이 든 CSR

/root/pki/server.key/root/pki/server.csr(CN=www.lab.internal, SAN 두 개)을 만드세요.

-newkey rsa:2048 -nodes -keyout 으로 키와 CSR 을 한 번에 만들 수 있습니다. SAN 은 -addext 로 넣고 openssl req -in server.csr -noout -text 에서 Subject Alternative Name 을 확인하세요.

3일짜리 서버 인증서 발급

CA 로 서명해 /root/pki/server.crt(3일, SAN 유지)를 만드세요.

x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3 이 뼈대입니다. 발급 뒤 openssl x509 -in server.crt -noout -ext subjectAltName 이 비어 있으면 CSR 의 확장이 버려진 것입니다 — 그걸 옮기는 옵션이 있습니다.

식별값 읽기

server.crt 의 일련번호·만료일·SHA-256 지문·SAN 을 /root/pki/04-fields.txt 에 저장하세요.

x509 에 -serial -enddate -fingerprint -sha256 -ext subjectAltName 을 한꺼번에 줄 수 있습니다. 채점기는 같은 인증서에서 값을 다시 계산해 대조합니다.

키가 짝인지 판정하기

/root/pki/other.key 를 만들고 /root/pki/05-keymatch.txtcert=·key=·other=(공개키 PEM 의 sha256)와 verdict=match 를 적으세요.

인증서의 공개키는 x509 -pubkey, 개인키의 공개키는 pkey -pubout 으로 같은 PEM 형식이 나옵니다. | sha256sum | cut -d' ' -f1 으로 64자리만 남기세요. cert 와 key 가 같고 other 만 달라야 합니다.

7일 창으로 만료 판정

/root/pki/06-expiry.txt-enddate 출력 줄과 renew_within_7d=yes|no 를 적으세요.

-checkend 604800 은 7일(604800초) 안에 만료되면 0 이 아닌 코드로 끝납니다. if 문으로 받아 yes/no 를 정하세요. 3일짜리 인증서라면 답은 정해져 있습니다.

중간 CA 와 fullchain

루트가 서명한 중간 CA(inter.key/inter.crt, CN=Lab Intermediate CA, CA:TRUE)를 만들고, 그것으로 리프 api.crt(SAN api.lab.internal)를 발급한 뒤 리프+중간 순서로 /root/pki/fullchain.pem 을 만드세요.

중간 CA 의 CSR 을 루트로 서명할 때 -extfile 에 basicConstraints=critical,CA:TRUE,pathlen:0 과 keyUsage=critical,keyCertSign,cRLSign 을 주세요. 리프는 -CA inter.crt -CAkey inter.key 로 서명합니다. openssl verify -CAfile ca.crt api.crt 는 실패하고 -untrusted inter.crt 를 주면 통과해야 진짜 사슬입니다.

이름 검사 표

server.crt 에 대해 www·api·other 세 이름의 -verify_hostname 결과를 /root/pki/08-hostname.txt이름=OK|FAIL 로 적으세요.

이름 검사는 SAN 의 dNSName 과 대조합니다. CN 에 있어도 SAN 에 없으면 실패합니다. 세 이름을 for 로 돌리며 종료 코드로 OK/FAIL 을 정하세요.