Nginx環境のWebサイトをHTTPからHTTPSへ移行する手順

既存の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サイトを表示できるようになります。

タグ: nginx SSL tls OpenSSL HTTPS

5月27日 23:33 投稿