[英]java.net.SocketException: Connection reset
我正在编写一个应用程序,在其中我可以控制客户端和服务器的代码。 我正在使用SSLSockets来实现它。 我已经使用普通的不安全套接字运行了该协议,但是当我尝试切换到SSLSockets(使用完全相同的协议)时,我不断得到以下堆栈跟踪:
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)
由于某些原因,完全相同的代码可以完美地用于不安全的套接字。 为什么会这样呢?
对于任何反馈,我们都表示感谢。 谢谢。
巴勃罗
从您的帖子中无法检测到该问题。
切换到安全套接字时,默认情况下使用最安全的密码。
如果尚未正确配置信任库/密钥库(或未启用未经身份验证的套件),则SSL握手将失败。
异常似乎表明了这一点。
您可以做的是使用javax.net.debug=ssl,handshake
运行程序以启用SSL调试信息,并在希望有人帮助的情况下发布调试信息和您的代码。
原因可能各不相同,如Vladimir Dyuzhev所建议,-Djavax.net.debug = ssl是您的朋友。
无论如何,这可能是证书问题-确保您具有正确的密钥库和信任库。 您需要在密钥库中输入以下一项:
和一个信任库:
我在生成适当的密钥库时遇到问题(trustore很容易-只需使用keytool)。 对于密钥库,您需要像这样的st(带有openssl + java的Linux):
# 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
根据您使用的操作系统,它可能需要管理员/ root用户权限才能绑定或监听SSL端口。 尝试以管理员权限(在Windows中)或sudo'd(在Linux中)运行应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.