【问题标题】:SoapUING - Groovy - HTTPBuilder - PKIX Path building Failed ErrorSoapUING - Groovy - HTTPBuilder - PKIX 路径构建失败错误
【发布时间】:2016-10-24 17:15:17
【问题描述】:

我对 Groovy 和 SoapUING 还很陌生。我希望有人可以帮助我找出并修复此错误。谢谢!

我正在尝试做的事情: 遍历表中的每个 db 行项并将其用作输入以发出 HTTPBuilder 请求(GET 或 POST),或者作为路径中的查询(加baseURL/path/hello)或通过参数(加baseURL/path?searchNode="hello")。 baseURL 类似于https://search-test-env.ser.com

卡住的地方:当我尝试通过 HTTPBuilder 发布请求时。

错误: PKIX Path Building Failed

其他相关信息:

  • 使用 ReadyAPI 运行脚本。代码在 Groovy 中。
  • 最近将 httpbuilder jar 连同一些依赖项导入 ReadyAPI/lib 文件夹。在 httpbuilder 可用的依赖项中,ReadyAPI 已经很少,所以我只选择了缺少的那些。其他 jar 名称:ojdbc6, ojdbc6_g, signpost-commonshttp4-1.2.1.1, ezmorph-1.0.6, json-lib-2.3-jdk15, xml-resolver-1.2, signpost-core-1.2.1.1, appengine-api-1.0-sdk-1.3.8, nekohtml-1.9.16, http-builder-0.7, http-builder-0.7-sources, http-builder-0.7-javadoc
  • 该服务适用于没有 groovy 的手动请求(baseURL/路径上的简单 GET),它也适用于按字符串或按参数查询。
  • 证书已在密钥库中可用。尝试通过 cmd 使用 keytool(在 ReadyAPI/bin 文件夹中可用)命令,但收到 filenotfound 错误)。尝试导入 ReadyAPI\jre\lib\security。

代码:

    def qryPrmRqstHTTPBldr( pBaseUrl, pPath, pQuery, pMethod ) {
    def ret = null
    def http = new HTTPBuilder()
    def meth

    if ( pMethod == 'GET') {
            meth = Method.GET
    }
    else if ( pMethod == 'POST') {
            meth = Method.POST
    }
    // perform a GET/POST request, expecting TEXT response
    http.request(pBaseUrl, meth, ContentType.TEXT) { req ->
        uri.path = pPath
        uri.query = pQuery
        /*
        headers.'User-Agent'         = 'Apache-HttpClient/4.5.1 (Java/1.8.0_66)'
        headers.'Host'               = 'xxx-xx-xxx.xxx.xxx'
        headers.'Accept-Encoding'    = 'gzip,deflate'
        headers.'Connection'         = 'Keep-Alive'
        */
        log.info System.getProperty("java.runtime.version")
        log.info System.getProperty("javax.net.ssl.trustStore")
        log.info System.getProperty("javax.net.ssl.keyStore")
        log.info System.getProperty("java.home")
        log.info System.getProperty("java.class.path")        

        // response handler for a success response code
        response.success = { resp, reader ->
                println "response status: ${resp.statusLine}"
                println 'Headers: -----------'

                ret = reader.getText()

                println 'Response data: -----'
                println ret
                println '--------------------'
            }
    }
      return ret
}

运行此代码会引发 PKIX Path Building Failed 错误(没有可用的堆栈跟踪)和每个属性的内容:

System.getProperty("java.runtime.version") // 1.8.0_66-b17
System.getProperty("javax.net.ssl.trustStore") // null
System.getProperty("javax.net.ssl.keyStore") // null
System.getProperty("java.home") // c:\program files\smartbear\readyapi-1.6.0\jre 
System.getProperty("java.class.path") // C:\Program Files\SmartBear\ReadyAPI-1.6.0\.install4j\i4jruntime.jar;......

【问题讨论】:

    标签: groovy soapui httpbuilder pkix


    【解决方案1】:

    问题

    PKIX path building failed 当您的客户端无法构建到您的服务器证书的信任路径时,将引发错误。这基本上意味着在您的信任存储中没有为您的服务器证书颁发最终实体证书或中间证书的证书颁发机构;并且需要它来构建证书链。

    在你的情况下,javax.net.ssl.trustStore 没有定义,因为System.getProperty("javax.net.ssl.trustStore")null;所以来自JSSE

    1. 如果定义了系统属性:javax.net.ssl.trustStore,则 TrustManagerFactory 尝试使用文件名查找文件 由该系统属性指定,并将该文件用于 密钥库。如果javax.net.ssl.trustStorePassword 系统属性是 也定义了,它的值用来检查数据的完整性 打开之前的信任库。如果javax.net.ssl.trustStore 是 已定义但指定文件不存在,则默认 使用空密钥库创建 TrustManager。

    2. 如果未指定 javax.net.ssl.trustStore 系统属性, 那么如果文件<java-home>/lib/security/jssecacerts存在,那 文件被使用。 (请参阅安装目录 有关所指内容的信息。)

    3. 否则,如果文件 <java-home>/lib/security/cacerts 存在,该文件已被使用。

    解决办法

    然后要解决问题,您需要将所需的证书添加到JRE_HOME/lib/security/jssecacerts(如果存在)或添加到JRE_HOME/lib/security/cacerts(如果不是来自用于运行 GroovyJava /em> 脚本。

    正确方法:在信任库中添加你的服务器证书的证书颁发机构。然后确保您的服务器正确地为所有证书链提供服务,直到 CA:中间证书(如果需要)直到最终实体服务器证书。

    蛮力方式:如果您在设置信任存储时遇到问题,或者您不确定服务器是否正在推送链证书...只需将服务器证书直接放入信任存储。这不是“纯粹”的方式,但因为您只是在测试,所以它会起作用。

    怎么做

    下载 CA 服务器证书并使用 keytool 使用以下命令将其加载到信任库(cacerts 的默认密码为 changeit):

    keytool -import -alias <someAlias> -file <certificatePath> -keystore <trustStorePath>
    

    Here 我的答案之一是关于如何加载证书的更多细节。

    【讨论】:

    • 非常感谢您解释导致此问题的原因。提出解决方案 - 作为一个新手,我不知道如何实现这一点。一直在使用 keytool 实用程序,但它正在抛出 filenotfound 错误。此外,手动发出请求时响应与预期一致......我相信它直接从 url 获取证书并产生响应。来到密钥库。在C:\Program Files (x86)\Java\jre1.8.0_66\lib\securityC:\Program Files\SmartBear\ReadyAPI-1.6.0\jre\lib\security 中都没有jssecerts 文件,只有cacerts 文件。
    • @ssc 我添加了有关 keytool 的更多详细信息,希望这会有所帮助:)。
    • 谢谢!我一直在尝试做同样的事情,但它抛出了 filenotfound 错误。
    • @ssc 问题可能是由于文件被拒绝访问,尝试在管理员模式下运行 cmd,然后运行 ​​keytool 命令。
    • 是的,尝试了管理员模式。没用。通过您提到的链接,有人提到了 Windows Defender 或防火墙问题,但我猜在这种情况下这不是问题。任何线索都会非常有帮助。我还尝试通过工具(WS-Security) 加载证书,但它也不起作用。密码是正确的,因为我能够使用该密码通过工具提取cacerts 文件并将其也列在 cmd 中。
    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2018-10-04
    • 1970-01-01
    相关资源
    最近更新 更多