開発時にJenkinsを使ってビルドを行っています。
コミットすると勝手にビルドしてくれるのでとても便利だなぁと思っていました。
しかし、つい最近コミットした際、なぜかビルドが失敗したのです。
ログを確認すると見慣れない以下の文言が。。
Received fatal alert: protocol_version -> [Help 1]
慌てて確認したところ、Maven Centralリポジトリ側でセキュリティの仕様が変わっていたようです。
私のほかにも困っている人がいるかもしれませんので、その際に調べた内容と対応策をご紹介します。
ちなみに、今回エラーが起きた環境は以下のような感じです。
[環境]
Jenkinsでビルド
Maven使用中
Java7(Springフレームワーク)
[コミット内容]
pom.xmlのdependenciesに「Apache Commons Email」を追加。
[エラー内容]
Received fatal alert: protocol_version -> [Help 1]
2018年6月末にMaven CentralリポジトリがHTTP/2(TLS1.2)に対応
従来使用されていたTLS1.0とTLS1.1プロトコルにはセキュリティ上の弱点がいろいろとあったようです。
そのため、2018年の6月をもって、Maven Centralへの接続ではTLS1.0および1.1を使用したSSL通信はサポート外になっていました。
In June, in an effort to raise security and comply with modern standards, the insecure TLS 1.0 & 1.1 protocols will no longer be supported for SSL connections to Central.
Enhancing SSL Security and HTTP/2 support for Central
これに伴い、Maven CentralでもHTTP/2に対応したそうです。
At the same time, this conversion will allow Central to support HTTP/2 with potential performance gains for modern http clients.
Enhancing SSL Security and HTTP/2 support for Central
HTTP/2でTLSを使用する際はTLS 1.2以降が必須とされているため、自動的にMaven CentralもTLS1.2のみをサポートする形になりました。
2018年6月18日を境に変更されたため、この日以降に”Received fatal alert: protocol_version”や”peer not authenticated”といったエラーに遭遇した場合は、この変更によるものだそうです。
参考:Discontinued support for TLSv1.1 and below
ちなみに、HTTP/2に関する詳細はこちらの記事が詳しいです。
参考:普及が進む「HTTP/2」の仕組みとメリットとは
Received fatal alert: protocol_version -> [Help 1]への対処法
先ほど参考に挙げたページでは、以下のように4つの解決策を提示しています。
1. Upgrade your Java runtime, for example with OpenJDK builds or Oracle paying support
Discontinued support for TLSv1.1 and below
2. Configure your Java runtime to enable TLS 1.2 by adding -Dhttps.protocols=TLSv1.2
3. Use a repository manager that uses a Java version supporting TLS 1.2
4. Revert back to http until you can acheive one of the above remediation steps.
ですが、この中で一番対応しやすいのは「-Dhttps.protocols=TLSv1.2」を追加する方法かなと思います。
特別な事情がない限りは、この設定を追加して再度ビルドすればTLS1.2に対応できますね。
こちらのstackoverflowも参考になりますよ。
参考:Why am I getting “Received fatal alert: protocol_version” or “peer not authenticated” from Maven Central?
終わりに
Jenkinsを含め、サーバー側は長く稼働することが多いので、定期的なメンテナンスが大事ですね。
私も面倒がらずにメンテをしていこうと思います。
以上です。それでは。