TLS1.2とMavenと時々Jenkinsの話とか

PCI DSSの基準によりTLS v1/v1.1が安全でない通信とされてから早1ヶ月以上が経った。

www.jcdsc.org

 

自分たちの運用するサイトもサクッとTLS1.2対応を済ませ、利用者の皆様には多少ご不便をおかけします、なんて思っていたら、自分が「ご不便」を被る羽目になった、そんなお話。

 

 

[PCI DSS曰く]

そもそもPCI DSSは、クレジットカードをセキュアに運用するためのシステム基準。

www.jcdsc.org

 

クレジットカードが安全なら他のデータにも使えるんじゃね?って理論で(多分。考えるのが面倒な訳じゃないと思う)、他の業界でもある種スタンダード的な存在である。

 

で、問題はこちらの資料。

https://ja.pcisecuritystandards.org/_onelink_/pcisecurity/en2ja/minisite/en/docs/Migrating-from-SSL-Early-TLS-Info-Supp-v1_1.pdf

 

引用しておく。

本書の発行時点ではTLS v1.1以上とされていましたが、TLS v1.2への移行を検討することが強く推奨されます。 ……(中略)……SSLおよび初期のTLSは強力な暗号化および安全なプロトコルの例ではなくなりました。……(中略)……2018年6月30日以降は、すべての事業体がSSL/初期のTLSをセキュリティコントロールとして使用することを中止し、プロトコルの安全なバージョンのみを使用する必要がある(2頁)

 

要約すると、「2018年6月30日以降はTLS1.2以外は認めん!」ということらしい*1

 

[何もしてないのに壊れたビルド]

訳あって数ヶ月ホコリを被っていたJenkinsジョブを蹴ってビルドしたところ、次のエラーがでた。本当はもっとスタックトレースとか出ていたけれど割愛する。

 

Failed to read artifact descriptor for org.apache.maven:maven-plugin-api:jar:3.0: Could not transfer artifact org.apache.maven:maven-plugin-api:pom:3.0 from/to central (https://repo.maven.apache.org/maven2): Received fatal alert: protocol_version -> [Help 1]

 

どうして!何も変更していないのに!!

そう、何もしていないからエラーが出るのである。今回ばかりは。

 

例によって、stackoverflow.comにお世話になる。

stackoverflow.com

-Dhttps.protocols=TLSv1.2JVM引数に追加してビルドを再実行せよとの助言がある。仰せに従うと、難なくビルドは成功した。

 

どうやら、我々がPCI DSSに対応しようとしたのと時を同じくして、Maven Centralリポジトリも同様の対応を行なっていたのが原因らしい。しかもHTTP/2まで。ぐぬぬ

blog.sonatype.com

 

[Javaのデフォルト・プロトコル

しかし、PCI DSSの影響もあり、大半のブラウザでデフォルトがTLS v1.2になっているこのご時世、MavenのサーバがTLS v1.2にプロトコルを限定したからと言って接続できなくなるJavaって……と思ったので調べてみた。

 

Diagnosing TLS, SSL, and HTTPS | Oracle Java Platform Group, Product Management Blog

Oracleによると、JDKのデフォルト・プロトコルは次のようになっている。

JDK 8: TLS v1.2

JDK 7: TLS v1

JDK 6: TLS v1*2

 

つまり、どうやらJenkinsでJDK 7を使っていたのも、今回の問題の一旦だったようだ。古いサーバとそのジョブもしっかりメンテしないといけない。良い教訓を学んだ。

 

[まとめ]

  • Javaでprotocol_versionのエラーが出たら-Dhttps.protocols=TLSv1.2のオプションを試す
  • Javaは8以降のバージョンを使うのが良い

 

今日のブログ執筆BGMはこちら。

www.youtube.com

*1:つい先日TLS v1.3の仕様が公開されたが、多分これも認められるはず。https://www.ietf.org/blog/tls13/

*2:JDK 6の場合はそもそもTLS v1.2に対応していなかったが、後に有償版でサポートされている。http://www.oracle.com/technetwork/java/javase/overview-156328.html#R160_121