SAN付きSSL証明書を作る

サーバが複数の名前を持つときに使いたい、SSL証明書のSAN(Subject Alternative Name)。
どこを見ても微妙に気に入らなかったので自分流に。

まずはCSRを作る用のopenssl.conf。
req_extensionsの指すセクションで、subjectAltNameを定義する。
環境変数で、OPENSSL_SAN=DNS:ldap.local,DNS:server1.ldap.local とか指定して使う。
違うSANで発行するためにconfigをいじらなくて良いのが重要。

openssl-req.conf:

prompt = no
string_mask = nombstr

[req]
policy = req_policy
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_policy]
localityName = optional
organizationalUnitName = optional
emailAddress = optional

[req_distinguished_name]
countryName = "JP"
stateOrProvinceName = "N/A"
#localityName = ""
0.organizationName = "my organization"
#organizationalUnitName = ""
commonName = $ENV::OPENSSL_CN
emailAddress = $ENV::OPENSSL_EMAIL

[v3_req]
subjectAltName = $ENV::OPENSSL_SAN

これでCSRにSANが組み込まれた。
あとはCA側で、CSRに書かれているSANを使うようにする。

CA側で同じようにsubjectAltNameを環境変数から取らせる(同じ値を与える)ことでもできるが、非常に気に食わないので採用しない。

さて、非常に悲しいことに、CSRに書かれたSANだけを証明書に写すという設定は無く、CSRのextensionsを丸ごと信用してくっつける設定しかない。
自分が発行者(CA)かつ依頼者(CSR作成者)ならよいが、少しでも “ちゃんとした” CAを運用するならこれまで以上にきちんとチェックせねばならない。(元々CNも含めてチェックしないといけないが。)

こちらは長いので要点だけ。

openssl-ca.conf:

[ca]
default_ca = CA_default

[CA_default]
# ... snip ...

# Extension copying option: use with caution.
copy_extensions = copy