【问题标题】:SoapUI fails to connect HTTPS (SSLPeerUnverifiedException)SoapUI 无法连接 HTTPS (SSLPeerUnverifiedException)
【发布时间】:2014-07-18 21:50:45
【问题描述】:

我需要测试部署到部署在 HTTPS 端点上的预发布环境的 Web 服务。不幸的是,SoapUI 因SSLPeerUnverifiedException: peer not authenticated 异常而失败。我使用了 4.6.4 和非常新鲜的 5.0 两个版本。

环境:

endpoint 是 https,startcom 证书,网络使用代理(但不同网络没有代理的问题相同)

我已经花了很多时间,也许是一天的时间在谷歌上搜索解决方案。尤其是这个链接看起来很有希望:https://forum.soapui.org/viewtopic.php?f=13&t=20866

我通过 firefox 提取了端点证书并让它信任。所以我从soapui JVM安装中修改了cacerts

..\SoapUI-4.6.4\jre\lib\security>keytool -import -alias HOSTNAME 
-file endpoint.crt -keystore cacerts -storepass changeit

重新启动,然后重新测试 - 失败。

然后我采取了不同的方法,让 SoapUI JVM 信任所有 StartCom 证书。

keytool -import -trustcacerts -alias startcom.ca -file ca.crt -keystore cacerts
keytool -import -alias startcom.ca.sub -file sub.class1.server.ca.crt -keystore cacerts

重新启动并再次失败。我现在还能做什么?

编辑

2014-05-30 08:39:53,782 ERROR [errorlog] javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(Unknown Source)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:446)
at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:499)
at com.eviware.soapui.impl.wsdl.support.http.SoapUISSLSocketFactory.createLayeredSocket(SoapUISSLSocketFactory.java:268)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.updateSecureConnection(DefaultClientConnectionOperator.java:200)
at org.apache.http.impl.conn.AbstractPoolEntry.layerProtocol(AbstractPoolEntry.java:277)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.layerProtocol(AbstractPooledConnAdapter.java:142)
at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:758)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:565)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport$Helper.execute(HttpClientSupport.java:238)
at com.eviware.soapui.impl.wsdl.support.http.HttpClientSupport.execute(HttpClientSupport.java:348)
at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.submitRequest(HttpClientRequestTransport.java:318)
at com.eviware.soapui.impl.wsdl.submit.transports.http.HttpClientRequestTransport.sendRequest(HttpClientRequestTransport.java:232)
at com.eviware.soapui.impl.wsdl.WsdlSubmit.run(WsdlSubmit.java:123)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

SSL 调试:

adding as trusted cert:
Subject: CN=StartCom Certification Authority, OU=Secure Digital Certificate Signing, O=StartCom Ltd., C=IL
Issuer:  CN=StartCom Certification Authority, OU=Secure Digital Certificate Signing, O=StartCom Ltd., C=IL
Algorithm: RSA; Serial number: 0x1
Valid from Sun Sep 17 21:46:36 CEST 2006 until Wed Sep 17 21:46:36 CEST 2036

Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
Thread-20, WRITE: TLSv1 Handshake, length = 186
Thread-20, READ: TLSv1 Alert, length = 2
Thread-20, RECV TLSv1 ALERT:  warning, unrecognized_name
SSL - handshake alert: unrecognized_name
Thread-20, handling exception: javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
Thread-20, SEND TLSv1 ALERT:  fatal, description = unexpected_message
Thread-20, WRITE: TLSv1 Alert, length = 2
Thread-20, called closeSocket()
Thread-20, IOException in getSession():  javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
09:16:12,482 ERROR [WsdlSubmit] Exception in request: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

【问题讨论】:

    标签: java ssl soapui


    【解决方案1】:

    好的,解决这个问题的方法是设置

    -Djsse.enableSNIExtension=false
    

    $SOAPUI_HOME/bin/soapui.bat

    原因在这个答案中描述:https://stackoverflow.com/a/14884941/1639556

    摘要:

    Java 7 引入了默认启用的 SNI 支持。我发现某些配置错误的服务器在 SSL 握手中发送了“无法识别的名称”警告,大多数客户端都忽略了这个警告......除了 Java。

    更新:对于 SoapUI 5.2.1,我不得不更改文件 SoapUI-5.2.1.vmoptions,因为修改 bat 文件没有帮助。

    【讨论】:

    • 谢谢。您提到soapui.bat 是关键。我不知道我可以更改 JVM 参数。
    • 我有同样的问题,并尝试用 "%JAVA%" -Djsse.enableSNIExtension=false %JAVA_OPTS% com.eviware.soapui.SoapUI %* 修复它,但我仍然有例外。我对soapui.bat 的修改可以吗?我在窗户上使用它。谢谢。
    • 这对我在 Windows 10 上的 SoapUI-5.1.3 不起作用
    • SoapUI 是可怕的垃圾。它不使用SoapUI-*.vmoptions 文件,即使它是在安装过程中创建的。修改传递给 JVM 的参数的唯一方法是编辑 soapui.bat 文件。
    【解决方案2】:

    对于使用 Mac 寻找相同答案的任何人(抱歉,它不会让我对所选答案发表评论,因为我还没有足够的声望点来评论!!!)。 如果您通过单击应用程序文件夹中的图标或使用 Spotlight 来启动应用程序,编辑soapui.sh 不会有任何影响。

    /Applications/SoapUI-5.0.0.app/Contents

    编辑 vmoptions.txt 并将 -Dcom.sun.net.ssl.checkRevocation=false 添加到文件底部。保存并重新启动。

    【讨论】:

      【解决方案3】:

      我认为你做得很好。如果您在信任库上加载服务器证书,则连接必须有效,可能正在发生某些事情,例如重定向。如果您愿意,可以尝试禁用 SSL 服务器证书验证。如果您使用 SOAPUI 独立版本,请编辑 $SOAPUI_HOME/bin/soapui.bat$SOAPUI_HOME/bin/soapui.sh 并将此参数 -Dcom.sun.net.ssl.checkRevocation=false 添加为 java 选项:

      soapui.bat

      set JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.net.ssl.checkRevocation=false

      soapui.sh

      JAVA_OPTS="$JAVA_OPTS -Dcom.sun.net.ssl.checkRevocation=false"

      希望这会有所帮助,

      【讨论】:

      • 谢谢。我试过你的答案,但没有帮助。我验证了该属性是在帮助/系统属性中设置的。
      • 设置此属性后,您会得到相同的错误吗?你能分享完整的堆栈跟踪吗?
      • 附上问题
      • 这对我在 Windows 10 上的 SoapUI-5.1.3 不起作用。连接被重置
      • @nl-x 这是对另一个 SoapUI、操作系统和可能是 java 版本的旧响应。通过评论详细信息,很难看出您的情况会发生什么。考虑发布一个新问题,其中包含更多详细信息 soapui 版本、java 版本、操作系统和堆栈跟踪,这样更容易获得帮助:)
      【解决方案4】:

      如果您使用的是代理,请尝试绕过相同的(通过 ProxySettings 是 SoapUI Preferences)

      【讨论】:

        【解决方案5】:

        同时确保您没有运行 Fiddler,它将尝试充当 SoapUI 发出的任何请求的代理。如果您想让它与 Fiddler 一起使用,您需要将 Fiddler 根证书添加到您的 Java 信任库中。

        另请参阅:SoapUI not working with fiddler for REST service testing

        【讨论】:

          【解决方案6】:

          我还收到以下消息:

          Error getting response; javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
          

          我遇到的问题只是通过代理服务器时。无需代理即可直接连接到 Internet。

          我尝试了所有这些解决方案,但都没有奏效。

          我什至尝试在 WS-Security-Configurations -> Truststores 下的 Java 密钥库中添加受信任的 CA 证书,但仍然出现错误。

          我已升级到 SoapUI 5.2.1,问题现已解决。

          你可能值得尝试一下。

          【讨论】:

            【解决方案7】:

            我尝试同时使用-Dcom.sun.net.ssl.checkRevocation=false-Djsse.enableSNIExtension=false 选项,但似乎都不起作用。

            起作用的是将证书导入 SoapUI 的证书存储区。我知道提问者指定他们已经这样做了,但不清楚 SoapUI 实际选择使用 哪个 cert store。

            通过执行以下操作,我能够导入证书并使用它:

            1. 确保 SoapUI 已关闭。
            2. http://keystore-explorer.org/downloads.html 下载 Keystore Explorer(使用独立的“全部”版本)并将其解压到某个位置。
            3. 从管理员命令提示符运行 Keystore Explorer 并使用捆绑的 SoapUI JVM
            C:\> "C:\Program Files\SmartBear\SoapUI-5.6.0\jre\bin\java.exe" -jar "path\to\kse.jar"
            
            1. 在 Keystore Explorer 中,单击“Open the CA Certificates Keystore”。
            2. 现在转到检查 > 检查 SSL,输入您的服务器的 URL,单击 确定 以查看“证书详细信息”对话框。
            3. 点击Import按钮并输入任何你想要的别名,点击OK
            4. 您应该会看到一个对话框,说明“受信任的证书导入成功”,单击 确定 将其关闭。然后再次单击 OK 以关闭“证书详细信息”对话框。
            5. Ctrl+S 或单击“保存”图标以更新根证书存储。退出密钥库资源管理器。
            6. 运行 SoapUI,它应该不会再惨遭失败。

            最后,SoapUI 是一款糟糕的软件,您应该尽可能避免使用它。但这对于大多数 Java 应用程序来说很常见。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-03-05
              • 2018-01-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-11-25
              相关资源
              最近更新 更多