問題
Prong項(xiàng)目的git倉庫使用的是gogs,gogs配置自簽名的ssl證書。spring cloud config的bootstrap.yml相關(guān)配置如下:
spring:
application:
name: prong-cloud-config
cloud:
config:
server:
git:
uri: https://xxx/prong/prong-config
username: prong-config
password: xxx
clone-on-start: true
在eclipse啟動(dòng)prong-cloud-config服務(wù)正常,但在docker中運(yùn)行時(shí)報(bào)錯(cuò),關(guān)鍵的錯(cuò)誤信息:
Caused by: org.eclipse.jgit.api.errors.TransportException: https://xxx/prong/prong-config: cannot open git-upload-pack
...
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
分析問題
通過 java 執(zhí)行 https 請(qǐng)求時(shí)使用特定的數(shù)據(jù)識(shí)別 Certificate Authorities(CA),如果你試圖發(fā)起的 SSL/TLS 連接使用不屬于這些根證書機(jī)構(gòu)所頒發(fā)的證書,就會(huì)拋出該錯(cuò)誤:
SunCertPathBuilderException: unable to find valid certification path to requested target
因此,如果你使用自簽名證書,或者根證書機(jī)構(gòu)不在 JRE 默認(rèn)信任列表中,則需要向 JRE 導(dǎo)入根證書。
解決問題
1、獲取gogs的自簽名證書cert.pem
,放入prong-cloud-config
工程目錄并重命名為gogs-cert.pem
2、Dockerfile中增加ADD gogs-cert.pem gogs-cert.pem
FROM prong/openjdk:8-jdk-alpine
ADD entrypoint.sh entrypoint.sh
RUN chmod +x entrypoint.sh
ADD ${PWD}/target/dependency/ /dependency
ARG JAR_FILE
ADD ${PWD}/target/${JAR_FILE} app.jar
RUN sh -c 'touch /app.jar'
ADD gogs-cert.pem gogs-cert.pem
ENTRYPOINT ["/bin/bash","-c"]
CMD ["/entrypoint.sh"]
3、entrypoint.sh中增加keytool -importcert ...
#!/bin/sh
keytool -importcert -alias startssl -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -file gogs-cert.pem -noprompt
echo SPRING_CLOUD_CONFIG_PROFILE=$SPRING_CLOUD_CONFIG_PROFILE
java $JAVA_OPTS -Dapp.alias=${APP_ALIAS} -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE} -Dspring.cloud.config.profile=${SPRING_CLOUD_CONFIG_PROFILE} -Dloader.path="/dependency" -jar /app.jar
注意,-noprompt
參數(shù)的作用是導(dǎo)入證書時(shí)不進(jìn)行人工交互提示,否則會(huì)docker容器中導(dǎo)入證書時(shí)報(bào)錯(cuò):
keytool error: java.lang.NullPointerException
4、重新構(gòu)建prong-cloud-config
服務(wù)的鏡像并運(yùn)行,問題解決。