Kubernetes에 keycloak , Spinnaker 설치 후 sso 연동 keycloak 서비스를 사설 인증서로 설치 시 Spinnaker 서비스들 중 gate서비스에서 아래와 같이 오류 메시지를 볼수 있습니다.
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.
SunCertPathBuilderException: unable to find valid certification path to requested target
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) ~[na:na]
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:353) ~[na:na]
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:296) ~[na:na]
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:291) ~[na:na]
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1357) ~[na:na]
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1232) ~[na:na]
at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1175) ~[na:na]
at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) ~[na:na]
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443) ~[na:na]
at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) ~[na:na]
at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:183) ~[na:na]
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172) ~[na:na]
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1506) ~[na:na]
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1416) ~[na:na]
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:456) ~[na:na]
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:427) ~[na:na]
at java.base/sun.net. www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:572) ~[na:na]
at java.base/sun.net. www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:201) ~[na:na]
at java.base/sun.net. www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:168) ~[na:na]
at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:76) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:737) ~[spring-web-5.2.15.RELEASE.jar:5.2.15.RELEASE]
... 82 common frames omitted
해결방안은 아래와 같이 2가지 방안이 있습니다.
1. gate 서비스에 사설 인증서를 추가하여 서비스를 재 구동 시키는 방법
2. keycloak 서비스를 공인 인증서를 사용하여 설치하는 방법
2번 방안으로 할 경우 공인 인증서를 구매해야 하는 경우가 발생하게 됩니다.

그러므로, 1번 해결 방안으로 gate 서비스를 재 구성을 해야 합니다.

우선, keycloak 서비스를 구축 시 사용한 사설 인증서를 crt 파일로 추출해야 합니다. kubectl 명령어를 사용하여 추출하는 방법이 있는데, 아래 처럼 명령어를 사용하여 추출하면 됩니다.
kubectl get secrets certificate -o jsonpath='{.data.tls\.crt}' | base64 -d >> certificate.crt
생성된 certificate.crt 파일을 gate 서비스에 추가를 해야 하는데, 기본 도커 이미지를 사용하여 Dockerfile를 생성합니다.
Dockerfile에서 certificate.crt 파일을 keytool으로 자바 인증서를 교체하면 됩니다.
FROM registry.com/spinnaker-community/docker/gate:6.57.1
USER root
ARG CRTFILE=target/your_ca_root.crt
COPY ${CRTFILE} /tmp
RUN keytool -importcert -noprompt -keystore /etc/ssl/certs/java/cacerts -storepass changeit -file /tmp/${CRTFILE} -alias "private-domain“
USER spinnaker
Dockerfile 파일을 이용하여 새로운 버전으로 도커 이미지를 생성하면 됩니다. 도커이미지를 생성하는 쉘 스크립트를 작성하여 쉘 스크립트 파일을 실행하게 되면 편리하게 도커이미지를 생성할 수 있습니다.
docker build --no-cache -f Dockerfile --build-arg CRTFILE="./certificate.crt" -t registry.com/spinnaker-community/docker/gate:6.57.2 .
생성된 도커 이미지를 이용하여 spinnaker를 재 구축하게 되면 위의 오류가 사라지는 것을 확인 할 수 있습니다.