これを機能させる方法の例を示す素晴らしい答えがいくつかありますが、あなたの試みでどこがうまくいかなかったかを説明するものはありません。OpenSSLは、直観に反する場合がありますので、説明する価値があります。
まず、余談ですが、OpenSSLはデフォルトで、設定で指定した識別名の値を無視します。それらを使用する場合は、構成に追加prompt = no
する必要があります。さらに、このコマンドは、書かれているように、証明書自体ではなく証明書要求のみを生成する
ため、-days
コマンドは何も実行しません。
指定したこのコマンドを使用して証明書要求を生成し、結果を検査すると、サブジェクトの代替名が存在します。
$ openssl req -new -key server.key -out server.csr -config config.cnf -sha256
$ openssl req -text -noout -in server.csr
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Alternative Name:
DNS:dev.mycompany.com
Signature Algorithm: sha256WithRSAEncryption
...
ただし、herokuリンクのコマンドを使用して証明書を生成し、結果を調べると、サブジェクトの代替名が欠落しています。
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl x509 -text -noout -in server.crt
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
89:fd:75:26:43:08:04:61
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Validity
Not Before: Jan 21 04:27:21 2018 GMT
Not After : Jan 21 04:27:21 2019 GMT
Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
...
その理由は、デフォルトでは、OpenSSLは拡張機能をリクエストから証明書にコピーしないからです。通常、証明書は顧客からの要求に基づいてCAによって作成/署名され、一部の拡張機能は、要求で定義された拡張機能を盲目的に信頼する場合にCAが意図していた以上の権限を証明書に付与できます。
OpenSSLに拡張機能をコピーするように指示する方法はありますが、証明書を生成するときに設定ファイルに拡張機能を提供するだけではなく、IMHOの方が手間がかかります。
既存の構成ファイルを使用しようとしても、最上位レベルのセクションにマークが付け[req]
られ、x509コマンドではなくreqコマンドにのみ適用されるため、機能しません。トップレベルのセクションマーカーは必要ないため、最初の行を削除するだけで、要求または証明書の生成の両方で正常に機能します。
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf
または、最初に要求を作成してから証明書を作成するのではなく-x509
、req
コマンドの引数を使用して単一のコマンドで自己署名証明書を生成できます。この場合、[req]
セクションセクションはreqコマンドによって読み取られて使用されるため、セクションラインを削除する必要はありません
。
$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf
要約すると、上記のコマンドで使用される変更された構成ファイルは次のとおりです。
default_bits = 2048
distinguished_name = dn
x509_extensions = san
req_extensions = san
extensions = san
prompt = no
[ dn ]
countryName = US
stateOrProvinceName = Massachusetts
localityName = Boston
organizationName = MyCompany
[ san ]
subjectAltName = DNS:dev.mycompany.com
-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')