“SocketException:未实现未连接的套接字”,带有自签名SSL证书
(我已经问过jmeter用户邮件列表的相同问题,但我也想在这里尝试一下 – 所以至少我可以在找到后用答案更新它)。
我在使用JMeter使用自签名SSL证书测试Tomcat webapp时遇到问题。 JMeter抛出一个SocketException,消息Unconnected sockets not implemented
。 根据JMeter的文档 ,该应用程序的设计和编写是为了接受任何证书,自签名或CA签名或其他。
有没有人遇到过这个特定的例外?
我试图从服务器导出此证书并将其导入我的本地密钥库(使用keytool -import -alias tomcat -file ),但结果是相同的。
我也尝试将javax.net.debug = all设置为JVM arg( JSSE参考指南将此列为调试步骤); 但是,我在任何地方都没有看到任何调试输出 – 我是否应该在标准输出/错误之外的其他地方看到它?
大多数javax.net.SocketFactory
实现定义所有createSocket()
方法,其参数为abstract。 但是有一个createSocket()
方法没有参数,如下所示:
public Socket createSocket() throws IOException { throw new SocketException("Unconnected sockets not implemented"); }
所以我是你的抽象javax.net.SocketFactory
子类,你将强制用参数覆盖方法,但很容易错过覆盖不带参数的createSocket()
方法。 因此,如果您的代码调用createSocket()
则抛出exception。 只需覆盖方法即可完成。 🙂
这是一个提示而不是一个正确的答案:粗略地看一眼谷歌的结果似乎表明,exception通常是由强制使用默认SSL套接字工厂的代码引起的,该工厂在调用createSocket()时会故意抛出exception。它。 一些结果似乎表明,问题有时是由于Java 6中的某个版本中的错误,或者向密钥库提供了错误的路径或密码。
所以,我想说,尝试使用Java 5.此外,尝试将JMeter指向使用正确SSL证书的知名站点。 这样您就可以测试自签名证书假设。
我的代码中遇到了同样的问题(与JMeter无关)。
我的代码使用自定义的SocketFactory
。 我发现的是com.sun.jndi.ldap.Connection
类使用Method.invoke()
调用SocketFactory
一些方法。 它试图调用的方法之一是createSocket()
– 没有参数。
当我将这种方法添加到我的工厂时,一切正常。
使用jdk 1.6.0_10,我遇到了与此类似的Web服务问题。
我升级到1.6.0_16,一切正常。
尝试在SSLSocketFactory *中搜索类路径(在Eclipse中,我执行ctrl-shift-t来执行此操作)。 如果找到一个,请将其设置为Security类的属性:
在我的环境中,我发现了以下两个:
Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
要么
Security.setProperty("ssl.SocketFactory.provider", "com.ibm.websphere.ssl.protocol.SSLSocketFactory");
(或者你找到的其他课程)
类似地,对于ServerSocketFactory
,如果需要服务器套接字。
这是我的解决方案(java 1.6)完全删除TLS_DHE_密码,强制覆盖方法createSocket()
( https://gist.github.com/hoangthienan/735afb17ffd6955de95a49aa0138dbaa )