KJH
Nginx Ingress Controller OCSP 설정 본문
OCSP (Online Certificate Status Protocol) 는 이 인증서가 지금 유효한지 실시간으로 확인하는 프로토콜이다
기존엔 CRL (Certificate Revocation List) 라는 방식으로 "폐기된 인증서 목록"을 통째로 내려받아서 확인했는데
"통째로"이니 파일 크기가 커서 느리고, 실시간성은 부족했다.
그래서 나온게 OCSP이고 인증서 하나하나에 대해 "지금 유효하냐?"고 물어보는 방식이다.
OCSP Stapling라는 방식이 있다.
OCSP를 매번 클라이언트가 직접 Certificate Authority(인증기관)에 물어보면 느리니까, 서버가 미리 OCSP 응답을 받아서 클라이언트에게 주는 방식이다.
워크플로우
- 클라이언트는 대상 도메인의 DNS를 쿼리합니다.
- 클라이언트는 대상 IP를 수신합니다.
- 클라이언트는 타겟과 TCP 연결을 엽니다.
- 클라이언트는 대상 TLS 인증서를 받습니다.
- 클라이언트는 인증서에 나열된 OCSP 도메인에 대해 DNS를 쿼리합니다.
- 클라이언트는 프록시 IP를 받습니다.
- 클라이언트가 OCSP 쿼리를 프록시로 보냅니다.
- 프록시는 OCSP 응답자에게 쿼리를 전달합니다.
- 응답자는 인증서 상태를 프록시에 반환합니다.
- 프록시는 인증서 상태를 클라이언트에 전달합니다.
- 인증서가 유효하면 클라이언트가 TLS 핸드셰이크를 시작합니다.
클라이언트 측 OCSP
- 클라이언트는 서버와 핸드TLS셰이크를 시작하는 ClientHello 메시지를 보냅니다.
- 서버는 메시지를 수신하고 ServerHello 메시지로 응답합니다. 서버는 또한 서버 인증서를 클라이언트로 전송합니다.
- 클라이언트는 서버 인증서를 검증하고 서버 인증서 OCSP URI에서 추출합니다.
- 클라이언트는 OCSP 응답자에게 인증서 해지 확인 요청을 보냅니다.
- OCSP 응답자가 OCSP 응답을 보냅니다.
- 클라이언트는 OCSP 응답에서 인증서 상태를 검증합니다.
- TLS 핸드셰이크가 완료되었습니다.
서버 측 OCSP
- 클라이언트는 서버와 핸드TLS셰이크를 시작하는 ClientHello 메시지를 보냅니다.
- 서버는 메시지를 수신하고 캐시된 최신 OCSP 응답을 가져옵니다. 캐시된 응답이 누락되거나 만료된 경우 서버는 OCSP 응답자에게 인증서 상태를 호출합니다.
- OCSP 응답기가 서버에 OCSP 응답을 보냅니다.
- 서버가 ServerHello 메시지를 보냅니다. 또한 서버는 서버 인증서와 인증서 상태를 클라이언트로 전송합니다.
- 클라이언트가 OCSP 인증서 상태를 확인합니다.
- TLS 핸드셰이크가 완료되었습니다.
적용 과정
도메인을 타겟으로 OCSP 적용 유무를 확인해보자
결과 : OCSP 응답 오지 않음
$ openssl s_client -connect xxx.xxxx.com:443 -status
| grep OCSP
---
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Thawte TLS RSA CA G1
verify return:1
OCSP response: no response sent
인증서 자체에 OCSP가 없나?
결과 : 있네?
$ openssl x509 -in xxx.crt -noout -text | grep -A 5 'Authority Information Access'
---
Authority Information Access:
OCSP - URI:http://status.thawte.com
CA Issuers - URI:http://cacerts.thawte.com/ThawteTLSRSACAG1.crt
X509v3 Basic Constraints: critical
CA:FALSE
CT Precertificate SCTs:
인증서가 유효한지 CA에 요청!
결과 : 응답 받음
$ openssl ocsp \
-issuer DigiCertCA.crt \
-cert xxx.crt \
-url http://ocsp.digicert.com \
-resp_text -noverify
---
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Responder Id: xxx
xxx.crt: good
This Update: Apr 9 10:15:01 2025 GMT
Next Update: Apr 16 09:15:01 2025 GMT
nginx에 OCSP를 활성화 하자!
nginx에 넣을 CA 인증서 secret으로 추가
crt → 서버 인증서
key → 비밀 key, Private Key
pem → 중간 인증서, Intermediate Certificate
kubectl create secret generic xxx-ssl \
--from-file=server.crt=server.crt \
--from-file=server.key=server.key \
--from-file=ca-certs.pem=ca-certs.pem \
-n ingress-internal-nginx
---
secret/xxx-ssl created
secret을 nginx volume으로 마운트
volumeMounts:
- name: ssl-certs
mountPath: /etc/nginx/ssl/server.crt
subPath: server.crt
- name: ssl-certs
mountPath: /etc/nginx/ssl/server.key
subPath: server.key
- name: ssl-certs
mountPath: /etc/ssl/private/ca-certs.pem
subPath: ca-certs.pem
volumes:
- name: ssl-certs
secret:
secretName: xxx-ssl
nginx에 ocsp 활성화
apiVersion: v1
data:
enable-ocsp: 'true'
도메인 별 stapling 활성화
nginx.ingress.kubernetes.io/server-snippet: |
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/private/ca-certs.pem;
resolver_timeout 5s;
적용 완료!
$ openssl s_client -connect xxx.xxx.com:443 -status | grep OCSP
---
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root G2
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = Thawte TLS RSA CA G1
verify return:1
verify return:1
OCSP response:
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
※ Cloudflare를 통하면 자동 OCSP 활성화 해줌
※ OCSP이 담긴 패킷
'DevOps' 카테고리의 다른 글
Github 특정 Tag를 Fork하기 (0) | 2025.04.16 |
---|---|
Terraform GitOps(/w Atlantis) (0) | 2025.04.13 |
Docker Compose Active-Standby 구성 (w/ nginx) (0) | 2025.03.14 |
Azure Virtual Network Peering (0) | 2025.01.14 |
std in, out, error (0) | 2024.11.19 |