使用自签名SSL证书时出现“SocketException:未连接的套接字未实现”错误

10

我已经向jmeter-user邮件列表提出了同样的问题,但我也想在这里尝试一下 - 这样至少我可以在找到答案后更新它。

我正在使用JMeter测试一个使用自签名SSL证书的Tomcat Web应用程序时遇到了问题。 JMeter抛出SocketException并显示消息未连接套接字未实现。 根据JMeter文档,该应用程序被设计和编写为接受任何证书,包括自签名或CA签名等。

有人遇到过这个特定的异常吗?

我尝试从服务器导出此证书并将其导入我的本地密钥库(使用keytool -import -alias tomcat -file ),但结果相同。

我还尝试将javax.net.debug = all设置为JVM参数(JSSE参考指南将其列为调试步骤); 但是,我没有在任何地方看到调试输出 - 我应该在标准输出/错误之外的其他地方期望吗?

6个回答

13

大多数javax.net.SocketFactory实现将所有具有参数的createSocket()方法定义为抽象的。但是有一个不带参数的createSocket()方法看起来像这样:

public Socket createSocket() throws IOException {
   throw new SocketException("Unconnected sockets not implemented");
}

因此,如果你子类化抽象的javax.net.SocketFactory,你将被强制重写带有参数的方法,但很容易忘记重写没有参数的createSocket()方法。因此,如果你的代码调用createSocket(),就会抛出异常。只需重写该方法并完成即可。:)


3
我在我的代码中遇到了同样的问题(与JMeter无关)。我的代码使用自定义的SocketFactory。我发现类com.sun.jndi.ldap.Connection使用Method.invoke()调用SocketFactory的一些方法。其中一个方法它试图调用是createSocket() - 没有参数。当我在我的工厂中添加这样的方法时,一切都正常工作了。

2
这只是一个提示,而不是正式答案:快速浏览谷歌搜索结果似乎表明,异常通常是由代码强制使用默认SSL套接字工厂引起的,该工厂在调用createSocket()时有意抛出异常。一些结果似乎表明,该问题有时是由于Java 6中某些版本中的错误或提供给密钥库的路径或密码不正确而发生的。

因此,我建议尝试使用Java 5。此外,请尝试将JMeter指向使用正确SSL证书的知名站点。这样,您可以测试自签名证书的假设。


你能发布一些链接吗,尤其是关于Java 6某些版本中的错误的链接? - matt b
1
1.6 相关: http://www.nabble.com/CXF-and-Java-6-Update-10-td19463818.html https://www.willuhn.de/bugzilla/show_bug.cgi?id=628 https://bugzilla.kapott.org/show_bug.cgi?id=72 其他的:尝试使用谷歌搜索 :) - Alexander

0

尝试在类路径中搜索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


0

0

我曾经在使用jdk 1.6.0_10时遇到过类似的Web服务问题。

后来我升级到了1.6.0_16版本,问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接