x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
상황
Kubernetes 1.18.3 version 에서는 정상적으로 동작이 됐었는데
Kubernetes 1.19.2 version으로 업데이트 하고
Portieris 0.8.2 설치 후 적용하니
Pod 배포 시 아래와 같이 오류가 발생.
[오류 메세지]
Error from server (InternalError): error when creating "1_deployment.yaml": Internal error occurred: failed calling webhook "trust.hooks.securityenforcement.admission.cloud.ibm.com": Post "https://portieris.portieris.svc:443/admit?timeout=30s": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
원인
Kubernetes 1.19.2 update node 확인을 해보니
아래와 같은 사항이 있음
https://kubernetes.io/docs/setup/release/notes/ Kubernetes is now built with golang 1.15.0-rc.1. The deprecated, legacy behavior of treating the CommonName field on X.509 serving certificates as a host name when no Subject Alternative Names are present is now disabled by default. It can be temporarily re-enabled by adding the value x509ignoreCN=0 to the GODEBUG environment variable. (#93264, @justaugustus) [SIG API Machinery, Auth, CLI, Cloud Provider, Cluster Lifecycle, Instrumentation, Network, Node, Release, Scalability, Storage and Testing] |
기존에는 Wildcard 형식의 인증서도 사용가능했었지만
Kubernetes 1.19 versino 부터 golang 1.15.0-rc.1로 빌드되면서
인증서 사용 시 SAN(Subject Alternative Name)인증서를 사용해야함.
임시로 GODEBUG=x509ignoreCN=0 환경변수를 설정해서
Wildcard 인증서도 사용할 수 있지만 말 그대로 임시 대처법임.
해결책
인증서를 SAN형식으로 생성해줘야함.
SAN 인증서 생성 예제
SAN 인증서가 아닌 Wildcard 형식의 인증서의 경우 생성 부분이 아래와 같음.
해당 부분을 보아하니 default로 생성되던 인증서는 wildcard 형식의 인증서임.
cat > "$CERT_DIR"/server.conf << EOF
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, serverAuth EOF |
Wildcard 형식의 인증서를 SAN형식 인증서로 변경하기 위해
다음과 같이 변경해줌.
cat > "$CERT_DIR"/server.conf << EOF
[req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = v3_req [ req_distinguished_name ] countryName = KR localityName = Locality Name (eg, city) organizationName = IKSOON commonName = Portieris [ v3_req ] subjectAltName = @alt_names [alt_names] DNS.1 = portieris.portieris.svc DNS.2 = trust.hooks.securityenforcement.admission.cloud.ibm.com EOF |
위와 같이 SAN 형식 인증서를 사용해서 문제를 해결.
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!