Я пытаюсь использовать задание Jenkins (конвейер), чтобы прочитать некоторую информацию из конечной точки json и затем сделать что-то на основе этой информации.
Конечная точка, из которой он читает, является внутренней, априложение доступно через https с сертификатом, который самоподписан нашим внутренним CA.
Вот пример кода, который запускается конвейером для анализа json:
new JsonSlurper().parse(new URL('https://my.internal.url/info'))?.application?.git?.commit
Чтобы сделать его немного более сложным, я использую двоичный файл Java из Global Tool Configuration также в конвейере.
Когда я запускаю конвейер, яполучите следующую ошибку:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392)
Caused: sun.security.validator.ValidatorException: PKIX path building failed
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
Caused: javax.net.ssl.SSLHandshakeException
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959)
...
Caused: groovy.json.JsonException: Unable to process url: https://my.internal.url/info
at groovy.json.JsonSlurper.parseURL(JsonSlurper.java:416)
at groovy.json.JsonSlurper.parse(JsonSlurper.java:379)
...
Итак, теперь я пытаюсь сделать этот CA известным JVM, который выполняет этот код, но я не могу понять, как это сделать.
Я попытался загрузить pem-файл для корневого ЦС, добавить его в системные сертификаты и затем импортировать его в системный файл по умолчанию cacerts
для Java (/etc/ssl/certs/java/cacerts
), выполнив следующие действия:
curl -Lso /etc/ssl/certs/rootca1.pem "<DOWNLOAD LINK>" \
&& chmod 777 /etc/ssl/certs/rootca1.pem \
&& mkdir -p /usr/share/ca-certificates/projectname \
&& cp /etc/ssl/certs/rootca1.pem /usr/share/ca-certificates/projectname/rootca1.crt \
&& echo "projectname/rootca1.crt" >> /etc/ca-certificates.conf \
&& update-ca-certificates -f
Впоследствии, когда я использую класс для тестирования ssl connections в Java (например, https://gist.github.com/4ndrej/4547029) и запустить java SSLPoke https://my.internal.url/info 443
Я могу успешно подключиться.Конвейер Jenkins по-прежнему не работает с той же ошибкой.
Тогда я подумал, что, возможно, конвейер использует двоичный файл Java, который копируется глобальной конфигурацией инструмента (хотя это еще не сделано в Jenkinsfile) в рабочую областьпоэтому я добавил CA в хранилище ключей cacerts
этого инструмента , который копируется в рабочую область ($WORKSPACE/tools/hudson.model.JDK/Java_8/jre/lib/security/cacerts
).
И снова после этого я могу использовать этот двоичный файл сКласс SSLPoke для успешного подключения к URL, но конвейер все еще не работает ...
Итак, у меня нет идей ... Кто-нибудь сталкивался с подобными проблемами и сумел их исправить?Без перехода к официально подписанным сертификатам (которые по разным причинам недоступны для внутренних URL-адресов, даже Let's Encrypt ).
Заранее спасибо!