Импорт внутреннего ЦС в Дженкинс - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь использовать задание 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 ).

Заранее спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Итак, нам удалось решить эту проблему.Проблема заключалась в том, что мы не заставляли наш прокси-сервер доставлять всю цепочку сертификатов.И кроме браузеров, например, двоичный файл openssl (и, следовательно, также реализации Java) не может загружать недостающие промежуточные сертификаты на лету.

Итак, мы создали сертификат, который содержит всю цепочку сертификатов(от листа до корневого сертификата) и теперь все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...