build時に証明書関係のエラーが出て少し困ったのでメモしておきます。
目次
環境
- Windows10 Pro
- openjdk 1.8.0_345
- bazel 5.3.1
エラー内容
必要なファイルをインターネット経由で探してくる際に証明書の検証に失敗している様子です。
多分会社内にProxyがある環境だと出るかも。
# エラー内容抜粋
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
対処方法
基本的にはbazelが動作するJava(JVM)に対して、きちんと証明書を登録してあげると解決します。
どの証明書が足りないかは…頑張って調べます。
1. bazelが使用しているJavaの場所を確認します
コマンドプロンプトを起動して以下を入力します。
# pathに設定しているjava.exeを確認
$ java -version
openjdk version "1.8.0_345"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_345-b01)
OpenJDK 64-Bit Server VM (Temurin)(build 25.345-b01, mixed mode)
# javaの場所を確認
$ where java
C:\Program Files\Eclipse Adoptium\jdk-8.0.345.1-hotspot\bin\java.exe
2. cacertsファイルの場所を確認します
前の手順で調べたJavaの場所でbin
の1つ上の階層(ここではjdk-8.0.345.1-hotspot
)に移動します。以下のような場所です。
jre若しくはlibの下にsecurity
というフォルダが無いかを確認します。
私の環境だと以下にありました。
C:\Program Files\Eclipse Adoptium\jdk-8.0.345.1-hotspot\jre\lib\security
securityフォルダ以下にcacerts
というファイルがあることを確認します。
次の手順ではこのファイルを更新していきます。
3. keytoolコマンドを使用してcacertsを更新します
ここで必要となるのは、
- エイリアス(登録する証明書の別名。まぁ分かりやすい名前であれば良いです。)
- 前の手順で調べたcacertsの場所
- 登録する証明書の場所
# command sample
$ keytool -import -alias <your_alias> -keystore <your_cacerts_path> -file <cert_path>
# 今回の例だと…
$ keytool -import -alias my_cert -keystore C:\Program Files\Eclipse Adoptium\jdk-8.0.345.1-hotspot\jre\lib\security\cacerts -file ./my_cert.crt
4. bazelが動作するJVMをオプション付きで起動します
既にbazelを起動している場合は一度停止しておいた方が良いです。
オプションとしてはjvm_args
を一つ追加するだけになります。
bazel --host_jvm_args '-Djavax.net.ssl.trustStore=C:\Program Files\Eclipse Adoptium\jdk-8.0.345.1-hotspot\jre\lib\security\cacerts' build src:all
もし他にも証明書が必要な場合は同様の手順でkeytoolで証明書を登録してbazelを再起動する必要があります。
恐らくこれで証明書関係のエラーが無くなり、通信出来るようになるかと思います。