我正在编写一个应用程序,我控制客户端和服务器的代码。 我正在使用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)
出于某种原因,完全相同的代码与不安全的套接字完美配合。为什么会这样?
任何反馈都将不胜感激。谢谢。
巴勃罗
答案 0 :(得分:4)
从你的帖子中找不到问题是不可能的
当您切换到安全套接字时,默认使用最安全的密码
如果尚未正确配置信任库/密钥库(或未启用未经过身份验证的套件),则SSL握手将失败。
例外情况似乎表明了这一点
您可以做的是使用javax.net.debug=ssl,handshake
运行程序以启用SSL调试信息,并发布调试信息和代码,如果您希望有人帮助您。
答案 1 :(得分:0)
根据您使用的操作系统,可能需要admin / root priveledges绑定或侦听SSL端口。尝试使用管理员权限(在Windows中)或sudo'd(在Linux上)运行应用程序。
答案 2 :(得分:0)
原因可能会有所不同,-Djavax.net.debug = ssl是你的朋友,正如Vladimir Dyuzhev所建议的那样。
无论如何,这可能是证书问题 - 请确保您拥有正确的密钥库和信任。您将需要在密钥库中输入一个条目:
还有一个信托商店:
我在生成正确的密钥库时遇到问题(信任很容易 - 只需使用keytool)。对于密钥库,你需要这样(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