[解決済み] javaがhttpsWebサイトのクロールを要求したときのjavax.net.ssl.SSLHandshakeExceptionの解決策

序文

httpsのWebサイトをクロールしているときに、これまでに見たことのない例外javax.net.ssl.SSLHandshakeExceptionが発生しました。詳細については、図を参照してください。

2020-06-01 23:18:17.032 DEBUG org.springframework.web.servlet.DispatcherServlet
- Successfully completed request
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExce
ption: unable to find valid certification path to requested target
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.
java:1341)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.jav
a:153)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.
java:1312)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82
)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream
(HttpConnection.java:828)
        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodB
ase.java:2116)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.j
ava:1096)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Htt
pMethodDirector.java:398)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMe
thodDirector.java:171)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.jav
a:397)

その理由は、サイトの証明書がjdkの証明書ライブラリで信頼できるセキュリティ証明書と見なされないためです。

解決策は、サイトの証明書をインポートし、この証明書をjavaの信頼できる証明書ストアにインポートすることです。

 

予防:

win7以降のシステムでは、実行するには管理者としてCMDを実行する必要があることに注意してください。MacOSをsudo -iコマンドでrootユーザーに切り替える必要があります。そうしないと、次のエラーが報告されます。

keytool错误: java.io.FileNotFoundException:   

 

手順:

証明書をjavaのcacerts証明書ライブラリにインポートする手順:

ステップ1:ブラウザでWebサイトを開き、Java証明書ライブラリにインポートする証明書をダウンロードし
        、Webページのセキュリティアラートポップアップウィンドウで証明書を表示します。証明書の詳細情報を表示します-ファイル
        にコピーします。証明書のエクスポートウィザードダイアログボックスがポップアップし、プロンプトに従い続けます。それが完了するまでの次のステップ。
        証明書をCドライブに保存します。名前はNEXT_CertKey.cerまたはxxxx.derです。

 

手順2:上記でエクスポートした証明書
        をjavaのcacerts証明書ライブラリwindows cmdのD:\ Program Files \ Java \ jdk1.7.0_67 \ binディレクトリにインポートします

  (ここでjdkインストールディレクトリを見つけます)


        次のコマンドを入力し、Enterキーを
        押してkeytool -import -alias cacerts -keystore D:\ Program Files \ Java \ jdk1.7.0_67 \ jre \ lib \ security \ cacerts -file C:\ NEXT_CertKey.cer-trustcacertsを実行します
        。コマンドラインは次のようになります。
        cacerts証明書ストアのパスワードを入力するように求められます。javaのcacerts証明書ストアのデフォルトのパスワードはchangeitで、
        Y、OKで確認すると、証明書がキ​​ーストアに追加されます。

我在本地测试的时候,用上面的好像有点问题,但是用下面的是可以的,大家可以两种方法都试一下,看下哪种可以导入进去

keytool -import -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file D:/jxust_CertKey.cer -alias ssodemo 

デモンストレーション効果を図に示します。 

 

 macosターミナルは/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/securityと入力します

sudo keytool -import -alias cacerts -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/jre/lib/security/cacerts -file / Users / xuwenfeng / Desktop / RuckusWirelessZoneDirectorSN-491508001359 -trustcacerts

 


参考記事 

https://www.iteye.com/blog/bewithme-2227487

技術者が問題をより早く解決できるように、共有してくれた元の著者に感謝します 

 

おすすめ

転載: blog.csdn.net/qq_27471405/article/details/106485866