인증서는 갱신됐는데 브라우저는 옛것을 보여줬다 · 디스크는 새것, 서버는 옛것 · 실습
갱신됐는데 옛 인증서가 나간다
목표
인증서를 기동 때 한 번만 읽는 HTTPS 서버에 대해 갱신 사고를 재현하고, 디스크가 아니라 서버가 내보내는 인증서를 감시하는 스크립트 두 개를 만듭니다.
왜 중요한가
갱신 도구는 파일을 바꾸고 서버는 메모리를 내보냅니다. 그 사이에 재기동이 없으면 "갱신 성공" 로그와 "만료 임박" 경고가 동시에 참이 됩니다. 재료 서버 /opt/app/tlsserve.py 는 load_cert_chain 을 딱 한 번 부르는 파이썬 HTTPS 서버로, 실제 서버 대부분이 그렇듯 파일이 바뀌어도 다시 읽지 않습니다. 이 실습의 감시 스크립트는 채점기가 따로 띄운 서버로 양방향(같은 파일 FRESH, 다른 파일 STALE) 검사를 받습니다.
단계
1. /root/renew/ca.key·/root/renew/ca.crt(CN=Lab Root CA)와 /root/renew/server.key, 그리고 CA 가 서명한 3일짜리 /root/renew/v1.crt(SAN DNS:www.lab.internal)를 만드세요.
2. v1.crt 를 /root/renew/live.crt 로, server.key 를 /root/renew/live.key 로 복사한 뒤 python3 /opt/app/tlsserve.py --cert /root/renew/live.crt --key /root/renew/live.key --port 8443 을 띄우세요. openssl s_client 로 받은 인증서의 serial= 줄을 /root/renew/02-served.txt 에 저장하세요.
3. 같은 키로 30일짜리 /root/renew/v2.crt 를 발급하고 live.crt 에 덮어쓰세요(갱신 도구가 하는 일). 서버는 재기동하지 마세요.
4. 다시 s_client 로 serial= 을 /root/renew/04-served.txt 에, curl -sk https://127.0.0.1:8443/ 의 본문을 /root/renew/04-body.txt 에 저장하세요. 디스크는 v2 인데 서버는 v1 이어야 합니다.
5. /root/renew/certdiff.sh <인증서파일> <host:port> 를 만드세요. 디스크 파일과 서버가 내보내는 인증서의 SHA-256 지문이 같으면 FRESH 를 출력하고 0, 다르면 STALE 을 출력하고 1 로 끝나야 합니다. live.crt 와 127.0.0.1:8443 에 대해 돌린 출력을 /root/renew/05-detect.txt 에 저장하세요.
6. 서버를 끝내고 다시 띄운 뒤 s_client 의 serial= 을 /root/renew/06-served.txt 에 저장하세요.
7. /root/renew/servedcheck.sh <host:port> <초> 를 만드세요. 서버가 내보내는 인증서가 그 초 안에 만료되면 EXPIRING 을 출력하고 1, 아니면 OK 를 출력하고 0 으로 끝나야 합니다. 127.0.0.1:8443 604800 으로 돌린 출력을 /root/renew/07-monitor.txt 에 저장하세요.
8. /root/renew/08-report.md 에 v1·v2 의 일련번호, 서버가 새 파일을 읽게 만든 방법, 감시는 디스크가 아니라 서버가 내보내는 인증서를 봐야 하는 이유를 적으세요.
참고
- s_client 는 표준 입력을 기다리므로
echo | openssl s_client -connect 127.0.0.1:8443 -servername www.lab.internal 2>/dev/null | openssl x509 -noout -serial처럼 씁니다. - 서버 끝내기:
pkill -f tlsserve.py. 다시 띄울 때는nohup ... &로 뒤에 두세요. - 스크립트 안에서 받은 인증서를 파일로 잠시 저장하려면
openssl x509 -out <임시파일>로 받으면 됩니다. - 흔한 실수: 4단계 전에 서버를 재기동하면 사고가 사라집니다. 7단계의 감시 스크립트가 디스크 파일을 보면 채점기의 서버에서 떨어집니다.
단계 8개
- CA 와 3일짜리 v1
- 서버가 든 인증서 읽기
- 갱신 — 파일을 덮어쓴다
- 디스크는 v2, 서버는 v1
- 디스크와 서버를 비교하는 스크립트
- 재기동 — 서버가 새 파일을 읽는다
- 서버가 내보내는 인증서의 만료 감시
- 사고 보고서