起因
上周在生產環境部署時,把安全證書加到k8s-ingress中時發現報該錯誤
解決
- 找網上解決方案,因為這種問題相對比較少見,也沒百度,直接谷歌,找到解決方案如下:https://stackoverflow.com/questions/9619030/resolving-javax-net-ssl-sslhandshakeexception-sun-security-validator-validatore
- 查看:%JAVA_HOME%\lib\security\cacerts
- 查看證書相關列表:keytool -list -keystore “%JAVA_HOME%/jre/lib/security/cacerts”
- 如果沒有證書,將證書導入環境中:keytool -import -noprompt -trustcacerts -alias -file -keystore -storepass
windows環境,本機測試是可行的,但搬到開發環境,開啟測試時也沒報錯,再將應用容器化時,如法炮制,發現並不能正常運行,通樣會報PKIX path building failed的錯誤。
檢查各項配置,與宿主機系統,本機windows環境一致,但依舊未能跑通。
后來求助上級,唯一不同點是將域名的映射加入到hosts文件中,才發現在本機和開發環境都提前配置好了hosts,所以沒發現這個錯誤,並且java所報的異常跟剛開始未加入java ca授信列表時所報的異常一樣,所以一度懷疑是jre問題(雖然基本不可能)。
結果
將ca證書文件依次加入容器,加入java授信列表,重新生成鏡像,最后在docker容器內運行正常沒報錯。但還有一點,docker的hosts文件時run之后才動態生成,不能提前預設(內部包括容器名稱地址映射,集群dns映射等),但考慮到生產環境部署在k8s,k8s能動態注入hosts,調整dns策略等,所以dns問題解決相對輕松。
參考
很全的一篇講解關於https與java中調用原理與實現的文章:http://www.aneasystone.com/archives/2016/04/java-and-https.html
