📜

OpenSSLで自己署名証明書を作成する(複数ホスト名:SAN/Subject Alternative Name設定付き)

2024/03/08に公開

自己署名な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