AND OR  

SSL/TLS

主にOpenSSLを用いたSSL/TLS関連のメモ。

  • OS環境: CentOS 7.x (x86_64)
  • OpenSSL: openssl-1.0.2k-8.el7.x86_64 (rpm)
  • Webサーバ: Nginx 1.12.2

ファイルの暗号化/復号化

opensslコマンドでファイルを暗号化/復号化する。パスワードにはUTF-8を利用可能(つまり日本語も可)。

SSL/TLSサーバ証明書(DV)の導入 - RapidSSL

ここでは RapidSSL でSSL証明書を購入、Nginxでサービスしているサイトに導入した。

Common Name は大切なので間違いないように正しくドメイン名を入力しよう。

作成したCSRファイルで適宜申請を行い、認証ファイルがダウンロードできるようになったら、http://{{Common Name}}/{{認証ファイル}} に設置して承認を待つ。承認されると晴れてSSL証明書が発行される。

X.509は公開鍵証明書の標準形式や証明書パス検証アルゴリズムなどを定めている規格のこと。

Nginxの設定ファイルでは中間証明書を指定するディレクティブがないため、発行されたサーバ証明書と中間証明書の2つを結合したファイルを作成しておく必要がある。
RapidSSLの場合、中間証明書はこちらからテキストをコピーして任意のファイルで作成しておく。

ファイルは以下の用なフォーマットで結合して作成しておけば良いようだ。

-----BEGIN CERTIFICATE-----
[サーバ証明書]
-----END CERTIFICATE-----
 
-----BEGIN CERTIFICATE-----
[中間証明書]
-----END CERTIFICATE----- 

Nginxの設定ファイルにSSLの設定を記述する。

サイトにhttpsでアクセスできるか確認するだけでなく、SSL証明書が正しくインストールされているか確認するサイトを利用すると良い。ここではRapidSSL(GeoTrust)の認証局のインストールチェッカーを利用する。

 700x635

SSL/TLSサーバ証明書(DV)の導入 - Let's Encrypt

Let's Encrypt(レッツ・エンクリプト)は、2016年4月に正式に開始された認証局である[1]。自動化された発行プロセスにより、TLSのX.509証明書の発行を無料で行っている。- via Wikipedia

SSLサーバ証明書導入については、独自ドメインがあれば、Certbot ACMEクライアントツールによる簡単なコマンド操作で証明書を無料で取得できる。前述のRapidSSLのような一般に認証局で証明書を取得する場合とは異なり、秘密鍵・公開鍵・署名リクエスト(CSR)を手動で生成する必要はなく、Certbotが内部で自動で処理してくれるようだ。

  • Certbotインストール
    Debian/RedHat系OSだと公式パッケージ配布されているようなので各々のパッケージ管理ツールからインストールできる。ここではCentOSなのでyumからパッケージインストールする。 依存パッケージがけっこうたくさん入ってしまうんだな。我慢しよう。
  • 証明書の取得
    対話形式でも処理できるけど、コマンドラインオプションから設定した方が楽だと思う。どちらでも良い。また、初回実行時はLet's Encryptの利用規約およびEFFからのメール購読の同意が求められるのでAgree/YESで答えておこう。
    ここではNginxがWebサーバとして稼働しているので、webrootオプションを指定して既存の環境を利用する。 ACMEプロトコルのドメイン使用権の認証方法(Identifier Validation Challenges)で http-01を使用する場合は、Certbotによってドキュメントルートに.well-known/というディレクトリを作成され、外部からHTTPアクセスされるので、Webサーバの設定でアクセス拒否しないように設定確認しておく。また、Nginxプラグインは2018/05現在はα版だそうなので、ここでは証明書取得のみ実行するcertonlyサブコマンドを指定している。
  • Webサーバの設定
    前述の手順で、/etc/letsencrypt/archive/{ドメイン名} ディレクトリ以下に証明書など必要なファイルの実体が設置されている。 SSLサーバ証明書と中間証明書の2つを結合したファイルは fullchain.pem、秘密鍵は privkey.pem となる。Nginxの設定作業は前述のRapidSSLでの証明書設定手順と同様なので省略する。2018/05現在だとTLS1.0も無効化して良いのかも。
  • 証明書の自動更新設定
    Let's Encryptの証明書は90日で期限失効してしまうので定期的な証明書更新作業が必要となるが、更新作業もCertbotを実行するだけで良い。証明書を更新するには renew サブコマンドを利用する。ここではNginxをWebサーバとして利用しているので、Nginxの再起動も併せて実行させておく。

SSL化対応作業が完了したら、Qualys社より提供されているSSL化したウェブサイトの安全性評価/脆弱性診断ツールである SSL Server Test を使ってみると良い。上記設定だとA評価となった。HSTSを有効にする等の追加設定を行うとA+になるみたいだったが、現時点ではHTTPS接続を強制するような設定にはしないこととした。

参考:

SSL/TLSサーバ証明書(DV)の導入 - Cloudflare

Cloudflare(クラウドフレア)は、コンテンツデリバリーネットワークやインターネットセキュリティサービス、分散型ドメイン名サーバシステムを提供するアメリカ合衆国の企業で、閲覧者とホスティングプロバイダー間でリバースプロキシとして動作する。DNSの変更でウェブサイトやモバイルアプリケーションに対応するネットワークの保護、速度向上や改善を実現している。本社はアメリカ合衆国カリフォルニア州サンフランシスコにあり、ロンドン、シンガポール、シャンペーン、オースティン、ボストン、ワシントンD.C.にもオフィスを構えている[1]。[2] - via Wikipedia

CloudflareはCDNサービスをはじめとして様々なサービスを提供しているが、Universal SSLと呼ばれる無料SSLサーバ証明書発行サービスも提供している。ここではCloudflareのアカウント開設および独自ドメイン設定については紹介しない。

  • Universal SSL設定
    WebUIから一項目を設定するだけ。前述のいずれのSSLサーバ証明書発行作業と比べて一番簡単。まずはHome画面から対象のドメインを選択、上記メニューから Crypto を選択する。
    cloudflare_crypto_setting.jpg
    ドロップダウンメニューの Off/Flexible/Full/Full(Strict) のオプションから選択する。各オプションの意味は公式サイトを見ると良い。
    What do the SSL options mean?
    Flexible SSLはユーザーとCloudflare間のみをHTTPS通信となり暗号化されるが、Cloudflareとオリジンサーバ間は通常のHTTP通信となる。Full SSLはCloudflareとオリジンサーバ間もHTTPS通信となるが、オリジンサーバのSSLサーバ証明書の有効性は検証されない。Full SSL(Strict)は検証済の有効なSSLサーバ証明書によるHTTPS通信となるため安全性・信頼性が一番高くなる。利用者の環境に合わせたオプションを選べば良い。例えばオリジンサーバにLet's Encryptの証明書を置いている場合は Full SSL(Strict) を選択することになる。Flexible SSLはやらないよりはマシかもしれないといった程度だけど、後述のOrigin Certificateを取得・設定して Full SSL(Strict) にしておいた方が良い。
  • Origin Certificate取得
    オリジンサーバのSSLサーバ証明書も無料で発行できる。Cloudflareを使っているならついでに作って設定してしまった方が楽。同じCrypto画面のCreate Certificateボタンをクリックすると以下の画面がポップアップする。
    cf_origin_certificate.png
    暗号アルゴリズムはRSAかECDSAのいずれかを選択、ワイルドカード証明書も発行できる。WebUI上から生成されたサーバ証明書と秘密鍵をコピーしてサーバ上の任意の(安全な)場所に保存、あとは以下から取得できる中間証明書と併せて設定するだけ。後は前述のRapidSSLでの証明書設定手順と同様なので省略する。Let's Encryptとは異なり、デフォルトで証明書の期限が15年もあるので自動更新の設定も実質不要となる。
    What are the root certificate authorities (CAs) used with Cloudflare Origin CA?
    生成された証明書を確認しておこう。
  • HSTSの設定(任意)
    CloudflareのWeb UI上からHSTSの設定もできる。常時SSL化移行期だと問題が起こることもあるので慎重に設定すること。CloudflareでもHSTSを有効化しようとすると、Acknowledgementが表示されて了承ステップを踏まないと有効化できなくなっている。収益化してない個人サイトとかなら難しく考えずに有効にしてよいと思う。