Jenkins Job-DSL: как принять URL-адрес через Https с собственным подписанным сертификатом root-ca?

Я хочу прочитать поток xml через HTTPS. Веб-сервер имеет сертификат, который был подписан нашим собственным неофициальным центром сертификации.

Я знаю, что мне нужно импортировать сертификат ЦС, чтобы мой скрипт Groovy Job DSL работал.

Где мне нужно импортировать сертификат ca или как определить собственное хранилище доверенных сертификатов, чтобы оно работало?

Что я пробовал раньше:

  • Импорт сертификата CA с помощью keytool в C:\Program Files (x86)\Java\jre1.8.0_40\lib\security\cacert
  • Импорт сертификата CA с помощью keytool в C:\Program Files (x86)\jenkins\jre\lib\security\cacert

Когда я пытаюсь подключиться к groovyConsole после импорта сертификата CA в cacert trustStore, все работает, а в Jenkins - нет.

Поэтому я безуспешно пытался установить trustStore в своем сценарии Job DSL. Все еще получаю исключение ошибки цепочки сертификатов:

def addr          = "https://example.com:8443/svn/"
def authString    = "user:pass".getBytes().encodeBase64().toString()
def jobNamePrefix = "Job"

println("${WORKSPACE}\\epedev.keystore")
System.setProperty("javax.net.ssl.trustStore", "${WORKSPACE}\\epedev.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

def conn = addr.toURL().openConnection()

Фрагмент консоли:

Processing provided DSL script
C:\Jenkins\ps\seed\Seed PS Projects from SVN\workspace\epedev.keystore
FATAL: Unable to run script
java.io.IOException: Unable to run script
    at javaposse.jobdsl.dsl.DslScriptLoader.runDslEngineForParent(DslScriptLoader.java:92)
    at javaposse.jobdsl.dsl.DslScriptLoader.runDslEngine(DslScriptLoader.java:123)
    at javaposse.jobdsl.plugin.ExecuteDslScripts.perform(ExecuteDslScripts.java:216)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
    at hudson.model.Build$BuildExecution.build(Build.java:205)
    at hudson.model.Build$BuildExecution.doRun(Build.java:162)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:537)
    at hudson.model.Run.execute(Run.java:1741)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
    at hudson.model.ResourceController.execute(ResourceController.java:98)
    at hudson.model.Executor.run(Executor.java:408)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
    at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
    at sun.security.ssl.Handshaker.processLoop(Unknown Source)
    at sun.security.ssl.Handshaker.process_record(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:233)
    at groovy.lang.MetaClassImpl$GetBeanMethodMetaProperty.getProperty(MetaClassImpl.java:3500)
    at org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite.getProperty(GetEffectivePojoPropertySite.java:61)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:227)
    at script.run(script:12)
    at javaposse.jobdsl.dsl.DslScriptLoader.runDslEngineForParent(DslScriptLoader.java:80)
    ... 11 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 35 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 41 more
Started calculate disk usage of build
Finished Calculation of disk usage of build in 0 seconds
Started calculate disk usage of workspace
Finished Calculation of disk usage of workspace in 0 seconds
Finished: FAILURE

ОБНОВИТЬ:

Я также начал groovyConsole с JENkins JRE. Это также работает. Таким образом, хранилище ключей cacerts содержит рабочий сертификат ca. Но почему это не работает в консоли сценариев Jenkins или в плагине Job DSL. Что здесь не так?


person LucasF    schedule 20.08.2015    source источник
comment
Вы пытались запустить скрипт groovy из groovyConsole?   -  person rdmueller    schedule 21.08.2015
comment
кстати: я думаю, это зависит от того, как установлен ваш jenkins, какая среда java и, следовательно, какое хранилище ключей используется. Вы уже проверили, какой jre/jdk используется, или вы искали все хранилища ключей на вашем компьютере?   -  person rdmueller    schedule 21.08.2015
comment
Я упомянул, что успешно попробовал свой скрипт в groovyConsole. Я зарегистрировал java.home, поэтому знаю, что сценарий JobDSL использует C:\Program Files (x86)\Jenkins\jre. Но я уже импортировал сертификат в это хранилище ключей cacerts.   -  person LucasF    schedule 21.08.2015
comment
так что это действительно очень странно... Вы пытались получить более подробную информацию об отладке через настройку -Djavax.net.debug=all? Эта запись в блоге также может быть полезна: группа/запись/   -  person rdmueller    schedule 21.08.2015
comment
В более старых версиях (1.35 и старше) подключаемый модуль Job DSL использовал некоторую магию пути к классам, чтобы создать собственную среду выполнения Groovy. Обязательно попробуйте последнюю версию. А также протестируйте свой сценарий в консоли сценариев Jenkins (например, localhost:8080/script). Если ваш скрипт там работает, то скорее всего проблема в плагине Job DSL.   -  person daspilker    schedule 21.08.2015
comment
Это последняя версия Jenkins и Plugin.   -  person LucasF    schedule 21.08.2015
comment
Я попробовал консоль сценария. Тот же результат, без успеха. Я не знаю, как установить -Djavax.net.debug=all для Дженкинса. Нужно ли запускать Jenkins с этим параметром?   -  person LucasF    schedule 22.08.2015


Ответы (1)


У меня это заработало после перезапуска службы Windows Jenkins. До этого я всегда перезапускаю Jenkins в самом приложении. Вроде есть разница между перезапуском службы и перезагрузкой Дженкинса в консоли.

После этого был найден сертификат CA, который я импортировал в C:\Program Files (x86)\jenkins\jre\lib\security\cacert.

person LucasF    schedule 31.08.2015