最近、決済サービスや大手ウェブサイトでSSL接続をTLS1.2に限定する動きが加速しています。
- TLS1.2に関するご案内|セディナ
https://www.cedyna.co.jp/info/tls/ - Yahoo!セキュリティセンター | Yahoo!
https://security.yahoo.co.jp/news/tls12.html - Webサイトにおけるセキュリティ強化(TLS1.2)への対処方法について知りたい|So-net
https://support.so-net.ne.jp/supportsitedetailpage?id=000013950K
TLS1.2に限定する理由としては、SSLの脆弱性「POODLE」によりSSLv2 / SSLv3 / TLS1.0 / TLS1.1を使用した暗号化通信内容の一部を解読できてしまうためです。
特にクレジットカード情報を取り扱う場合には致命的であるため、クレジットカード国際基準では2018年6月30日までにTLS1.2未満の利用を停止することになりました。
さて、SSL接続はサーバ側の対応だけでなく、クライアント側もTLS1.2対応が必要になります。
例えばホームページにアクセスしてきたクライアントのSSL接続がどのバージョンなのかを判別できれば、古いバージョンのSSL接続に対して注意喚起ができます。
また、システム開発者にとってはシステムが外部のAPIを叩くことを想定したときに、どのバージョンのSSL接続をしているのかを事前に把握できればTLS1.2への移行がスムーズになります。
このSSL接続のバージョン判定をPHPで手軽にできる方法はないかなと検索してみたのですが、意外に有用な情報が見つかりませんでした。そこで私が実現した方法を紹介いたします。
PHPでバージョン判定する
.htaccessにオプションを追加する
1 |
SSLOptions +StdEnvVars |
ちなみにStdEnvVarsを有効にするとサーバ側のCPU負荷が上がる傾向にあるようなので使用するディレクトリ限定にした方が良いと思います。
PHPを書く
StdEnvVarsを指定すると環境変数SSL_PROTOCOLが使えるようになるので、これを使ってSSL接続を判定します。
1 2 3 |
<?php echo $_SERVER['SSL_PROTOCOL']; ?> |
たったこれだけです。
ブラウザでアクセスするときちんとTLS1.2と判別できました!
ちなみにインターネットオプションでTLS1.2を無効にしてアクセスするときちんとTLS1.1と判定してくれます。
なおCGI版PHPを使用している場合はSSL_PROTOCOLではなくREDIRECT_SSL_PROTOCOLを使用する必要があります。
1 2 3 |
<?php echo $_SERVER['REDIRECT_SSL_PROTOCOL']; ?> |
まとめ
ニッチな内容でしたがいかがでしたでしょうか。
GoogleのSEO対策としても注目されているSSL接続ですが、本来のSSL導入の目的は暗号化通信によるセキュリティ担保です。単純にSSLを導入するだけでなくどのバージョンを利用しているかを把握して、脆弱性のない暗号化通信を行いましょう。