PCI DSSの基準によりTLS v1/v1.1が安全でない通信とされてから早1ヶ月以上が経った。
自分たちの運用するサイトもサクッとTLS1.2対応を済ませ、利用者の皆様には多少ご不便をおかけします、なんて思っていたら、自分が「ご不便」を被る羽目になった、そんなお話。
[PCI DSS曰く]
そもそもPCI DSSは、クレジットカードをセキュアに運用するためのシステム基準。
クレジットカードが安全なら他のデータにも使えるんじゃね?って理論で(多分。考えるのが面倒な訳じゃないと思う)、他の業界でもある種スタンダード的な存在である。
で、問題はこちらの資料。
引用しておく。
本書の発行時点では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にお世話になる。
-Dhttps.protocols=TLSv1.2
をJVM引数に追加してビルドを再実行せよとの助言がある。仰せに従うと、難なくビルドは成功した。
どうやら、我々がPCI DSSに対応しようとしたのと時を同じくして、Maven Centralリポジトリも同様の対応を行なっていたのが原因らしい。しかもHTTP/2まで。ぐぬぬ。
[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のデフォルト・プロトコルは次のようになっている。
つまり、どうやらJenkinsでJDK 7を使っていたのも、今回の問題の一旦だったようだ。古いサーバとそのジョブもしっかりメンテしないといけない。良い教訓を学んだ。
[まとめ]
今日のブログ執筆BGMはこちら。
*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