【解決方法】証明書のサブジェクト名に既定以外の項目を含める方法

事象

Active Directory 証明書サービスで構築した CA サーバーで、CSR に指定した項目がサブジェクト名に含まれないことがあります。

CSR の定義ファイル(inf)の内容:

[NewRequest]
Subject = “CN=sv01;OU=Human Resource;O=Nekomaru JP, Inc.;Street=Cat Street;L=Shibuya;S=Tokyo;C=JP”
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xf0
MachineKeySet = TRUE

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1
OID=1.3.6.1.5.5.7.3.2

[RequestAttributes]
CertificateTemplate = “WebServer”

発行された証明書

※ サブジェクト名を見てみると、Street の項目が含まれていません

 

原因

Active Directory 証明書サービスでは、サブジェクト名に含めることができる項目は以下です。

  • EMail (E)
  • CommonName (CN)
  • OrganizationalUnit (OU)
  • Organization (O)
  • Locality (L)
  • State (S)
  • DomainComponent (DC)
  • Country (C)

上記の項目以外を指定してサブジェクト名を指定しても、発行された証明書のサブジェクト名に含めることはできません。

 

対処策

サブジェクト名に含めることができる項目は、以下のレジストリにて設定されています。

キー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA 名>
値:SubjectTemplate
型:REG_MULTI_SZ
設定値:(項目一覧)
証明書に含めたい項目を追加するには、以下のコマンドを設定します。
– 設定手順
1) CA サーバーに管理者権限をもつユーザーでログオンします。
2) 管理者権限でコマンド プロンプトを開きます。
3) 以下のコマンドを実行して、SubjectTemplate に追加したい項目を指定します。
    certutil -setreg ca\SubjectTemplate +<項目>
実行例:

C:\>certutil -setreg ca\SubjectTemplate +STREET
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\test01-TEST01DC01-CA\SubjectTemplate:

古い値:
SubjectTemplate REG_MULTI_SZ =
0: EMail
1: CommonName
2: OrganizationalUnit
3: Organization
4: Locality
5: State
6: DomainComponent
7: Country

新しい値:
SubjectTemplate REG_MULTI_SZ =
0: EMail
1: CommonName
2: OrganizationalUnit
3: Organization
4: Locality
5: State
6: DomainComponent
7: Country
8: STREET
CertUtil: -setreg コマンドは正常に完了しました。
変更を有効にするには、CertSvc サービスを再起動しなければなりません。

 

4) 設定の変更を反映させるためには、Active Directory 証明書サービスの再起動が必要です。
以下のコマンドを実行して、Active Directory 証明書サービスを再起動します。

   net stop certsvc && net start certsvc

 

設定変更した後は、発行した証明書に正常に STREET の項目が含まれます。

 

補足:SubjectTemplate について

レジストリ SubjectTemplate は、サブジェクト名のテンプレートを定義できます。
サブジェクト名に含める項目、また各項目の順序を指定します。

CA サーバーで発行される証明書のサブジェクト名は、SubjectTemplate で指定する定義に従います。
例えば、CSR の定義フィルにて以下の通りに設定したとしても、

“CN=sv01;OU=Human Resource;O=Nekomaru JP, Inc.;Street=Cat Street;L=Shibuya;S=Tokyo;C=JP”
発行される証明書は、SubjectTemplate の定義の順序に従います。
CN=sv01,OU=Human Resource,O=Nekomaru JP, Inc.,L=Shibuya,S=Tokyo,C=JP,Street=Cat Street
 
以下のコマンドで現在の SubjectTemplate の設定値を確認できます。
   certutil -getreg ca\SubjectTemplate

C:\>certutil -getreg ca\SubjectTemplate
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\test01-TEST01DC01-CA\SubjectTemplate:

SubjectTemplate REG_MULTI_SZ =
0: EMail
1: CommonName
2: OrganizationalUnit
3: Organization
4: Locality
5: State
6: DomainComponent
7: Country
8: STREET
CertUtil: -getreg コマンドは正常に完了しました。

上記の通り、0 -> 1 -> 2 の順でサブジェクト名の項目の順番が定義されています。
そのため、サブジェクト名の項目の番号を変更したい場合、以下の通りにレジストリ値を設定してください。

C:\>certutil -getreg ca\subjecttemplate
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\test01-TEST01DC01-CA\SubjectTemplate:

SubjectTemplate REG_MULTI_SZ =
0: EMail
1: CommonName
2: OrganizationalUnit
3: Organization
4: Street

5: Locality
6: State
7: DomainComponent
8: Country
CertUtil: -getreg コマンドは正常に完了しました。

 

 

また、SubjectTemplate の設定できる項目名は以下の通りです。

 

定義名

項目名

共通名

CommonName

CN

Country

C

ドメイン コンポーネント

DomainComponent

DC

電子メール

EMail

E

GivenName

G

イニシャル

Initials

I

地域

Locality

L

組織

Organization

O

組織単位

OrganizationalUnit

OU

都道府県

State

S

番地

Street

STREET

SurName

SN

役職

Title

T

SubjectTemplate の設定値には “定義名” を指定してください。

 

subjecttemplate の設定値に、”定義名” 以外の文字列を指定しないでください。
定義できない文字列を指定すると、Actvie Directory サービスが起動できなくなる可能性があります。