2011-05-13 279 views
0

我正在编写一个应用程序,我控制客户端和服务器的代码。 我正在使用SSLSockets来实现它。 我有协议,已经与正常的不安全插座运行,但是当我尝试切换到的SSLSockets(使用完全相同的协议),我不断收到以下堆栈跟踪:java.net.SocketException:连接重置

java.net.SocketException: Connection reset 
     at java.net.SocketInputStream.read(SocketInputStream.java:168) 
     at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293) 
     at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:782) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:739) 

出于某种原因,完全相同的代码完全适用于不安全的套接字。为什么会这样呢?

任何反馈将不胜感激。谢谢。

巴勃罗

+0

您可以发布代码吗? – Welshboy 2011-05-13 18:08:48

+0

要确定它确实是一个软件问题,请尝试在使用其他互联网连接的另一台计算机上运行。它*可能是一个软件错误,但是最后一次我看到这个症状时,一个错误的路由器被责备。 – finnw 2011-05-13 18:20:17

回答

0

取决于你使用的是什么操作系统,它可能需要管理员/根priveledges结合或听SSL端口。尝试使用管理员权限(在Windows中)或sudo'd(在Linux上)运行应用程序。

+0

读取失败,不接受()。 – 2011-05-14 02:29:56

+0

什么是“SSL端口”呢? HTTPS在1024以下。但没有分配给SSL/TLS的具体号码。 – 2011-05-14 02:31:36

4

从您的帖子中找不到问题。
当您切换到安全套接字时,默认情况下使用最安全的密码。
如果您尚未正确配置您的truststore/keystore(或未启用未经身份验证的套件),则SSL握手将失败。
这个例外似乎表明了这一点。
你可以做的是使用javax.net.debug=ssl,handshake运行你的程序来启用SSL调试信息,并发布调试信息和你的代码,如果你希望有人来帮助你。

+0

-Djavax.net.debug = ssl是调试SSL中最有用的东西。 – 2011-05-14 02:29:24

0

原因可能有所不同,-Djavax.net.debug = ssl是您的朋友,正如Vladimir Dyuzhev所建议的那样。

无论如何,它可能是一个证书问题 - 确保你有正确的密钥库和可信任。你将需要密钥库与一个条目:

  • 完整的链条:

    • 私钥
    • 证书
    • 完成证书

    而且一个信任的发行人链证书服务器证书

我在生成正确的密钥库时遇到了问题(trustore很简单 - 只需使用keytool)。对于keystore,您需要像这样(Linux with openssl + java):

# convert all to PEM 
openssl x509 -in ${ca}.der -inform DER -outform PEM -out ${ca}.pem 
openssl x509 -in ${subca}.der -inform DER -outform PEM -out ${subca}.pem 
# create one large PEM file containing certificate chain 
cat ${ca}.pem ${subca}.pem > tmp_cert_chain.pem 
# generate PKCS#12 BUNDLE 
openssl pkcs12 -export -in ${cert}.pem -inkey ${key}.pem -certfile tmp_cert_chain.pem -out tmp_pkcs12.pfx 
# convert PKCS#12 bundle to JKS 
keytool -importkeystore -srckeystore tmp_pkcs12.pfx -srcstoretype pkcs12 -srcstorepass ${storepass} -destkeystore $keystore -deststoretype jks -deststorepass ${storepass} 
# print out JKS keystore 
keytool -list -keystore $keystore -storepass $storepass 
+0

按照建议进行调试时,在写入消息之后,我得到'处理异常:java.net.SocketException:Connection reset',所以没有线索。即使使用从实时链接获取的.CRT文件导入证书,如何解决此问题的其他任何想法? – 2015-09-15 11:18:58

相关问题