サーバが複数の名前を持つときに使いたい、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