“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