OpenSSLで作るCSR

以前書いた「FujiSSLでSANs対応のドメイン認証をとる」のリライトです。

当時はFujiSSLでSANs対応のドメイン認証を取得するために相応のCSRを作る必要があったので、opensslコマンドを使ってCSRを作る内容をまとめました。今ではwwwサブドメインありなしを自動的に対応してくれる模様。

その後、GoGetSSLで認証取得する際にも似たような内容を書いたので、これらを統合して情報をアップデートしました。

CSRとは

公開鍵証明書を発行してもらう際に認証局に提出するファイルです。Certificate Signing Request(証明書署名要求)の頭文字でCSR。

中身はコモンネーム(暗号化通信をおこなうサイトのurl)やサイト運営者の情報など、申請者の識別情報が入ったファイルです。

公開鍵ペアを作るには公開鍵の暗号方式にも書いたとおりssh-keygenを使うこともできますが、この方法だとCSRが生成されません。なのでopensslコマンドを使ってひとつづつファイルを作る必要があります。

opensslコマンドで秘密鍵を作る(ECDSA編)

はじめに必要なのは秘密鍵。

公開鍵認証の暗号方式にあるとおり、秘密鍵の暗号化アルゴリズムはECDSAあたりが良さそう。RSA方式よりも短いビット長で安全な暗号強度を確保できます。最近お気に入りのGoGetSSLではECDSA暗号鍵によるCSRが利用できます。

opensslでECDSA暗号を利用した秘密鍵を扱うサブコマンドはecparam。

ECDSA暗号は楕円曲線を利用した暗号でいくつか種類があります。ここでは一番無難なprime256v1という楕円曲線を-nameオプションで指定しておきます。

-genkeyは秘密鍵を生成するパラメータで-outオプションで出力先ファイル名を指定。

# openssl ecparam -name prime256v1 -genkey -out www.example.com.keyCode language: CSS (css)

秘密鍵は厳重に保管されるべきで、秘密鍵そのものを暗号化するためにパスフレーズを設定します。

パスフレーズの設定はecサブコマンドを使います。入力ファイルを-inオプション、出力ファイルを-outオプションで指定し、-aes256オプションで暗号化アルゴリズムを指定します。

# openssl ec -in www.example.com.key -out www.example.com.enc.key -aes256
read EC key
writing EC key
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:Code language: CSS (css)

これらはパイプを使ってワンライナーで処理をすると、暗号化されていないwww.example.com.keyが生成されるのを防ぐことができます。タイプ数も減るよ!

# openssl ecparam -name prime256v1 -genkey | openssl ec -out www.example.com.enc.key -aes256Code language: PHP (php)

opensslコマンドで秘密鍵を作る(RSA編)

ECDSAが使えない場合はRSA暗号で秘密鍵を作ります。サブコマンドはgenrsa。デフォルトの鍵ビット長は2048ビットです。

ECDSA同様、出力ファイル名を-outオプションで、暗号化アルゴリズムを-aes256オプションで指定します。genrsaではパスフレーズ指定まで一気に処理できます。

# openssl genrsa -out www.example.com.key -aes256
Generating RSA private key, 2048 bit long modulus (2 primes)
...............+++++
..+++++
e is 65537 (0x010001)
Enter pass phrase for www.example.com.key:
Verifying - Enter pass phrase for www.example.com.key:Code language: CSS (css)

Webサーバーの設定

秘密鍵にパスフレーズを設定すると、Webサーバーが秘密鍵を読み込む際にパスフレーズの入力を要求してしまいます。ここでパスフレーズを解除してしまうと意味がないので、Webサーバー側の設定をいじります。

Nginxの場合、ssl_certificate_keyディレクティブの前にssl_password_fileディレクティブを置いてパスフレーズファイルを指定します。

パスフレーズファイルにはパスフレーズを一行当たりひとつづつ書いておくと、秘密鍵読み込み時に順次トライしてくれます。

パスフレーズファイルは秘密鍵ファイルとは別の場所に置いておくと、なお安心ですかね。

opensslコマンドでCSRを作る

CSRを扱うサブコマンドはreq。今回は新規作成なので-newオプションを指定します。

-keyで使用する秘密鍵、-outで出力するCSRファイル名、-sha256オプションで暗号強度をそれぞれ指定します。RSA鍵もECDSA鍵も同じ操作です。

# openssl req -new -key www.example.com.key -out www.example.com.csr -sha256
Enter pass phrase for www.example.com.enc.key:
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) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Nerima-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example
Organizational Unit Name (eg, section) []:Example
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:Code language: PHP (php)

これで入力した申請者情報と、秘密鍵から生成されたCSRが生成されました。

CSRはBase64で符号化されている(秘密鍵ファイルも同じだけど)ので、中身を見ても何が書いてあるかわかりません。これもreqサブコマンドを使うことで復号することができます。

# openssl req -text -noout -in www.example.com.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Tokyo, L = Nerima-ku, O = Example, OU = Example, CN = www.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:ec:93:fb:80:66:47:40:bd:6a:aa:cc:fc:3e:81:
                    fc:ab:18:25:fc:89:93:ab:cb:df:b2:19:13:d9:51:
(以下略)Code language: PHP (php)

SANs対応のCSRを作るときは。。。

GGSSLはwwwサブドメイン付きのurlをドメイン認証すると自動的にwwwなしのurlも含まれるので不要ですが、そうでない場合にはSANs対応のCSRが必要です。

これはopenssl.cnfの設定が必要です。ファイルの在処はFreeBSD/Debian共に/etc/ssl/openssl.cnf。

オリジナルファイルのコピーを編集します。手順は以下のとおり。

  1. コメントアウトされているreq_extensions = v3_reqを有効化
  2. [ v3_req ]セクション内にsubjectAltName = @alt_namesを追記
  3. [ v3_req ]セクションの後に[ alt_names ]セクションを追加
[ alt_names ]
DNS.1 = example.com

複数追加したいときはさらにDNS.2、DNS.3と続けます。

openssl.cnfが用意できたらopensslのサブコマンドreqに-configオプションで編集したopenssl.cnfファイルを指定します。

# openssl req -config openssl.cnf -new -key www.example.com.key -out www.example.com.csr -sha256
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.
(以下略)Code language: CSS (css)

本当にSANs対応のCSRになっているかどうかはreqサブコマンドの-textオプションで確認します。中ほどにSubject Alternative Nameの項目があり、wwwなしのドメインが指定されています。

# openssl req -text -noout -in www.example.com.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = JP, ST = Tokyo, L = Nerima-ku, O = Example, OU = Example, CN = www.example.com
(中略)
        Requested Extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:example.com
    Signature Algorithm: sha256WithRSAEncryption
(以下略)Code language: PHP (php)

こんな感じですね。

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments