사내 CA에서 받은 pfx 인증서를 Kubernetes TLS Secret에 넣으려면 인증서와 개인키를 따로 꺼내야 한다. openssl 추출 명령, Git Bash에서 비밀번호 입력이 멈출 때 해결법, 넣기 전 검증 방법을 정리했다.
이 글의 순서
받은 파일과 넣어야 할 값
사내 CA에 서버 인증서를 신청하면 압축 파일 하나가 온다. 안에는 보통 두 파일이 있다.
| 파일 | 들어 있는 것 | TLS Secret에 쓰나 |
|---|---|---|
.pfx | 서버 인증서, 중간 인증서, 개인키 (비밀번호로 보호) | 사용 |
.p7b | 인증서 체인만. 개인키 없음 | 미사용 |
Kubernetes TLS Secret은 인증서(tls.crt)와 개인키(tls.key)를 PEM 형식으로 따로 받는다. pfx는 둘을 한 파일에 암호화해 묶은 것이니 openssl로 꺼내면 된다.
신청할 때용도는 서버 인증으로 신청한다. 사용자 인증은 SSO가, 외부 연동은 토큰이 맡는다면 클라이언트 인증서는 필요 없다. SAN(Subject Alternative Name)에는 도메인을 넣고, 사내 정책에 따라 클러스터 진입 IP를 함께 넣기도 한다.
추출 명령
# 1) 인증서 + 중간 인증서 (개인키 제외) openssl pkcs12 -in server.pfx -nokeys -out tls.crt -passin pass:'PFX비밀번호' # 2) 개인키 (암호 없는 PEM으로) openssl pkcs12 -in server.pfx -nocerts -nodes -out tls.key -passin pass:'PFX비밀번호'
-nodes는 꺼낸 개인키를 다시 암호화하지 말라는 옵션이다. Kubernetes는 암호화된 개인키를 읽지 못한다.
Git Bash에서 비밀번호 입력이 멈출 때
Windows의 Git Bash에서 -passin 없이 실행하면 Enter Import Password: 안내가 뜨지 않고 그냥 멈춘다. Git Bash 터미널(mintty)이 Windows용 프로그램의 대화형 입력을 제대로 넘겨주지 못해서 생기는 현상이다. 방법은 세 가지다.
openssl pkcs12 -in server.pfx -nokeys -out tls.crt -passin pass:'PFX비밀번호'
가장 간단하다. 다만 비밀번호가 셸 히스토리에 남으니 작업 후 history -c로 지운다.
read -s -p "PFX 비밀번호: " PFX_PASS; echo; export PFX_PASS openssl pkcs12 -in server.pfx -nokeys -out tls.crt -passin env:PFX_PASS openssl pkcs12 -in server.pfx -nocerts -nodes -out tls.key -passin env:PFX_PASS unset PFX_PASS
비밀번호가 히스토리에 남지 않는다.
winpty openssl pkcs12 -in server.pfx -nokeys -out tls.crt
winpty가 입력을 중계해서 안내 문구가 정상적으로 뜬다.
OpenSSL 3오래된 방식으로 암호화된 pfx는 OpenSSL 3에서 unsupported 오류가 날 수 있다. 이때는 명령 끝에 -legacy를 붙인다.
넣기 전에 검증하기
꺼낸 파일에는 PEM 블록 앞에 Bag Attributes 같은 설명 줄이 붙어 있다. 대부분의 도구는 무시하지만, 플랫폼 화면의 입력칸에 붙여넣을 때는 PEM 블록만 남기는 게 안전하다.
# PEM 블록만 남기기 sed -n '/-----BEGIN/,/-----END/p' tls.crt > tls.clean.crt openssl pkey -in tls.key -out tls.clean.key # 인증서 정보 확인: 도메인, 발급자, 만료일 openssl x509 -in tls.clean.crt -noout -subject -issuer -enddate openssl x509 -in tls.clean.crt -noout -ext subjectAltName # 인증서와 개인키가 짝인지 확인: 두 값이 같아야 한다 openssl x509 -noout -modulus -in tls.clean.crt | openssl md5 openssl rsa -noout -modulus -in tls.clean.key | openssl md5
짝 확인은 파일의 첫 번째 인증서 기준이다. 첫 블록이 서버 인증서인지 subject로 함께 확인한다.
Secret 만들고 Ingress에 연결하기
플랫폼 화면에서 만든다면 Public Key 칸에 tls.crt의 BEGIN CERTIFICATE 블록을 중간 인증서까지 전부 넣고, Private Key 칸에는 BEGIN PRIVATE KEY부터 END PRIVATE KEY까지만 넣는다. 중간 인증서를 빼면 일부 브라우저와 클라이언트에서 신뢰 경고가 뜬다.
kubectl create secret tls my-service-tls \ --cert=tls.clean.crt --key=tls.clean.key -n my-namespace
spec:
tls:
- hosts:
- service.example.com
secretName: my-service-tls
rules:
- host: service.example.comSecret을 만든 뒤 Ingress의 TLS 설정에서 선택하고 다시 배포하면 https가 적용된다.
체크리스트
정리
- TLS Secret에는 pfx에서 꺼낸 인증서와 개인키 두 개만 있으면 된다.
- Git Bash에서 openssl이 멈추면 비밀번호를 명령이나 환경변수로 넘기거나 winpty를 쓴다.
- 넣기 전에 도메인, 만료일, 키 짝을 확인한다.
- 작업이 끝나면 개인키 파일과 비밀번호 흔적을 지운다.