commonName をサブジェクト代替名に継承する方法

commonName をサブジェクト代替名に継承する方法

Windows 10 がインストールされている PC では、OpenSSL を使用する必要があります。バージョン 1.0.2n をダウンロードし、次のガイドに従っています。複数のホスト名を持つ SSL 証明書の作成openssl.cfg 構成ファイル (C:\OpenSSL-Win64\bin にあります) を変更しました。

いくつかテストした後、キーと証明書の両方を問題なく生成できました。

私の問題は次のとおりです。証明書生成の指示は、件名の別名値は1つだけであり、一般名フィールドです。つまり、証明書に記入する場合、commonNameフィールドに例.com、また、サブジェクト代替名は例.com毎回 cfg ファイルを変更して、v3-req セクションの SAN の値を手動で設定できることはわかっていますが、これを回避したいので、SAN フィールドの共通名に要求する値をコピーする方法を探しています。

そこで、これを試しました。openss.cfg ファイルの v3 req セクションに移動し、次のように変更しました。

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints = CA:FALSE 
keyUsage = nonRepudiation, digitalSignature, keyEncipherment 
subjectAltName = @alt_names

[alt_names] 
DNS.1 = commonName:copy

つまり、:copy関数を利用しようとしたのですが、残念ながらこのアクションは機能しません。証明書生成後にコマンドを実行すると、

req -text -noout -in <filename.csr>

証明書を確認するには、特定のセクションで次のように入力します。

X509v3 Subject Alternative Name:
    DNS:commonName.copy 

ご覧のとおり、出力はセクションの下の宣言の右側になります[alt_names]

そこで質問です。 commonName をサブジェクトの別名に継承する方法はありますか? ある場合、どのようにすればよいですか?

答え1

以前に定義された変数を読み取るために使用します${section::name}

以下に有効な例を示します。

[ req ]

prompt             = no
string_mask        = default

# The size of the keys in bits:
default_bits       = 2048
distinguished_name = req_dn
req_extensions     = req_ext

[ req_dn ]

# Or traditional org style:
countryName = gb
organizationName = example
commonName = acme.example.test

[ req_ext ]

subjectAltName = @alt_names

[alt_names]
DNS.1 = ${req_dn::commonName}
DNS.2 = alt.example.test

に続く:

openssl req -nodes -new -keyout test.key -out test.csr -config ./openssl.cnf

結果は次のようになります:

openssl req -noout -text -in test.csr 

与える:

 ...
    Attributes:
    Requested Extensions:
        X509v3 Subject Alternative Name:
            DNS:acme.example.test, DNS:alt.example.test
Signature Algorithm: sha256WithRSAEncryption
     92:1c:e0:0e:6d:7d:2e:b4:64:c5:ab:ff:6a:37:dd:35:98:58:
 ...

関連情報