Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用代理的HTTPS连接导致SSLHandshakeException_Java_Ssl_Proxy - Fatal编程技术网

Java 使用代理的HTTPS连接导致SSLHandshakeException

Java 使用代理的HTTPS连接导致SSLHandshakeException,java,ssl,proxy,Java,Ssl,Proxy,我已经为这个问题挣扎了好几天了,我似乎找不到一个有用的答案 我有一些软件,每当我想将它与代理服务器一起使用时,都会导致SSLHandshakeExceptions。我已经能够用以下代码复制该问题(这比实际应用程序简单得多): 如果我运行连接到WiFi热点(不需要代理服务器)的代码,我就能获得连接,一切正常: java -cp . SampleJavaURLTest 但是,如果我对代理服务器运行相同的Java命令: java -cp . -DproxySet=true -DproxyHost={

我已经为这个问题挣扎了好几天了,我似乎找不到一个有用的答案

我有一些软件,每当我想将它与代理服务器一起使用时,都会导致SSLHandshakeExceptions。我已经能够用以下代码复制该问题(这比实际应用程序简单得多):

如果我运行连接到WiFi热点(不需要代理服务器)的代码,我就能获得连接,一切正常:

java -cp . SampleJavaURLTest
但是,如果我对代理服务器运行相同的Java命令:

java -cp . -DproxySet=true -DproxyHost={myProxyHost} -DproxyPort={myProxyPort} SampleJavaURLTest
我得到了这个异常(使用代码snipplet中的
e.printStackTrace()
打印,以使行号不相关:

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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1731)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:925)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1170)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1197)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1181)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
at SampleJavaURLTest.main(SampleJavaURLTest.java:116)
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:323)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
... 11 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 17 more
因此,第一个合乎逻辑的建议是“使用InstallCert程序并添加google的证书”。然而这不是问题所在,Java不喜欢通过代理服务器处理证书的方式

我使用完全相同的JVM运行这两个示例,除了命令行中的代理设置之外,没有其他配置更改。事实上,这两个测试都是在同一个控制台窗口中完成的,两个测试之间只需要几秒钟就可以切换网络了……下面是一个java-v打印输出:

java version "1.6.0_30"
Java(TM) SE Runtime Environment (build 1.6.0_30-b12)
Java HotSpot(TM) Client VM (build 20.5-b03, mixed mode, sharing)
而且,100%肯定的是,我还使用了一个新的JVM进行了测试:

java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
作为一种解决方法,我使用以下方法禁用了所有证书验证:


虽然这并不会真正影响我,而且我可以接受这种解决方法(如果有人用假证书在通信中进行黑客攻击,则不那么重要),我很想知道如何正确地使证书正常工作。我缺少什么?

如果我理解正确,您的SSL连接在没有代理的情况下会成功,如果您禁用证书验证,也会在代理的情况下成功,但如果启用证书验证,则在代理的情况下会失败。在这种情况下,代理正在篡改使用SSL,例如,它进行中间人攻击(在某些防火墙中也称为SSL拦截或在squid中称为SSL碰撞)。如果这不是攻击,而是此代理的已知功能(例如,扫描SSL连接以查找病毒等)您需要导入代理拦截CA,因为由于中间的人,您不再与web服务器进行SSL通信,而是与代理进行SSL通信,然后代理与服务器进行SSL通信。

请尝试抱歉,但正如我所解释的,SSL连接在没有代理服务器的情况下可以正常工作。我缺少什么?请使用
-Dhttps.pro进行尝试xyHost=…
https.proxyPort=…
,还有
-Djavax.net.debug=ssl,握手
,并在此处发布故障前的部分,特别是初始的
ClientHello
证书
消息。好吧,这个应答器听起来不错。它是一个公司代理,所以我确信它不是一个“攻击”,但拦截CA听起来似乎有道理。问题是我不能使用InstallCert,因为它会生成一个“本机”代理设置未检测到的ssl套接字。是否有方法使InstallCert程序能够通过代理进行连接?或者,是否有其他方法进行连接?我不知道InstallCert,但如果您可以通过代理与普通web浏览器进行连接,则浏览器/系统证书中应该有所需的代理CAte store,您应该能够导出它。我对Java证书管理的了解还不够,不知道如何安装它,然后在Java中使用。好的,谢谢。我刚刚检查了证书,它不是由google颁发的,而是由托管代理服务器的公司颁发的,因此这证实了您的答案是正确的,现在它产生了很多错误相信。。。
java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)