日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【SSL】调用HTTPS://服务遇到错误:unable to find valid certification path to requested target

發布時間:2024/9/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【SSL】调用HTTPS://服务遇到错误:unable to find valid certification path to requested target 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

  • OkHttpClient

最近有個需求,需要調用一個https開頭的URL服務。
服務方提供了一個demo,但,demo是調用http的服務。
網上找了一大圈,發現蓋起來要這樣要那樣的。都不符合我的想法,試了幾個也沒成功。
我的想法比較簡單:有沒有一種方法,讓我在不改動demo的前提下,讓demo跑起來。
經過我仔細地回想一下,發現這個辦法可行,我之前還實現過。

錯誤內容

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 targetat sun.security.ssl.Alerts.getSSLException(Alerts.java:192)at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.kt:379)at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.kt:337)at okhttp3.internal.connection.RealConnection.connect(RealConnection.kt:209)at okhttp3.internal.connection.ExchangeFinder.findConnection(ExchangeFinder.kt:226)at okhttp3.internal.connection.ExchangeFinder.findHealthyConnection(ExchangeFinder.kt:106)at okhttp3.internal.connection.ExchangeFinder.find(ExchangeFinder.kt:74)at okhttp3.internal.connection.RealCall.initExchange$okhttp(RealCall.kt:255)at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:32)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:95)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:83)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:76)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)at okhttp3.internal.connection.RealCall.getResponseWithInterceptorChain$okhttp(RealCall.kt:201)at okhttp3.internal.connection.RealCall.execute(RealCall.kt:154)at sc.HttpClientUtil.postWithJsonMsg(HttpClientUtil.java:66)at sc.appPay.main(appPay.java:105) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)at sun.security.validator.Validator.validate(Validator.java:260)at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)... 26 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)... 32 more

題外話

對于調用HTTPS的服務,可以參考《java 安全性編程指南》。

解決思路

將HTTPS的證書添加到本地證書庫中。在程序啟動時,使用指定的證書庫驗證證書和CA。

相關知識:

  • 當訪問的URL是以https://開頭的話,VM將自動地激活JSSE。
  • 服務器會向客戶端發送它的證書以供驗證。
  • 客戶端會驗證證書,以確認這個服務器正式他想鏈接并通信的那個服務器,并且確認簽發證書的CA是可信任的。
  • 環境變量javax.net.ssl.trustStore告知客戶端的JSSE使用哪個證書庫。證書庫中有我們可以信任的證書和CA。
  • 環境變量javax.net.ssl.trustStorePassword告知客戶端的JSSE證書庫的密碼。
  • 如果未指定證書庫,則使用缺省的證書庫。缺省的證書庫的位置為%JRE_HOME%/lib/security/cacerts或者%JAVA_HOME%/jre/lib/security/cacerts。默認密碼為changeit。

操作

  • 拿到證書。https://開頭的地址的證書很容易拿到。在瀏覽器中打開該地址,將瀏覽器中顯示的證書另存為就拿到了。
  • 創建證書庫。參考 【SSL】java keytool工具創建自己的(localhost)(JKS)證書庫。
  • 將第1步中拿到的證書導入到證書庫中。參考 【SSL】java keytool工具操作java帶的(JKS)證書庫。
  • 在程序中引入證書庫。
  • 在合適的位置添加下面這段靜態代碼:

    static {File jksFile = new File("localhost.jks");System.out.println("jks file : " + jksFile.getAbsolutePath());System.setProperty("javax.net.ssl.trustStore", jksFile.getAbsolutePath());System.setProperty("javax.net.ssl.trustStorePassword", "changeit");}

    對應的項目結構為:

    項目目錄 ├─src │ ├─main │ │ ├─java │ │ │ └─sc │ │ └─resources │ └─test │ ├─java │ └─resources └─localhost.jks

    其它

  • 如果使用默認的證書庫,則可以省略第2步。
  • 使用默認的證書庫時,在win10上導入證書遇到問題。具體原因不明。
  • 總結

    以上是生活随笔為你收集整理的【SSL】调用HTTPS://服务遇到错误:unable to find valid certification path to requested target的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。