web-dev-qa-db-ja.com

リクエストされたターゲットへの有効な証明書パスが見つかりません-java

HttpClient オブジェクトを使用してWebサイトに接続しようとしています。私たちが通常使用しているWebサイト(Googleのように)では問題なく機能します。しかし、ウェブサイトがあります。接続しようとすると、プログラムでこのエラーが発生します。

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
at Sun.security.ssl.Alerts.getSSLException(Alerts.Java:192)
at Sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1917)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:301)
at Sun.security.ssl.Handshaker.fatalSE(Handshaker.Java:295)
at Sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1369)
....................
Caused by: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:387)
at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:292)
at Sun.security.validator.Validator.validate(Validator.Java:260)
...............

Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.Java:145)
at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:131)
at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:280)
at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:382)
... 27 more

ブラウザからこのURLにアクセスしようとすると、続行をクリックする必要があります。そうでない場合、ブラウザはページをロードしません。 プライバシーエラーあなたの接続はプライベートではないと言っています。

Java application ..?)でこの問題を解決するにはどうすればよいですか?エラーや確認を求めずにソフトウェアをそのURLに接続します。

12
Ramesh-X

TrustSelfSignedStrategy オブジェクトを HttpClient への信頼マテリアルとして使用したときに問題が解決しました。

        httpClient = HttpClients.custom()
            .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom()
                    .loadTrustMaterial(null, new TrustSelfSignedStrategy())
                    .build()
                )
            ).build();

私が使用したコードは上に示されています。

15
Ramesh-X

HttpClient4.xの場合、以下はすべてを信頼します

public static HttpClientBuilder createTrustAllHttpClientBuilder() {
  SSLContextBuilder builder = new SSLContextBuilder();
  builder.loadTrustMaterial(null, (chain, authType) -> true);           
  SSLConnectionSocketFactory sslsf = new 
  SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE);
  return HttpClients.custom().setSSLSocketFactory(sslsf);
}
9
greensuisse