導入
このチュートリアルでは、信頼性のある商用証明機関(CA)からSSL証明書を取得してインストールする方法を紹介します。SSL証明書により、Webサーバーはトラフィックを暗号化するだけでなく、訪問者に対してサーバーの正当性を検証する仕組みも提供します。SSLを使用しているウェブサイトはhttps://
プロトコルでアクセスされます。
2010年代半ば以前、多くの小規模なウェブサイトは常にSSLまたはHTTPSを使用していませんでした。その後、セキュリティの期待値が高まり、Let’s Encryptプロジェクトが大規模な無料の信頼性のあるSSL証明書を提供するために作成され、ほぼすべての人が必要に応じてHTTPSを使用できるようになりました。
ただし、Let’s Encryptの証明書にはいくつかの制限があります。有効期限は3か月ごとに切れ、通常は機能する自動更新スクリプトが必要です。このような環境で使用する場合には扱いが難しいこともあります。Let’s Encryptは拡張検証証明書を提供せず、ウェブプレゼンスの法的所有権を検証することや、ワイルドカード証明書を提供しません。ワイルドカード証明書は、手動でそれぞれを登録することなく、ウェブサイトのすべての可能なサブドメイン(例:shop.example.com)と自動的に一致します。
ほとんどのユーザーにとって、これらは重要な制限ではありません。Let’s Encryptは多くの個人や商業のウェブサイトで人気のあるオプションです。ただし、特定のエンタープライズソフトウェアの要件や非常に大規模な商業活動を行っている場合は、商業的なCAから証明書を購入することを検討する必要があります。
このチュートリアルでは、信頼できる証明書機関からSSL証明書を選択して展開する方法について説明します。SSL証明書を取得した後は、このチュートリアルではNginxとApacheウェブサーバーにインストールする方法も説明します。
前提条件
商業的なCAからSSL証明書を取得する前に、いくつかの前提条件があります:
-
登録されたドメイン名。このチュートリアルでは
example.com
を使用します。ドメイン名はNamecheapで購入することもできますし、Freenomで無料で取得することもできます。また、ご自身の選択したドメイン登録業者を利用することもできます。 -
ドメインのWHOISレコードにあるメールアドレスのいずれか、またはドメイン自体の「管理者タイプ」のメールアドレスへのアクセス。SSL証明書を発行する認証局は通常、ドメインのWHOISレコードにあるアドレスのいずれか、またはドメイン自体の一般的な管理者メールアドレスに対して確認メールを送信してドメインの制御を確認します。拡張検証証明書を発行するためには、ウェブサイトの所有者の法的な身元を確立するための書類などを認証局に提供する必要もあります。
-
サーバーのためのDNSレコードの設定。DigitalOceanを使用している場合は、詳細については当社のDNSドキュメントを参照してください。
このチュートリアルでは、Ubuntu 22.04の初期サーバーセットアップチュートリアルに従って設定されたUbuntu 22.04サーバーの構成手順を提供します。これには、sudoが有効な非rootユーザーとファイアウォールが含まれます。ほとんどの最新のLinuxフレーバーは同様に機能します。
また、NginxやApacheのようなウェブサーバーをインストールしている必要があります。これには、Ubuntu 22.04にNginxをインストールする方法またはUbuntu 22.04にApacheウェブサーバーをインストールする方法に従う必要があります。ドメインにサーバーブロック(またはApacheの仮想ホスト)があることを確認してください。
ステップ1 – 証明書認証局の選択
証明書認証局を選択する際には、いくつかの要素を考慮する必要があります。
ルート証明書プログラムのメンバーシップ
最も重要なポイントは、選択するCAが最も一般的に使用されているオペレーティングシステムとウェブブラウザのルート証明書プログラムのメンバーであることです。つまり、信頼されたCAであり、そのルート証明書が一般的なブラウザや他のソフトウェアに信頼されているということです。ウェブサイトのSSL証明書が信頼されたCAによって署名されている場合、その正当な身元はCAを信頼するソフトウェアによって有効と見なされます。
遭遇するほとんどの商用CAは一般的なルートCAプログラムのメンバーである可能性がありますが、証明書の購入前に確認することは損はありません。たとえば、Appleは信頼されたSSLルート証明書のリストを公開しています。
証明書の種類
必要な証明書の種類を提供するCAを選択するようにしてください。多くのCAはこれらの証明書のバリエーションをさまざまな名前と価格設定で提供しています。以下に各種類の簡単な説明を示します:
- シングルドメイン:単一のドメインに使用されます。例:
example.com
です。ただし、www.example.com
などの追加のサブドメインは含まれません。 - ワイルドカード:ドメインとそのサブドメインに使用されます。たとえば、
*.example.com
のワイルドカード証明書は、www.example.com
やstore.example.com
にも使用できます。 - 複数のドメイン:SANまたはUC証明書として知られ、Subject Alternative Nameフィールドに追加された複数のドメインとサブドメインで使用することができます。例えば、単一のマルチドメイン証明書は、
example.com
、www.example.com
、およびexample.net
などと共に使用できます。
上記の証明書タイプに加えて、CAが提供する検証レベルには、以下のようなものがあります:
- ドメイン検証(DV):DV証明書は、CAがリクエスト主が該当するドメインを所有または制御していることを検証した後に発行されます。
- 組織検証(OV):OV証明書は、発行するCAがリクエスト主の法的な身元を検証した後にのみ発行されます。
- 拡張検証(EV):EV証明書は、発行するCAが厳格なガイドラインに従って、リクエスト主の法的な身元などを検証した後にのみ発行されます。このタイプの証明書の目的は、組織の正当性をサイトの訪問者に追加の保証することです。EV証明書は単一ドメインまたはマルチドメインであることができますが、ワイルドカードではありません。
追加機能
多くのCAは、他のSSL証明書発行業者との差別化を図るために、さまざまな「ボーナス」機能を提供しています。これらの機能のいくつかは、お金を節約することができるため、購入前に自分のニーズと提供内容を比較することが重要です。注目すべき機能の例としては、無料の証明書再発行や、www.
とドメインの基本名(例:www.example.com
)の両方に対応する単一ドメイン価格の証明書になります。SANにはexample.com
が含まれます。
ステップ2 – CSRとプライベートキーの生成
前提条件が整っていることを確認し、必要な証明書のタイプを把握したら、証明書署名要求(CSR)とプライベートキーを生成する準備ができます。
ウェブサーバーとしてApache HTTPまたはNginxを使用する予定の場合、ウェブサーバー上でopenssl
コマンドを使用してプライベートキーとCSRを生成できます。このチュートリアルでは、関連するすべてのファイルをホームディレクトリに保存しますが、サーバー上の任意の安全な場所に保存しても構いません:
以下のコマンドを実行して、example.com.key
という名前のプライベートキー、およびexample.com.csr
という名前のCSRを生成します(example.com
の部分は、ご自身のドメイン名に置き換えてください)。
- openssl req -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr
この時点で、証明書リクエストに含まれる複数の情報の入力を求められます。最も重要なのは、Common Name
フィールドであり、証明書を使用する名前と一致する必要があります。例えば、example.com
、www.example.com
、または(ワイルドカード証明書リクエストの場合)*.example.com
です。OVまたはEV証明書を取得する予定の場合は、他のすべてのフィールドが組織やビジネスの詳細を正確に反映していることを確認してください。”チャレンジパスワード”の提供は必要ありません。
例:
OutputCountry Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
これにより、.key
ファイルと.csr
ファイルが生成されます。.key
ファイルは秘密鍵であり、安全に保管する必要があります。.csr
ファイルは、SSL証明書をリクエストするためにCAに送信するものです。
- ls example.com*
Outputexample.com.csr example.com.key
CAに証明書リクエストを送信する際に、CSRをコピーして貼り付ける必要があります。CSRの内容を印刷するには、cat
コマンドを使用します。
cat example.com.csr
これで、CAから証明書を購入する準備が整いました。
ステップ3 – 証明書の購入と取得
多くの商用CAプロバイダがありますので、自分のセットアップに最適なオプションを比較検討することができます。例えば、NamecheapはSSL証明書のリセラーとして機能し、過去に最適な価値を提供するために上位のCAプロバイダを変更してきました。現在はComodo CAの証明書を提供しています。以下は、2022年12月の彼らの提供内容の一部です:
選択を行った後、前のステップで生成したCSRをアップロードする必要があります。CAプロバイダによっては、「承認者」のステップもあるかもしれません。このステップでは、ドメインのWHOISレコードにあるアドレスまたは証明書を取得するドメインの「管理者」タイプのアドレス宛に、検証リクエストのメールが送信されます。
証明書を承認した後、証明書は指定した管理者にメールで送信されます。プライベートキーとCSRを生成した場所と同じ場所に、ドメイン名とexample.com.crt
)と中間証明書(intermediate.crt
)を保存してください。
証明書は、ウェブサーバにインストールする準備が整いましたが、まずはファイアウォールにいくつかの変更を加える必要があるかもしれません。
ステップ4 – HTTPSを許可するためにファイアウォールを更新する
Ubuntu 22.04セットアップガイドで推奨されているように、ufw
ファイアウォールが有効になっている場合、HTTPSトラフィックを許可するために設定を調整する必要があります。NginxとApacheは、インストール時にufw
にいくつかのプロファイルを登録します。
次のコマンドを入力して現在の設定を確認できます:
- sudo ufw status
出力にNginx HTTP
またはApache
のいずれかが含まれている場合、WebサーバーへのHTTPトラフィックのみが許可されています:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
HTTPSトラフィックも許可するには、Nginx Full
またはApache Full
プロファイルを許可し、重複したHTTPプロファイルの許可を削除します:
- sudo ufw allow 'Nginx Full'
- sudo ufw delete allow 'Nginx HTTP'
これにより、次のような結果が表示されるはずです:
- sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
最後のステップでは、証明書をインストールします。
ステップ5 – サーバーに証明書をインストールする
選んだCAから証明書を取得したら、ウェブサーバーにインストールする必要があります。これには、いくつかのSSL関連の設定をウェブサーバーソフトウェアの設定に追加する作業が含まれます。
このチュートリアルでは、Ubuntu 22.04でのNginxとApacheの設定方法について説明しますが、ほとんどの最新のLinuxディストリビューションでも同様に動作します。また、このチュートリアルでは以下の前提条件を想定しています:
- 秘密鍵、SSL証明書、および必要な場合はCAの中間証明書がホームディレクトリの
/home/sammy
にあることを前提としています。 - 秘密鍵のファイル名は
example.com.key
です。 - SSL証明書は
example.com.crt
と呼ばれます。 - プロバイダーから返されたCA中間証明書は、
intermediate.crt
というファイルに保存されます。
注意:本番環境では、これらのファイルはウェブサーバープロセス(通常はroot
)のみがアクセスできる場所に保存され、秘密鍵は安全に保管されるべきです。たとえば、Let’s Encryptは生成された証明書を/etc/letsencrypt
に保存します。本番環境の例は、マルチサーバー構成の複雑さによって異なる場合があります。
Nginx
NginxにSSL証明書を手動で展開する手順は次のとおりです。
もしCAから中間証明書のみが返された場合は、証明書とCAの中間証明書を含む「チェーンされた」証明書ファイルを作成する必要があります。
証明書ファイルがexample.com.crt
と呼ばれる場合、cat
コマンドを使用してファイルを連結し、example.com.chained.crt
という結合ファイルを作成できます。
- cat example.com.crt intermediate.crt > example.com.chained.crt
nano
またはお好みのテキストエディタを使用して、デフォルトのNginxサーバーブロックファイルを編集します。
- sudo nano /etc/nginx/sites-enabled/default
listen
ディレクティブを検索し、listen 443 ssl
に変更します。
…
server {
listen 443 ssl;
…
次に、同じサーバーブロック内でserver_name
ディレクティブを見つけ、その値が証明書の共通名と一致していることを確認してください。また、ssl_certificate
およびssl_certificate_key
ディレクティブを追加して、証明書と秘密鍵ファイルのパスを指定してください:
…
server_name example.com;
ssl_certificate /home/sammy/example.com.chained.crt;
ssl_certificate_key /home/sammy/example.com.key;
…
最も安全なSSLプロトコルと暗号スイートのみを許可するために、以下の行をファイルに追加してください:
…
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
…
最後に、HTTPリクエストをデフォルトでHTTPSにリダイレクトするために、別のサーバーブロックをファイルの先頭に追加することができます:
server {
listen 80;
server_name example.com;
rewrite ^/(.*) https://example.com/$1 permanent;
}
…
ファイルを保存して閉じます。もしnano
を使用している場合は、Ctrl+X
を押し、次にプロンプトが表示されたらY
を押してEnterキーを押します。
Nginxを再起動する前に、nginx -t
コマンドを使用して設定を検証することができます:
- sudo nginx -t
問題がなければ、SSL over HTTPSを有効にするためにNginxを再起動してください:
- sudo systemctl restart nginx
HTTPS経由でサイトにアクセスして動作をテストしてください。例:https://example.com
。また、HTTP経由で接続してリダイレクトが正しく機能していることも確認してください。例:http://example.com
。
Apache
これはApacheでSSL証明書を手動で展開する手順です。
nano
またはお気に入りのテキストエディタを使用して、デフォルトのApache仮想ホストファイルを編集します:
- sudo nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
エントリを見つけ、Webサーバーがポート443
でリスンするように変更します。
…
<VirtualHost *:443>
…
次に、ServerName
ディレクティブを追加します(既に存在しない場合):
…
ServerName example.com
…
次に、以下の行を追加して、証明書とキーのパスを指定します:
…
SSLEngine on
SSLCertificateFile /home/sammy/example.com.crt
SSLCertificateKeyFile /home/sammy/example.com.key
SSLCACertificateFile /home/sammy/intermediate.crt
…
この時点で、サーバーはHTTPS(ポート443)のみでリッスンするように設定されているため、HTTP(ポート80)へのリクエストは処理されません。HTTPリクエストをHTTPSにリダイレクトするには、ファイルの先頭に以下を追加します(両方の場所で名前を置き換えてください):
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>
…
ファイルを保存して閉じます。もしCtrl+X
を押して、プロンプトが表示されたらY
を入力し、Enterキーを押します。
次のコマンドを実行して、ApacheのSSLモジュールを有効にします:
- sudo a2enmod ssl
そして、新しい設定を読み込み、HTTPSでのTLS/SSLを有効にするために、Apacheを再起動します。
- sudo systemctl restart apache2
HTTPS経由でサイトにアクセスして動作を確認してください(例: https://example.com
)。リダイレクトが正しく機能していることを確認するために、HTTP経由で接続することもお勧めします(例:http://example.com
)。
まとめ
このチュートリアルでは、商用のCAからSSL証明書を購入する必要があるかどうかを判断する方法、利用可能なオプションを比較・対比する方法、NginxまたはApacheをHTTPS対応に設定する方法、およびその設定を本番環境に適応させる方法について学びました。
次に、ロードバランサーと連携する場合など、その他のSSLユースケースについて読むことをお勧めします。