OpenSSL で 証明書要求を作成、署名する方法

0 件のコメント

今回は「OpenSSL で サーバー証明書要求を作成、署名を行う方法」についてまとめます。

本記事は Windows 環境に OpenSSL がインストールされた状態で、認証局の設定も終わっていることを前提に説明しています。 Windows 環境に OpenSSL を導入する手順や認証局を構築する手順については別記事がありますので、必要に応じてご参照ください。

概要

認証局の準備が終わっていることを前提に、本記事の範囲はWebサーバーで秘密鍵を作成、その秘密鍵に応じた証明書要求を作成、認証局で証明書要求に署名して証明書を作成までです。 図で表すと以下のようなイメージになります。

ざっくりとした手順を書き並べると以下のようになります。

  1. Webサーバー上で「秘密鍵」を作成
  2. Webサーバー上で「秘密鍵」をベースに「証明書要求」を作成
  3. 認証局で「証明書要求」をベースに「証明書」を作成
  4. Webサーバー上で「秘密鍵」と「証明書」を利用してHTTPSアプリケーション開発

以下でその手順の詳細について見ていきます。

秘密鍵の作成

認証局構築で説明した内容と被るのでコマンドサンプルのみ載せます。 以下のいずれかを実行して秘密鍵を作成します。 実行環境が認証局上ではなくWebサーバー上となっているのが認証局のときと異なります。

  • DSA

    openssl dsaparam -genkey -noout -out "server_key.pem" 1024
    
  • RSA

    openssl genrsa -out "server_key.pem" 2048
    
  • ECC

    openssl ecparam -genkey -noout -name secp521r1 -param_enc explicit -out "server_key.pem"
    

証明書要求(CSR)の作成

Chrome58からCN(Common Name)にサーバー名を入れても参照しないのでエラーとなる問題が発生しています。 この問題を回避するためには、証明書要求を作成する際に「サブジェクト代替名(subjectAltName)」で「DNS」を指定してあげる必要があります。

以下の手順では「サブジェクト代替名」を指定できるような手順となっています。

  1. openssl.cfgをコピー

    サブジェクト代替名を記述したいので作業用に設定ファイルをコピーしておきます。

    コピー元:
    C:\Program Files\OpenSSL\bin\openssl.cfg
    コピー先:
    (任意の作業ディレクトリ)
  2. openssl.cfg に サブジェクト代替名 を追記

    以下のサンプルを参考に必要なコメントアウト削除およびサーバー名の設定変更を行います。 このDNSに設定するドメインは実際に証明書が使われるサーバーのクライアントから見たアドレスを設定します。

    [ req ]
    req_extensions = v3_req
    
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    
    [ alt_names ]
    DNS.1 = server1.example.com
    DNS.2 = mail.example.com
    DNS.3 = www.example.com
    
  3. 証明書要求(CSR)を作成

    以下のコマンドを実行して証明書要求(CSR)を作成します。 引数に取る秘密鍵は前述の「秘密鍵作成」で作ったもの、設定ファイルは前述のサブジェクト代替名を追記したものを指定します。

    openssl req -new -config "openssl.cfg" -key "server_key.pem" -out "cserver_csr.pem"
    
    オプション 説明
    -new 証明書要求を作成することを指定。
    -config filename 設定ファイルを指定。
    -key filename 証明書要求(CSR)生成に利用する秘密鍵。
    -out filename 出力する証明書要求(CSR)のファイル名。
  4. ウィザードに従って必要事項を入力

    手順3のコマンドを実行するとウィザードでサブジェクト入力が求められます。 かつては Common Name にサーバー名を入力していましたが(今もしますが…)、この値を Chrome 58 以降は見なくなりました。

    ----
    Country Name (2 letter code) [AU]:JP
    State or Province Name (full name) [Some-State]:Tokyo-to
    Locality Name (eg, city) []:Minato-ku
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Some Company
    Organizational Unit Name (eg, section) []:Web Dept.
    Common Name (e.g. server FQDN or YOUR name) []:*.example.com
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    
    サブジェクト 略称 説明
    Country Name C 国コードを入力。日本の場合は JP。 その他の国コードは digicert - SSL Certificate Country Codes を参照。
    State or Province Name S 都道府県名を入力。
    Locality Name L 市区町村名を入力。
    Organization Name O 会社名を入力。
    Organizational Unit Name OU 部署名を入力。
    Common Name CN サーバー名を入力。 クライアント側から見えるサーバー名を指定しないとエラーになるので注意。
    Email Address E メールアドレスを指定。
    A challenge password - 証明書要求(CSR)を利用する際に要求されるパスワード。 通常指定しない。
    An optional company name - 追加の会社名。通常指定しない。

参考

証明書要求(CSR)に署名

前述の手順をWebサーバー上で実施して得られる証明書要求(CSR)に対して、認証局において以下のコマンドを実行することで署名を行い証明書を作成します。

openssl ca -policy policy_anything -in "server_csr.pem" -out "server_cert.pem" -days 3650
オプション 説明
-policy arg 署名する際のポリシーを指定。 国、都道府県などが認証局と一致しているかを見ない場合、policy_anything を指定。
-in filename 署名に利用する証明書要求(CSR)ファイル名。
-out filename 出力する証明書のファイル名。
-days args 証明書の有効期間(日数)を指定。デフォルト(default_days)は365日。

参考

Webサーバーへ組み込み

ここまで準備できたら以下の2ファイル(秘密鍵と証明書)が取得できています。

  • 秘密鍵 server_key.pem
  • 証明書 server_cert.pem

もし pfx形式 を利用したい場合、上記2ファイルを指定して以下のコマンドを利用すると pfx形式 の証明書を作成できます。

openssl pkcs12 -export -inkey server_key.pem -in server_cert.pem -out server.pfx
  • PKCS12(pfx)証明書 server.pfx

前述2ファイル(秘密鍵、証明書)またはPKCS12署名書を Appache や Express、IIS、Nginx などに組み込めば HTTPS サーバー構築が可能になります。 具体的な組み込み方は長くなるので個別記事を以下にリンクしておきます。

関連記事

今回は「OpenSSL で 証明書要求を作成し、署名する方法」についてまとめました。 ポイントは以下の通りです。

  • 秘密鍵作成は openssl genrsa
  • 証明書要求作成は openssl req -new
  • 署名および証明書作成は openssl ca

参考になったでしょうか? 本記事がお役に立っていると嬉しいです!!

最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!