0

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

我正在尝试做的事情:遍历表中的每个 db 行项目并将其用作输入以发出HTTPBuilder请求(GET 或 POST),或者作为路径中的查询(add baseURL/path/hello)或通过参数(add 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/path 上的简单 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;......
4

1 回答 1

0

问题

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

在您的情况下javax.net.ssl.trustStore,它没有定义,由于System.getProperty("javax.net.ssl.trustStore")null;所以从JSSE

  1. 如果系统属性:javax.net.ssl.trustStore已定义,则 TrustManagerFactory尝试使用该系统属性指定的文件名查找文件,并将该文件用于 KeyStore。如果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存在,则使用该文件。

解决方案

然后要解决问题,您需要将所需的证书添加到您用于运行Groovy脚本的JavaJRE_HOME/lib/security/jssecacerts中是否存在或JRE_HOME/lib/security/cacerts是否不存在。

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

蛮力方式:如果您在设置信任库时遇到问题,或者您不确定服务器是否正在推送链证书......只需将服务器证书直接放入信任库中。这不是“纯粹”的方式,但因为你只是在测试这将有效。

怎么做

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

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

是我的答案之一,其中包含有关如何加载证书的更多详细信息。

于 2016-10-24T20:15:53.130 回答