第23回 SSLサーバー証明書の独自発行(自己署名証明書)

公開日:2020-01-21 更新日:2020-01-21

1. 動画



2. 概要

通常、SSLサーバ証明書は認証局に発行してもらいますが、
自分で認証局となり、証明書を発行することもできます。
今回は OpenSSL を使って、SSLサーバ証明書の発行を行ってみます。

3. OpenSSL のインストール

Windows の場合、OpenSSL は、Windows版 OpenSSL をインストールして、コマンドプロンプトで使うことができます。
または、Git for Windows をインストールして、Bash から使うこともできます。
Git for Windows のインストールは、こちらで説明しています。

4. SSLサーバ証明書の発行の流れ



5. ドメインの設定(hosts の修正)

メモ帳を右クリックして、「管理者として実行」で起動します。
メニューの開くで、C:\Windows\System32\drivers\etc のフォルダを表示して、
画面右下を「すべてのファイル」にして、hosts を開き、以下を追加します。
127.0.0.1 ca.test
127.0.0.1 test.test
127.0.0.1 www.test.test

保存後、コマンドプロンプトで、
ping ca.test、ping test.test、ping www.test.test で正常に動作すればOKです。
これでブラウザの URL に test.test を指定すると、127.0.0.1 として扱ってくれます。

6. SSLサーバ証明書の発行


1. [CA] 認証局の鍵の作成

秘密鍵 openssl genrsa -out ca_private_pem.key 2048
公開鍵 openssl rsa     -in ca_private_pem.key -pubout -out ca_public_pem.key

2. [CA] 認証局のSSLサーバ証明書(.crt)の作成

Webサーバ側のSSLサーバ証明書を作成する際に、Issuer(発行者)を載せるため必要。
組織情報などは以下のコマンド実行後に聞かれるので、指示に従って入力します。

openssl req -new -x509 -days 365 -key ca_private_pem.key -out ca_server_pem.crt

  入力例
  Country Name             : JP
  State or Province Name   : Tokyo
  Locality Name            : Chiyoda-ku
  Organization Name        : TEST CA Co.,Ltd.
  Organizational Unit Name : IT Dept.
  Common Name              : ca.test

3. [クライアント] SSLサーバ証明書のインストール

認証局(CA)のSSLサーバ証明書(ca_server_pem.crt)が作成されたら、
.crt ファイルをダブルクリックしてのインストールを行います。

「証明書のインストール」
->「現在のユーザー」
->「証明書をすべて次のストアに配置する」
->「参照」->「信頼されたルート証明機関」->「次へ」->「完了」

一般的なルートCAの証明書はPCに最初からインストールされていますが、
今回は独自のルートCA(プライベートCA)となるため、インストールが必要になります。
インストールした証明書は、保存先を「現在のユーザー」にした場合、
certmgr.msc を実行して、「信頼されたルート証明機関」で確認できます。

4. [Webサーバ] Webサーバ側の鍵の作成

秘密鍵 openssl genrsa -out web_private_pem.key 2048
公開鍵 openssl rsa    -in  web_private_pem.key -pubout -out web_public_pem.key

5. [Webサーバ] 証明書署名要求(.csr)の作成

openssl req -new -key web_private_pem.key -out web_server_pem.csr

  入力例
  Country Name             : JP
  State or Province Name   : Tokyo
  Locality Name            : Minato-ku
  Organization Name        : TEST Co.,Ltd.
  Organizational Unit Name : Sales
  Common Name              : test.test
  Email Address            : [Enter]
  A challenge password     : [Enter]
  An optional company name : [Enter]

6. [CA] Webサーバ側のSSLサーバ証明書(.crt)の作成

v3.ext の作成。サブジェクト代替名(subjectAltName)の指定で使用。
authorityKeyIdentifier=keyid, issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = test.test
DNS.2 = www.test.test

SSLサーバ証明書の作成
openssl x509 -req -sha256 -extfile v3.ext -days 365 -CA ca_server_pem.crt -CAkey ca_private_pem.key -CAcreateserial -in web_server_pem.csr -out web_server_pem.crt

SSLサーバ証明書の表示
openssl x509 -in web_server_pem.crt -text -noout

7. [Webサーバ] Nginx の設定

Nginxをダウンロードします。
Stable version の Windows版の nginx/Windows-x.x.x をクリックします。
今回は解凍して、c:/nginx として配置しました。

c:/nginx/conf/nginx.conf の修正
「#gzip on;」の下(34行目付近)に以下を追加。
    server {
        listen       443 ssl;
        server_name  localhost;
        
        ssl_certificate      ★★★ web_server_pem.crt  のフルパス ★★★;
        ssl_certificate_key  ★★★ web_private_pem.key のフルパス ★★★;
        
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

ssl_certificate には、Webサーバ側のSSLサーバ証明書のフルパスを指定します。
ブラウザから SSL でアクセスされた際に返すSSLサーバ証明書になります。

ssl_certificate_key には、Webサーバ側の秘密鍵のフルパスを指定します。
ブラウザから送信された共通鍵の作成情報を復号する際に使用します。

Nginx を起動します。コマンドプロンプトで以下を実行します。
cd c:/nginx
start nginx

Nginx を停止する時は以下を実行します。
cd c:/nginx
nginx -s stop

Nginx を起動したら、https://test.test/ にアクセスします。
「Welcome to nginx!」と表示されて、URLの左隣に正常な鍵のマークが表示されれば完了です。

表示されない場合は、タスクマネージャの詳細で nginx が起動していることと、
c:/nginx/logs/error.log でエラーログを確認してください。