自己署名証明書の作成と HTTPS 対応
自己署名証明書(オレオレ証明書)を作成して SSL/TLS の暗号化通信を可能にします。
検証環境
- CentOS 7.3
- OpenSSL 1.0.1e
- Nginx 1.12.2
自己署名証明書の作成
※ 今回扱うファイル名が紛らわしいため先に名前を定義します。
秘密鍵作成
OpenSSL で鍵長 2048bit の RSA 秘密鍵を作成します。
# openssl genrsa 2048 > ./server.key Generating RSA private key, 2048 bit long modulus .......................+++ .........+++ e is 65537 (0x10001)
CSR 作成
作成した秘密鍵を引数に CSR を作成します。
コモンネームや組織名などの入力を求められますが、今回は自己署名証明書のため、入力は全て Enter でデフォルト値を設定してしまいます。
# openssl req -new -key ./server.key > ./server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
証明書作成
CSR に先ほど作成した秘密鍵で署名し、有効期限 10 年間として証明書を作成します。
# openssl x509 -days 3650 -req -signkey ./server.key < ./server.csr > ./server.crt Signature ok subject=/C=XX/L=Default City/O=Default Company Ltd Getting Private key
リダイレクトで出力した server.crt
が証明書ファイルとして使用できます。
Nginx の HTTPS アクセス設定
証明書の配置とアクセス権変更
作成した秘密鍵、CSR、証明書のうち、秘密鍵と証明書を Nginx で使用します。
nginx ディレクトリ配下に ssl ディレクトリを作成して格納します。
# mkdir /etc/nginx/ssl/ # cp -p ./server.key /etc/nginx/ssl/ # cp -p ./server.crt /etc/nginx/ssl/
秘密鍵と証明書のアクセス権は root の読み取りのみに限定します。
# chmod 400 /etc/nginx/ssl/server.* # chmod 700 /etc/nginx/ssl/
設定変更
Nginx の設定ファイルを編集します。
設定の要点は以下3つです。
- ポート 80 (HTTP) へのアクセスに対しては HTTPS にリダイレクトさせる
- ポート 443 (HTTPS) へのアクセスは SSL 設定を有効にする
- location 等の設定は全て SSL の server ディレクティブに記述する
# vi /etc/nginx/nginx.conf ...省略... server { listen 80; server_name localhost; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name localhost; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ...省略... }
ssl_protocols
と ssl_ciphers
については Mozilla SSL Configuration Generator で生成される設定を利用するのが一般的なようです。
設定の文法に問題がないことをテストしてリロードします。
# nginx -t /etc/nginx/nginx.conf nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # systemctl reload nginx
ブラウザからアクセスし、HTTPS の通信ができていること、HTTP が HTTPS にリダイレクトされることを確認します。
証明書情報が正しくないためブラウザからエラーが出ますが、エラーの無視や例外追加でページを閲覧することができます。