WSL環境でルート・サーバ証明書を作成

概要

複数のサーバ証明書を作成する前提で、次の自己署名のルート証明書・サーバ証明書をコピペで作成する手順を紹介します。
実行環境として、Windows 11のWSL2で動作するUbuntu24.04.3 LTS(OpenSSL 3.0.13)を使用しています。

ファイル名説明
rootca.keyルート証明書の鍵
rootca.crtルート証明書
${SERVER}.keyサーバ証明書の鍵
${SERVER}.crtサーバ証明書
${SERVER}.pfxサーバ証明書・鍵ペア(PKCS#12形式)

手順

各手順のコマンドをコピペして、ターミナルに張り付けて実行してください。

  1. ルート証明書と鍵を生成します。
    mkdir -p ~/testcerts
    cd ~/testcerts/
    
    # ルート証明書の設定
    cat > rootca.cnf <<EOF
    [ req ]
    default_bits       = 4096
    prompt             = no
    default_md         = sha256
    distinguished_name = dn
    x509_extensions    = v3_ca
    
    [ dn ]
    C  = JP
    ST = Tokyo
    L  = Chiyoda
    O  = Dev Root CA
    OU = Development
    CN = Dev Root CA
    
    [ v3_ca ]
    basicConstraints       = critical, CA:true
    keyUsage               = critical, keyCertSign, cRLSign
    subjectKeyIdentifier   = hash
    authorityKeyIdentifier = keyid:always,issuer
    EOF
    
    # ルート証明書の鍵を生成(パスフレーズなし)
    openssl genrsa -out rootca.key 4096
    
    # ルート証明書を生成
    openssl req -x509 -new -key rootca.key -days 10950 -out rootca.crt -config rootca.cnf
  2. サーバ証明書を作成するためのパラメータ(環境変数)を定義します。
    追加でサーバ証明書を作成する場合、以降の手順を繰り返してください。

    SERVER=server           # ファイル名に使用
    FQDN=www.example.com
    KEY_PASS=secret         # 記号を含むとエラーの場合あり
    PFX_PASS=password       # PFXファイル未使用時は適当な値で良い
  3. サーバ証明書を作成します。
    # サーバ証明書の鍵を生成(パスフレーズあり))
    openssl genrsa -aes256 -passout pass:${KEY_PASS} -out ${SERVER}.key 4096
    
    # サーバ証明書の設定
    cat > server.cnf <<EOF
    [ req ]
    default_bits       = 4096
    prompt             = no
    default_md         = sha256
    distinguished_name = dn
    req_extensions     = req_ext
    
    [ dn ]
    C  = JP
    ST = Tokyo
    L  = Chiyoda
    O  = Dev Server
    OU = Development
    CN = ${FQDN}
    
    [ req_ext ]
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = ${FQDN}
    EOF
    
    # CSRの生成
    openssl req -new -key ${SERVER}.key -out ${SERVER}.csr -config ${SERVER}.cnf -passin pass:${KEY_PASS}
    
    
    # CAでのCSR署名の設定
    cat > ${SERVER}_ext.cnf <<EOF
    basicConstraints = CA:false
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = ${FQDN}
    EOF
    
    # CAによるサーバ証明書への署名
    openssl x509 -req -in ${SERVER}.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial \
      -out ${SERVER}.crt -days 10950 -sha256 -extfile ${SERVER}_ext.cnf
    
    
    # サーバ証明書と鍵をpfx(PKCS12)に纏める
    openssl pkcs12 -export -out ${SERVER}.pfx -inkey ${SERVER}.key -in ${SERVER}.crt \
      -passin pass:${KEY_PASS} -passout pass:${PFX_PASS}

動作確認

証明書の確認方法

次のコマンドでルート証明書の内容を確認できます。

openssl x509 -in rootca.crt -text -noout

# サーバ証明書の内容の確認
openssl x509 -in ${SERVER}.crt -text -noout

# サーバ証明書の内容の確認(PFX版)
openssl pkcs12 -info -in ${SERVER}.pfx -nodes

ルート証明書の場合は次のように出力されます。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
...
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:e9:e0:d9:5e:f6:08:ea:9f:62:e2:fd:67:80:c1:
...
        X509v3 extensions:
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Certificate Sign, CRL Sign
...

クライアントでの証明書エラーの解消

作成したルート証明書を「信頼されたルート証明機関」にインポートします。
※クライアントとして、Windowsを想定。

  1. エクスプローラにて、rootca.crtをダブルクリックします。
  2. 「全般」タブの「証明書のインストール」をクリックします。
  3. 「保存場所」で「現在のユーザー」を選択して、「次へ」をクリックします。
  4. 「証明書をすべて次のストアに配置する」の「証明書ストア」として「信頼されたルート証明機関」を選択し、「次へ」をクリックします。
  5. 「完了」をクリックします。
  6. 「この証明書をインストールしますか?」では「はい」をクリックします。
  7. エクスプローラにて、再度rootca.crtをダブルクリックします。証明書のエラーが表示されないことを確認します。

参考

  • ルート証明書を作成する必要性
    • Webサーバ用に自己署名のサーバ証明書を作成する場合、それぞれのサーバ証明書をクライアントの「信頼されたルート証明機関」にインポートする必要があります。
    • 多数のWebサーバを使用する場合、それぞれのサーバ証明書を同様にインポートする必要があります。また、開発者が複数になると、さらに大きな負担になります。
    • 各サーバ証明書をルート証明書で署名することで、このような負担を軽減できます。(ルート証明書のみのインポートで、複数のサーバ証明書のエラーを解消できます。)
  • 各ファイルの用途
    • 複数のサーバ証明書を作成する場合、同じrootca.key, rootca.crtを使用します。
    • ブラウザで「信頼するサーバ証明書」とするために、rootca.crtをクライアントの「信頼されたルート証明機関」にインポートします。
    • Apache HTTP ServerやNGINXなどでは、${SERVER}.key, ${SERVER}.crtを使用します。
    • Java実行環境、Windows(IIS, Azure)などでは、${SERVER}.pfxを使用します。