MacOSXにhomebrewを利用して、Jenkinsを導入しようとした際に、Javaで信用できないSSL証明書エラー(javax.net.ssl.SSLHandshakeException)が出た際の対応方法についてのメモ
※インストール方法は「mac jenkins brew」とかで検索すれば出て来るので割愛。
インストール完了後、起動して初期設定を行おうとした際、オフライン状態になってプラグインのインストールも全くできなかったのでログを見たところ、このようなエラーが出ていた。
Apr 28, 2018 12:40:10 AM hudson.model.UpdateCenter updateDefaultSite
警告: Upgrading Jenkins. Failed to update the default Update Site 'default'. Plugin upgrades may fail.
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(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
at hudson.model.DownloadService.loadJSON(DownloadService.java:167)
at hudson.model.UpdateSite.updateDirectlyNow(UpdateSite.java:190)
at hudson.model.UpdateCenter.updateDefaultSite(UpdateCenter.java:2194)
at jenkins.install.SetupWizard.init(SetupWizard.java:174)
at jenkins.install.InstallState$InitialSecuritySetup.initializeState(InstallState.java:142)
at jenkins.model.Jenkins.setInstallState(Jenkins.java:1033)
at jenkins.install.InstallUtil.proceedToNextStateFrom(InstallUtil.java:97)
at jenkins.install.InstallState$Unknown.initializeState(InstallState.java:75)
at jenkins.model.Jenkins$17.run(Jenkins.java:3149)
at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:169)
at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:296)
at jenkins.model.Jenkins$5.runTask(Jenkins.java:1062)
at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:214)
at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:117)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
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(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
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:1491)
... 29 more
Caused by: 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:382)
... 35 more
原因としては、javaで証明書を検証した際に、信用できない、という事なので、javaの信用済み証明書情報に直接証明書を追加すれば良いという話なので、下記の流れで追加して対応。
1. 証明書を入手
2018/4/28時点では、https://updates.jenkins.io/update-center.json
の証明書を入れれば大丈夫だったので、chromeなどでサイトにアクセスして、証明書を表示してDLする。
(証明書のDLについては、chromeでサイトを表示して、URL欄の「保護された通信」を押して「証明書」を選択、その後、表示されている証明書の"画像部分"を適当なフォルダにDrag&Dropすると、"updates.jenkins.io.cer"とかが手に入るはず)
2. keytoolで証明書を登録
cd `/usr/libexec/java_home`/jre/lib/security
sudo keytool -importcert -file [certをDLしたパス]/updates.jenkins.io.cer -keystore cacerts
この際キーストアのパスワードを聞かれるので "changeit" を入力する。
(デフォルト設定なので、"java default keystore password"とかで検索すると良いかと)
3. jenkins起動
これで、多分アクセスできるようになってるはず。