SoapUING - Groovy - HTTPBuilder - PKIX路径构建失败错误

时间:2016-10-24 17:15:18

标签: groovy soapui httpbuilder pkix

我对Groovy& amp; SoapUING。我希望有人能帮助我找出并解决这个错误。谢谢!

我尝试做的事情:遍历表格中的每个数据库行项目并将其作为输入用于发出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 / path上的简单GET),它也适用于按字符串或参数查询。
  • 证书已在密钥库中提供。尝试使用keytool(在ReadyAPI / bin文件夹中可用)命令通过cmd但收到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;......

1 个答案:

答案 0 :(得分:0)

问题

当您的客户端无法构建服务器证书的信任路径时,将引发

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

  4.   
  5. 否则,如果是文件   存在<java-home>/lib/security/cacerts,使用该文件。

  6.   

解决方案

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

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

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

怎么做

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

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

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