OpenSSLで自己署名証明書を作成する(複数ホスト名:SAN/Subject Alternative Name設定付き)
自己署名な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に組み込んで、「証明書のサブジェクトの代替名」を確認すると、こんな感じに見ることができます。
![f:id:Kazuhira:20180803223720p:image](https://cdn-ak.f.st-
hatena.com/images/fotolife/K/Kazuhira/20180803/20180803223720.png)
オマケ
CSRなしで、秘密鍵からいきなり自己署名証明書を作成する場合は、こちら。
$ openssl req -new -x509 -days 365 -key sample.key -out sample.crt
「-extfile」は、x509サブコマンドのオプションのようなので、こちらではムリっぽいですね。
Discussion