自己署名証明書の作成と HTTPS 対応

自己署名証明書(オレオレ証明書)を作成して SSL/TLS の暗号化通信を可能にします。

検証環境

  • CentOS 7.3
  • OpenSSL 1.0.1e
  • Nginx 1.12.2

自己署名証明書の作成

※ 今回扱うファイル名が紛らわしいため先に名前を定義します。

  • server.key : 秘密鍵 (CSR 作成, 署名兼用)
  • server.csr : CSR (証明書署名要求)
  • server.crt : 証明書

秘密鍵作成

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_protocolsssl_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 にリダイレクトされることを確認します。
証明書情報が正しくないためブラウザからエラーが出ますが、エラーの無視や例外追加でページを閲覧することができます。

参考サイト