Web開発者が恐らく知らない、SSLについて知っておくべきこと

2015年、Web開発者は以前よりもSSLに関する理解を深めています。そうしたWeb開発者たちがHacker Newsを読むなら知っておくべきことを以下に挙げてみます。

  • ドメイン認証(DV)証明書はLet’s Encryptから無料で取得することが可能。
  • 拡張認証(EV)証明書CertSimpleかいくつかのチェックののちの支払いで取得することが可能。これが我々のやり方。
  • Mozilla SSL Config Generatorを使用すれば、サポートしたいブラウザに対して、サーバを可能な限り安全に設定することが可能。
  • 完了後にSSL Labsを使って全てをチェックし、A評価獲得を確認しましょう。そうでなければ人に小言を言われます。

その他はどうでしょうか。我々の顧客から寄せられる最も多い質問について、回答を紹介していきましょう。

1. Chromeで”古い暗号スイート”を修正

SSL Labsには表示されないため、これが最も多く出てきます。例えばChromeで次のようなメッセージが出されるのです。

“接続は古い暗号スイートにより暗号化されています”

この場合は、WebサーバのconfigファイルにCBCではなくGCMを設定する必要があります。

これは非常に簡単です。ほとんどのWebサーバに最適な設定をMozilla SSL Config Generatorが教えてくれます。configファイルをアップデートし、Webサーバを再起動すれば、問題は解決されるでしょう。

2. 鍵/証明書の不一致を修正

以下のことを行った場合を考えてみましょう。

  • 使っている暗号化を変更した
  • 使っている証明書を更新した
  • 使っている秘密鍵を紛失し、新しい鍵ペアを作った

こうして、異なる鍵ペアに属しながら同じ名前がついた大量のファイルを持つことになります。すると、Webサーバが何か以下のような内容のメッセージを発します。

“エラー:公開鍵証明書と秘密鍵が合致しません”

これは、あなたが複数の鍵ペアを作り、そのうちのある一つの鍵ペアの秘密鍵を、また別の鍵ペアの証明書と合わせようとしている、ということを意味しているのです。

証明書ファイルが秘密鍵と一致するかどうかを確認するには、modulusをチェックすればよいでしょう。

#証明書のmodulusをチェック
openssl x509 -noout -modulus -in example.com.crt | shasum -a 256

#鍵のmodulusをチェック
openssl rsa -noout -modulus -in example.com.key | shasum -a 256

#証明書要求のmodulusをチェック
openssl req -noout -modulus -in example.com.csr | shasum -a 256

modulusが同じであれば、秘密鍵と証明書が一致するということになります。つまり、それらがペアになっているということです。

modulusが異なっていれば、ファイルはペアではなく、それぞれ別に作られたものということです。

3. ローカルホストに使用するSSLを設定

ジオロケーションを使いますか? WebRTCは? 最近のブラウザでは、セキュリティに敏感なHTML5の機能のためSSLを必要としています。

ローカルホストに無効なhttps://を設定している場合、SSLの警告を介してクリックばかりすることに大変な時間を費やすことになるでしょう。でも、そんなことをしなくてもよくなる、いいニュースがあります。お使いのMacに信頼できるローカルホストをセットアップするだけなら数分でできます

4. 4096ビットのRSA証明書はおそらく不要

1024ビットのRSAは安全でないと考えられています。あなたが見るほぼ全てのWebサイトは2048ビットのRSAを使用しています。では、なぜもうひと頑張りして4096ビットのRSA証明書を取得しないのでしょうか。

その答えは、余計な負荷がかかるため、ブラウザとあなたのサイト間でのSSLの応答確認が遅くなることがあるからです。この計測は、Chromeのデベロッパーツールを使えば簡単に行うことができます。

さらに、Geoffrey ThomasがHacker Newsで指摘しているように、あなたの中間CA証明書は2048ビットのRSA証明書である可能性が高いです。「2048ビットのRSAは、十分に暗号強度が高いとはいえない」と考えるならば、2048ビットの中間CA証明書も攻撃され、偽の証明書を発行するために利用される可能性があります(HPKPは別として)。

暗号強度を懸念するならば、RSAではなくECDSA証明書を試してみてください。ECDSAはRSAよりもCPU使用率を抑えながら、非常に高い強度を持っています。256ビットのECCが3072ビットのRSAと同等なのです。

ECCのサポートについて見ても、2015年にはWindows Vista以降、OS X 10.9、Android 3、iOS 7のブラウザがECCに対応しているという、驚くほど良いものです。問題としては、残念ながらHeroku、AWS CloudFrontがまだECCに対応していません。

5. 一般的なSSLファイル形式の変換方法

PKIとSSLに関しては多くのファイル形式がありますが、今日、ほとんどのサーバソフトウェアは以下の2つだけを使用しています。

PEM

  • HAProxy、Nginx、Apache、Node、およびOpenSSLを使用するその他で用いられている形式。
  • PEMはテキストベースで、鍵、証明書、およびCA証明書は-----BEGIN (TYPE)----------END (TYPE)-----を使用。
  • これらは通常は別々のファイルだが、一緒に組み合わせる、つまり同じファイルに貼り付けることも、あるいはテキストエディタで複数のファイルに分割することも、いずれも可能。

PKCS12

  • WindowsおよびTomcatで使用されるバイナリ形式(デフォルトの設定で)。拡張子は.pfxあるいは.p12
  • 秘密鍵、証明書、および中間証明書を一つのファイルに格納。

以下の方法により、これらの形式は互いに簡単に変換することができます。

#PEMをPKCS12に変換
openssl pkcs12 -export -inkey privatekey.pem -in cert.pem -certfile cacert.pem -out bundle.p12

#PKCS12ファイルをPEMに変換
#(変換後はテキストエディタでファイルを区切ることが可能)
openssl pkcs12 -nodes -in bundle.p12 -out bundle.pem