SSL証明書を購入する時のOpenSSLコマンドの覚え書き

2020年11月25日

OpenSSL

GMO グローバルサインで、クイック認証 SSL(ワイルドカード)を発行して Nginx に設定する機会がありました。OpenSSL のコマンドや参考にしたドキュメントを残します。他の認証局で発行する場合もだいたい同じだと思います。Amazon EC2 の Amazon Linux2 で動作確認を行っています。

目次

  1. 動作確認用に Nginx をインストールする
  2. 秘密鍵 を作成する
  3. 証明書署名要求(CSR) を作成する
  4. CSR を確認する
  5. サーバ証明書の購入をする
  6. サーバ証明書、秘密鍵の整合性を確認
  7. サーバ証明書と中間 CA 証明書を結合する
  8. Nginx に SSL 通信の設定する
  9. 動作確認
  10. トラブルシューティング サーバ証明書の階層構造の確認

SSL について事前知識のリンク

文中でも触れますが、事前知識として確認しておくと理解が深まります。

動作確認用に Nginx をインストールする

Amazon LInux2 にログインし、root ユーザで作業を行います。動作確認用に Nginx をインストールします。

amazon-linux-extras install nginx1

秘密鍵 を作成する

Nginx の設定ファイルがあるディレクトリに移動します。

cd /etc/nginx

2048bit の秘密鍵を作成します。秘密鍵のファイル名にはその年の番号などを含め、更新のたびに作り直します。

openssl genrsa -des3 -out 2020.wild.example.com.key 2048

秘密鍵のパスフレーズを解除します。秘密鍵にパスフレーズを設定したほうが秘密鍵の漏洩時に一定のセキュリティを確保できますが、Web サーバーの再起動時にパスフレーズ入力が必要となるため、運用のしやすさを考慮してパスフレーズを未設定にしています。

openssl rsa -in 2020.wild.example.com.key -out 2020.wild.example.com.key

証明書署名要求(CSR) を作成する

[CSR生成] nginx + OpenSSL(新規・更新) | サポート・お申し込みガイド | GMOグローバルサイン【公式】 を参考に進めます。

CSR を作成します。

openssl req -new -key 2020.wild.example.com.key -out 2020.wild.example.com.csr

入力を求められます。以下例です。今回はワイルドカード証明書なので、Common Name の FQDN にアスタリスクをつけています。

Country Name (国を示す2文字のISO略語) []:JP
State or Province Name (組織が置かれている都道府県) []:Tokyo
Locality Name (組織が置かれている市区町村) []:Shinjuku-ku
Organization Name (組織の名称) []:My Company Name
Organizational Unit Name (組織での部署名) []:Sales
Common Name (ウェブサーバのFQDN) []:*.example.com
Email Address (入力不要) []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password (入力不要) []:
An optional company name (入力不要) []:

CSR を確認する

以下のコマンドで CSR を確認できます。

openssl req -in 2020.wild.example.com.csr -text

Subject だけ表示することもできます。

openssl req -in 2020.wild.example.com.csr -noout -subject

サーバ証明書の購入をする

SSLサーバ証明書ご購入|GMOグローバルサイン から証明書を購入します。入力フォームに CSR のファイルの中身を入力する場所があるので、作成した CSR の内容を貼り付けます。

サーバ証明書、秘密鍵の整合性を確認

サーバ証明書を購入すると、メール本文や管理画面などから証明書の情報を確認することができます。サーバ証明書のデータ -----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- までをコピーし /etc/nginx/2020.ssl.example.com.crt ファイルに保存します。エディタの改行コードに注意しましょう。

入手したサーバ証明書と秘密鍵の Modulus を確認します。Modules が一致すれば整合性が取れていることが確認できます。

サーバ証明書の Modules を確認。

openssl x509 -in 2020.ssl.example.com.crt -noout -modulus

秘密鍵の Modules を確認。

openssl rsa -in 2020.ssl.example.com.key -noout -modulus

サーバ証明書と中間 CA 証明書を結合する

[インストール] nginx + OpenSSL(新規・更新) | サポート・お申し込みガイド | GMOグローバルサイン【公式】 を参考に進めます。

グローバルサインのサーバ証明書は 3 階層の証明書を発行しています。証明書を利用するには、中間 CA 証明書もあわせてサーバに設定する必要があります。中間 CA 証明書については 中間CA証明書に関して | サポート・お申し込みガイド | GMOグローバルサイン【公式】 を参照。

メール本文や ルート証明書/中間CA証明書 | サポート・お申し込みガイド | GMOグローバルサイン【公式】 から中間 CA 証明書を取得します。-----BEGIN CERTIFICATE----- から -----END CERTIFICATE----- までをコピーし /etc/nginx/dvcacert.cer ファイルに保存します。

-----BEGIN CERTIFICATE-----
   [中間CA証明書]
-----END CERTIFICATE-----

2 つのファイルを cat コマンドで結合します。

cat 2020.wild.example.com.crt dvcacert.cer > 2020.wild.example.com.pem

結合した結果、以下のようになっていれば OK です。

-----BEGIN CERTIFICATE-----
   [サーバ証明書]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
   [中間CA証明書]
-----END CERTIFICATE-----

エディタの改行コードの関係で結合後のファイルが -----END CERTIFICATE----------BEGIN CERTIFICATE----- のようになってしまう場合は以下のコマンドで間に改行をはさみます。

cat 2020.wild.example.com.crt <(echo) dvcacert.cer > 2020.wild.example.com.pem

Nginx に SSL 通信の設定する

Nginx の設定ファイルで以下のように設定をします。

server {
    listen 443;
    server_name ssl.example.com;

    ssl on;
    ssl_certificate 2020.wild.example.com.pem;
    ssl_certificate_key 2020.wild.example.com.key;
}

Nginx のリロードで反映されます。

systemctl reload nginx

本番環境では Nginx の SSL の推奨設定は以下のサイトのテンプレートを参考にすると良いです。
Mozilla SSL Configuration Generator

動作確認

ブラウザから確認しても良いですが、コマンドラインからも確認ができます。

openssl s_client -connect example.com:443 | openssl x509 -dates -noout

トラブルシューティング サーバ証明書の階層構造の確認

何台もサーバを管理していて更新時期が重なったとき、誤って中間 CA 証明書に間違ったものを使用してしまい、ブラウザに警告が表示されたことがありました。以下の方法でサーバ証明書の階層構造が正しいかどうか事前に確認をすることができます。

中間証明書の Issuer から、中間 CA 証明書の上位のルート証明書を確認します。

openssl x509 -in dvcacert.cer -issuer -noout

該当のルート証明書をサーバ上で探します。trust list コマンドでインストールされているか確認ができます。たくさん表示されるのでgrep コマンドで絞り込むと良いでしょう。

 trust list | grep -i GlobalSign

インストールが確認できたらルート証明書のファイルを探します。Amazon Linux2 の場合は Red Hat 7 系の OS と同じく /etc/pki/tls/certs/ca-bundle.crtにあります。詳しくは 4.14. 共有システムの証明書の使用 Red Hat Enterprise Linux 7 | Red Hat Customer Portal を参照。

以下のコマンドでルート証明書、中間 CA 証明書、サーバ証明書の階層構造が正しいか確認します。

openssl verify -CAfile <(cat /etc/pki/tls/certs/ca-bundle.crt dvcacert.cer) 2020.wild.example.com.crt

正しい場合は以下のような出力になります。

2020.wild.example.com.crt: OK

階層構造がおかしい場合は以下のようなエラーになります。ルート証明書が見つからないというエラーです。

error 20 at 0 depth lookup:unable to get local issuer certificate

-技術ブログ
-