從頭解決PKIX path building failed的問題
本篇涉及到PKIX path building failed的緣由和解決辦法(包括暫時解決和長效解決的方法),也包括HTTP和HTTPS的區別。java
PKIX path building failed 通俗講解。
通俗的講,PKIX path building failed 出現的緣由是由於本身的Java環境沒有相關網站的證書而致使的。算法
PKIX path building failed 具體內容。
PKIX的全稱爲Public-Key Infrastructure (X.509),經過wiki百科咱們能夠知道X.509是一種證書的標準,這種標準用在不少網絡協議,好比TLS/SSL。而TLS/SSL是HTTPS協議的標準(HTTPS比HTTP多的部分就在於TLS/SSL),因此本文章咱們掌握TLS/SSL的知識。小程序
TLS/SSL協議詳解
接下是TLS和SSL的的關係以及其詳解api
TLS和SSL的關係
- SSL 又稱Secure Sockets Layers,而TLS又稱Transport Layer Security。
- TLS位於傳輸層上,而SSL位於傳輸層和應用層之間。
- SSL 總共有3版 分別是 1995年的SSL v1.0, 1995年的SSL v2.0, 1996年的SSL v3.0。
- TLS 目前有四版分別是 1999年的TLS v1.0, 2006年的TLS v1.1, 2008年的TLS v1.2, 2018年的TLS v1.3。
- SSL 是 TLS 的前身,而且目前已經不推薦使用, TLS v1.0 修正了SSL v3.0中的安全缺陷,可是因爲TLS v1.0是能夠降級到SSL v3.0因此依舊存在不安全的狀況(當你訪問使用較低版本的TLS協議或者任意版本的SSL協議時,你的瀏覽器會提示你,這個時候若是想規避風險,建議就不要繼續了。)
TSL 握手機制。
- TSL handshake
- Client 發送 clientHello 到Sever,內容包括
- 支持的TSL最高版本號
- cipher suite(一堆支持的加密算法)
- 客戶端隨機數
- Server 返回ServerHello 到Client,內容包括
- Server決定的TSL版本號
- 服務器隨機數
- 選擇的cipher suite
- Server發送他的certificate message(這裏包含了server的public-key)到Client,這裏使用證書能夠保證public-key是正確的,由於certificate受到可信部門認證。
- Server發送ServerHelloDone信息到Client,告訴Client他的handshake已結束
- Client 發送ClientKeyExchange message 到 Server。包含:
- PremasterSecret(這個裏面包含的是sharekey,用server的public加密)。 除此以外,Client使用服務端隨機數,客戶端隨機數,PremasterSecret造成share key
- Server使用本身的private key 解密 ClientKeyExchange message,並使用服務端隨機數,客戶端隨機數,PremasterSecret造成share key。
- client 發送ChangeCipherSpec到Server,目的是告訴Server能夠開始使用以上協商的share key了。包含
- Finished massage:這個是以前握手信息的hash或者MAC(message authentication code (MAC) algorithm)算法的值
- Server 收到ChangeCipherSpec,後計算本身本地的內容,檢查收到的hash/mac是否和本身的一致,不一致,此次握手將失敗,一致發送ChangeCipherSpec到client,目的是告訴Client開始使用協商的share key。
cipher suite 詳解
cipher suite 是爲了保證鏈接過程的安全性,其中包括很4種算法原語的組合。客戶端和服務器handshake時,由服務器肯定使用的算法,以後由服務器和客戶端一塊兒使用這樣的算法。瀏覽器
- 四種算法原語(對於一個cipher suite,只能有一個Kx,一個Au一個Enc,一個MAC,可是這些算法能夠選擇不一樣的)
- Key Exchange(Kx),常見DH 和 ECDH,(相似TLS握手機制)
- Authentication (Au),常見DSA/RSA/ECDSA(證書,好比server發送回來的public key 就是放在sever的證書裏的,client能夠檢查這個證書是否有效)
- Encryption(Enc),主要AES(加密算法,和密碼學有關,咱們此處不談)
- Message Authentication Code(MAC),常見SHA一、SAH25六、SHA384(對於message,對總體求hash/md等做爲單獨的tag,即做爲客戶端檢查message完整性和未被篡改的憑證)
解決辦法1(不建議)
以前說過HTTPS的網站纔有TLS/SSL而PKIX在TLS/SSL中使用,因此咱們能夠利用這種方法,把全部想要訪問的網站的https://····
換爲http://····
。安全
解決方法2(程序內部自動過濾ssl,推薦)
然而有的時候,好比小程序去獲取user的openid和session-key時,須要訪問https://api.weixin.qq.com/sns/jscode2session,此時由於微信官方的api限制了必須使用https,因此去掉s則會報錯。此時咱們採用在本地網絡鏈接時忽略SSL。 我認爲,在開發軟件時,不少主機若是沒有ssl認證,執行須要的網絡鏈接就會失敗,因此須要過濾ssl。 能夠使用以下的工具類 服務器
如需複製代碼請轉到httpclient 實現https請求微信
解決辦法3(解決maven等出現pkix的問題)
如圖位置加入-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
網絡
解決方法4 (導入證書)
以前不少博主使用的都不是最新的語法,建議在導入時使用keytool -help看一下最新的導入語法。 cmd在管理員模式進入java jdk 下的jre\lib\security目錄。 個人是C:\Program Files\Java\jdk1.8.0_221\jre\lib\security
獲取證書的方法能夠參考其餘博主,比較簡單。 使用以下語言導入證書 keytool -importcert -noprompt -trustcacerts -alias xxx(你想要導入的別名) -file "C:\Program Files\Java\jdk1.8.0_221\jre\lib\security\xxx.cer(你的文件的地址)" -keystore "C:\Program Files\Java\jdk1.8.0_221\jre\lib\security\cacerts" -storepass changeit
session