コンピュータ セキュリティ 暗号化

【OpenSSL】SANでDNS情報を付与した証明書を作成する

2018年6月10日

DNS情報なしでオレオレ認証するとChromeでエラーになる

自己証明書(通称:オレオレ認証)を使っている場合、正規証明書とみなそうとするためルート証明書を端末にインストールしますが、どうやらChromeだとそれだけだと不十分になったようです。

subjectAltNameが必要になった

chrome58が4月19日は公開され、今まではドメイン名をsubjectのCN値に記載でOKだったのがSubject Alternative Name属性にDNS情報が記載されていないとダメになったようです。

CentOSにインストールされているopensslは「subjectAltName」の記載部分がないため、どこに記載したらいいんだ!?
からconfigに記載するのがめんどいのでコマンドライン一発で証明書発行したいまでを記載したいと思います。
むしろこの記事はコマンドライン上一発で発行する場合がメインだったり。

Subject Alternative Nameとは?

Subject Alternative Nameは「サブジェクトの別名」という意味で通称SAN(またはSANs)。証明書の拡張領域に記載されるようです。
マルチドメインを1枚の証明書で作成したい場合には必須の属性でした。(ワイルドカードもOK)

SANはFQDN及びIPのどちらとも設定が可能です。

設定方法

opennsslで証明書発行要求(CSR)にDNS情報またはIPアドレス情報を付与する場合は2通りの方法があります。

openssl.cnfに記載し、作成する方法

openssl.cnfに「subjectAltName」属性を付与し、そこにDNS情報またはIPアドレス情報を記載していく方法です。
DNS及びIPアドレスが変動しない場合はcnf記載が各自かつ簡単です。

#~~~~~225行目付近~~~~~
[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
####↑↑subjectAltName = @alt_names を追記↑↑####

####↓↓alt_names部分全て追記↓↓####
[alt_names]
DNS.1 = kaede.jp
DNS.2 = aaa.kaede.jp
DNS.3 = bbb.kaede.jp
DNS.4 = ccc.bbb.kaede.jp
IP.1 = 192.168.1.1
IP.2 = 192.168.2.15
####DNS.〇の順にマルチドメインを追記する。〇は数値
####※すべてのDNS(Aレコード)の名前解決ができなければ全ての証明書発行ができないので注意すること
####IP.〇も同様の方法で記載可能

サーバの証明書の作成は「openssl req」で実施 ECDSAで実施したい場合は「-newkey rsa:4096」を「-newkey ec:<(openssl ecparam -name 【曲線の種類】)」に変更すれば可能です。

[root@localhost serverAuth]# openssl req -extensions v3_req -new -newkey rsa:4096 -keyout server.key -nodes -x509 -days 365 -out server.csr
Generating a 4096 bit RSA private key
........................................................................................................++
.........................................................................................................................................................++
writing new private key to 'server.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) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Kaede
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:kaede.jp
Email Address []:

作成したCSRを確認し、DNS及びIPアドレスが記載されてれば正常に作成されています。

[root@localhost serverAuth]# openssl x509 -in server.csr -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
a8:e2:e7:94:c8:29:22:b4
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Osaka, L=Osaka, O=Kaede, CN=kaede.jp
Validity
Not Before: Jun 10 08:18:01 2018 GMT
Not After : Jun 10 08:18:01 2019 GMT
Subject: C=JP, ST=Osaka, L=Osaka, O=Kaede, CN=kaede.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:c2:c6:f4:51:9c:29:17:8d:6f:c8:f8:2f:df:68:
~~~~~~省略~~~~~~
1b:79:83:43:67:b2:3e:a4:91:cb:a1:b5:8f:6a:0e:
5f:12:37
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Subject Alternative Name:
DNS:kaede.jp, DNS:aaa.kaede.jp, DNS:bbb.kaede.jp, DNS:ccc.bbb.kaede.jp, IP Address:192.168.1.1, IP Address:192.168.2.15
Signature Algorithm: sha256WithRSAEncryption
b9:af:43:f2:91:f9:04:85:e8:f6:92:81:4c:c6:bc:bf:23:5d:
~~~~~~省略~~~~~~
b2:67:03:18:db:b3:66:6b

あとはCAに署名してもらえればOKです。

コマンドラインのみで作成する方法(~1.1.0)

openssl.cnfに都度書いていけばいいのですが、開発環境のサーバが増えていくとopenssl.cnfに記載するのがめんどくさくなります。
そのため、コマンドラインのみで作成したい場合がありますが、opensslで行う場合はprintfで無理やり置き換えるしかないようです。

[root@localhost serverAuth]# openssl req -new -newkey rsa:4096 -keyout server2.key -nodes -x509 -days 365 -out server2.csr \
> -extensions SAN -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf \
> <(printf "[SAN]\n subjectAltName=DNS:ddd.kaede.jp,DNS:fff.kaede.jp,DNS:ddd.fff.kaede.jp,IP:192.168.3.11,IP:192.168.4.5"))
Generating a 4096 bit RSA private key
......................................................++
.........................................++
writing new private key to 'server2.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) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Kaede
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:kaede.jp
Email Address []:

「SAN」というセクションを新しく追加し、そこにsubjectAltNameを追加しています。
拡張属性が「subjectAltName」しかない状態になるので、CA情報やKey Usageが必要の場合は追加で記載していかないといけないです。

[root@localhost serverAuth]# openssl x509 -in server2.csr -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
9a:8a:f9:32:4b:0c:10:84
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Osaka, L=Osaka, O=Kaede, CN=kaede.jp
Validity
Not Before: Jun 10 09:29:01 2018 GMT
Not After : Jun 10 09:29:01 2019 GMT
Subject: C=JP, ST=Osaka, L=Osaka, O=Kaede, CN=kaede.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:df:4b:e7:a4:60:01:69:4e:9b:db:47:f2:fb:85:
~~~~~~省略~~~~~~
6b:3e:56:63:72:60:d7:5b:84:96:07:ff:da:09:9c:
1a:10:ef
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:ddd.kaede.jp, DNS:fff.kaede.jp, DNS:ddd.fff.kaede.jp, IP Address:192.168.3.11, IP Address:192.168.4.5
Signature Algorithm: sha256WithRSAEncryption
a4:66:66:1a:8b:d1:61:cb:ce:19:7c:6e:fe:a7:81:00:1d:c6:
~~~~~~省略~~~~~~
99:7b:97:01:21:24:8e:65

コマンドライン上から実行するのは今のところ難しいですかね。
というかここまでするくらいならconfファイルコピーして使いまわしたほうが早そう。

コマンドラインのみで作成する方法(1.1.1~)

2018年6月10日時点でまだBeta版ですが、1.1.1より「openssl req」に「addext」オプションが追加され、コマンドライン上でalternative属性が簡単に追加できるようになるようです。

[root@localhost serverAuth]# /opt/openssl/1.1.1/bin/openssl version
OpenSSL 1.1.1-pre7 (beta) 29 May 2018
[root@localhost serverAuth]# /opt/openssl/1.1.1/bin/openssl req -extensions v3_req -new \
-newkey rsa:4096 -keyout server3.key -nodes -x509 -days 365 -out server3.csr \
-addext 'subjectAltName = DNS:ggg.kaede.jp,DNS:hhh.kaede.jp,IP:192.168.8.123,IP:192.168.9.21' \
-config /etc/pki/tls/openssl.cnf
Generating a 4096 bit RSA private key
.............................................................++
.....................................................................................................................................................++
writing new private key to 'server3.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) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Kaede
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:kaede.jp
Email Address []:
[root@localhost serverAuth]# openssl x509 -in server3.csr -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
5a:21:58:3e:f7:3d:af:a9:e1:61:87:60:07:62:b9:d5:d3:8a:0e:91
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=JP, ST=Osaka, L=Osaka, O=Kaede, CN=kaede.jp
Validity
Not Before: Jun 10 10:02:48 2018 GMT
Not After : Jun 10 10:02:48 2019 GMT
Subject: C=JP, ST=Osaka, L=Osaka, O=Kaede, CN=kaede.jp
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:d1:0f:87:dd:81:5e:6e:1b:d1:e8:17:1c:5b:78:
~~~~~~省略~~~~~~
60:90:21:d6:cf:2c:78:4e:5d:aa:d8:55:cd:8b:fb:
1a:f6:ef
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Subject Alternative Name:
DNS:ggg.kaede.jp, DNS:hhh.kaede.jp, IP Address:192.168.8.123, IP Address:192.168.9.21
Signature Algorithm: sha256WithRSAEncryption
2b:53:33:2d:9c:1a:62:4b:0c:96:8a:9c:a0:13:67:2c:44:da:
~~~~~~省略~~~~~~
2d:17:32:85:40:4b:fb:df

変にconfファイルをコマンドライン上で書き換える必要がなくなるので大分負担がなくなりますね。

現時点まだBeta版なので使用する際は自己責任で。

参考

-コンピュータ, セキュリティ, 暗号化
-, , ,