自己署名なSSL証明書を作成する方法を、メモとして書いておこうと思いまして。テストあたりで、使ったりしますしね。
今回使用した、OpenSSLのバージョンはこちら。
$ openssl version OpenSSL 1.1.0g 2 Nov 2017
手順は、
となります。
まずは、秘密鍵の作成。
$ openssl genrsa -aes128 -out sample.key 2048
秘密鍵は、以下の情報で作成し、鍵の保護はAES-128を指定。
ApacheなどのWebサーバーで使う場合、起動時にパスワードが求められるのが嫌なら解除する方法も。
$ openssl rsa -in sample.key -out sample.key
最初からパスワードなしで作る場合は、こちらです(秘密鍵の保護指定がなくなる)。
$ openssl genrsa -out sample.key 2048
CSRの作成。
$ openssl req -new -key sample.key -out sample.csr
聞かれる情報は、こんな感じです。
Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
challenge passwordは、通常空欄のままにしておきます。それ以外は、適宜設定。
今回、Common Nameのみ「hoge.com」と指定しておきました。
$ Common Name (e.g. server FQDN or YOUR name) []:hoge.com
Common Nameに「*.example.com」のように、「*」を含めたものにすると、ワイルドカード証明書になります。
証明書への署名。通常は、次のようになります(有効期限は、365日にしています)。
$ openssl x509 -req -days 365 -in sample.csr -signkey sample.key -out sample.crt
確認。
$ openssl x509 -text -in sample.crt --noout Certificate: Data: Version: 3 (0x2) Serial Number: da:c9:a5:f1:db:cc:58:97 Signature Algorithm: sha256WithRSAEncryption Issuer: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = hoge.com Validity Not Before: Aug 3 12:54:47 2018 GMT Not After : Aug 3 12:54:47 2019 GMT Subject: C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = hoge.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) ......省略
複数ホスト名に対応させる(SAN/Subject Alternative Name)
通常、OpenSSLで作成するSSL証明書は、ひとつのSubjectを持ち、ひとつのホスト名に対してのみ有効です。
ですが、X509拡張のSAN(Subject Alternative Name)を使用すると、複数のホスト名に対応させることができます。
複数ホスト名に対応させる場合は、次のようなテキストファイルを用意します。ファイル名は、なんでもいいです。
subjectnames.txt
subjectAltName = DNS:test.com, DNS:*.example.com, DNS:bar.com, IP:172.17.0.2
ホスト名を書く場合は「DNS」で、IPアドレスで書く場合は「IP」で指定します。ワイルドカード(*)も使用可能です。
これを、署名時に「-extfile」オプションで指定します。
$ openssl x509 -req -days 365 -in sample.csr -signkey sample.key -out sample.crt -extfile subjectnames.txt
確認。
$ openssl x509 -text -in sample.crt --noout
「X509v3 Subject Alternative Name」に、指定したsubjectAltNameが含まれるようになります。
X509v3 extensions: X509v3 Subject Alternative Name: DNS:test.com, DNS:*.example.com, DNS:bar.com, IP Address:172.17.0.2
ここで注意ですが、SAN拡張を含めた証明書は、元のSubjectを無視するようになります。このページで作成した証明書でいくと、Common Nameを「hoge.com」に
していました。
$ Common Name (e.g. server FQDN or YOUR name) []:hoge.com
SAN拡張を使用した場合、この証明書で「hoge.com」は無効となりますので、注意しましょう。
このSSL証明書をApacheに組み込んで、「証明書のサブジェクトの代替名」を確認すると、こんな感じに見ることができます。
オマケ
CSRなしで、秘密鍵からいきなり自己署名証明書を作成する場合は、こちら。
$ openssl req -new -x509 -days 365 -key sample.key -out sample.crt
「-extfile」は、x509サブコマンドのオプションのようなので、こちらではムリっぽいですね。
参考)
- 作者: Ivan Ristić,齋藤孝道
- 出版社/メーカー: ラムダノート
- 発売日: 2017/03/31
- メディア: テキスト
- この商品を含むブログ (2件) を見る