既存のNginxサーバーで動作しているHTTP通信のWebサイトを、HTTPS通信に対応させる必要がある場合、SSL/TLS証明書の導入とサーバー設定の変更が必要です。本記事では、独自の認証局(CA)を立てて証明書を発行し、Nginxを設定して暗号化通信を実現する手順について解説します。
SSL/TLS証明書の基礎概念
HTTPS通信を実現するためには、サーバーの正当性を証明するデジタル証明書が必要です。証明書システムは階層構造(PKI:公開鍵基盤)を採用しており、最上位に位置するルート認証局(Root CA)が下位の証明書を署名(発行)します。クライアント(ブラウザ)は、信頼できるルート認証局のリストを持っており、そのルートによって署名された証明書であれば正規のものとして扱います。内部システムや開発環境などでは、このルート認証局を自身で構築し、独自に署名されたサーバー証明書を使用することが一般的です。
手順1:認証局およびサーバー証明書の作成
OpenSSLを使用して、プライベート認証局の構築とサーバー証明書の発行を行います。作業ディレクトリを作成し、以下のコマンドを実行してください。
1. プライベート認証局(CA)の作成
まず、認証局自身の秘密鍵と自己署名証明書を作成します。
# 認証局の秘密鍵を生成 (AES256で暗号化)
openssl genrsa -aes256 -out private_ca.key 4096
# 認証局の証明書を作成 (有効期限10年)
openssl req -new -x509 -days 3650 -key private_ca.key -out root_ca.crt
実行時にパスフレーズの設定や組織情報の入力が求められます。
2. サーバー証明書の作成
次に、Webサーバー用の秘密鍵と証明書署名要求(CSR)を作成し、1で作成した認証局で署名します。
# サーバーの秘密鍵を生成
openssl genrsa -out web_server.key 2048
# 証明書署名要求(CSR)を生成
openssl req -new -key web_server.key -out web_server.csr
CSRを生成する際、Common Name(CN)にはサーバーのドメイン名(Nginxのserver_nameと一致させる必要があります)を入力してください。
3. 設定ファイルの準備
署名時に適切な拡張情報を付与するため、設定ファイル(openssl_ext.cnf)を作成します。これにより、サーバー証明書としての適切な属性が設定されます。
[server_cert]
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = your-domain.com
DNS.2 = www.your-domain.com
alt_namesセクションのDNS.1などは、実際の環境に合わせてドメイン名を修正してください。
4. 認証局による署名
作成したCSRを認証局の秘密鍵で署名し、サーバー証明書を発行します。
# 認証局を使用してサーバー証明書を発行 (有効期限1年)
openssl x509 -req -days 365 -in web_server.csr -CA root_ca.crt -CAkey private_ca.key -CAcreateserial -out web_server.crt -extfile openssl_ext.cnf -extensions server_cert
手順2:Nginxの設定変更
発行した証明書と秘密鍵をサーバーに配置し、Nginxの設定ファイルを編集してHTTPS通信(ポート443)を有効にします。
server {
listen 443 ssl;
server_name your-domain.com;
# 証明書と秘密鍵のパスを指定
ssl_certificate /etc/nginx/ssl/web_server.crt;
ssl_certificate_key /etc/nginx/ssl/web_server.key;
# セッション設定
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# セキュリティ推奨の暗号化スイート
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /var/www/html;
index index.html index.htm;
}
}
設定ファイルの記述内容を確認した後、Nginxの設定テストを行い、サービスを再起動します。
nginx -t
systemctl restart nginx
手順3:クライアント側での信頼設定
手順2までの設定でサーバーはHTTPS通信を受け入れるようになりますが、使用している証明書が独自に作成した(自己署名のルートCAによる)ものであるため、ブラウザでアクセスすると「安全ではない接続」という警告が表示されます。これは、ブラウザがそのルート認証局を信頼していないためです。
この警告を解消し、正規のサイトとしてアクセスするには、クライアントのOSまたはブラウザに手順1で作成した「ルート証明書(root_ca.crt)」を「信頼するルート証明機関」としてインポートする必要があります。
Windows環境の場合、root_ca.crtファイルをダブルクリックし、「証明書のインストール」を選択します。「ローカルコンピューター」を選択し、証明書ストアの配置場所で「信頼されたルート証明機関」を指定してインストールを完了させてください。これにより、ブラウザは証明書のパスを検証し、警告なしにHTTPSサイトを表示できるようになります。