在 Jenkins 管道中,执行相互身份验证 REST 请求的正确方法是什么?

In Jenkins pipeline, what is the correct way to perform mutual-authentication REST requests?

我正在从 Jenkins 管道调用 REST 服务。此 REST 服务使用相互身份验证,因此我必须提供客户端证书进行身份验证。

我可以将证书与我的 Jenkinsfile 一起存储在 Git - 然后我可以将此证书传递给 REST 调用吗?

这是在带有 --cert 参数的 cURL 中执行的:

curl -H "Content-Type: application/json" -H "Accept: application/json" \
--cert ens.p12 \
https://hostname:9000/api/bakery -k

我们如何获得它以便在 Groovy 请求中使用该证书?

def get = new URL("https://hostname:9000/api/bakery").openConnection();
get.setRequestMethod("GET")
get.setRequestProperty("Content-Type", "application/json")
get.getInputStream().getText()

在 Groovy 中你应该使用 HttpBuilder.

代码可能如下所示:

def request = ApacheHttpBuilder.configure{
  request.uri = 'https://hostname:9000/api/bakery'
  request.contentType = 'application/json'
  client.clientCustomizer{ HttpClientBuilder builder ->
    builder.sSLContext = provideYourSSLContext()
  }
}.get{
  response.success{ resp, json ->
    println "$resp.statusCode / got JSON: $json"
  }
}

这里你必须在 provideYourSSLContext() 方法中加载你的证书。

最终将 cURL 与 Jenkins Pipeline DSL 提供的 sh 结合使用,因为这似乎以最简洁的方式处理了需求。

JSON = sh (
  script: 'curl -H "Content-Type: application/json" --cert ens.p12 https://hostname:9000/api/bakery -k',
  returnStdout: true
).trim()