CertreqでCSRを作る方法

2020/02/13

develop PC Windows10 WindowsServer

t f B! P L
CertreqでCSRを作る方法

IISを使わずにCertreqでCSRを作る方法

Windows環境にて、certreqコマンドでCSRファイルを作成する。

CSR とは、サーバIDを取得するために認証局(CA)へ提出する署名リクエスト(Certificate Signing Request)のことだ。

サーバ証明書をインストールするサーバで、事前に作成する必要がある。

インターネットインフォメーションサービス(IIS)マネージャから、GUI画面に従って作成するのと違い、certreqコマンドでCSRファイルを作成するためには、INFファイルを準備する必要がある。

それに加えてオプションも多めなので、手順を整理がてら書いたメモを公開しておく。尚、これを書いているのは、2020/2/13時点であり、最新の情報とは異なることがあるのと、その他細かい箇所は、適宜、各自の環境に合わせて読み替えて欲しい。

基本的には、MS公式のドキュメントを参考するのが正しいのだが、昔のコマンドだし、なんなら最終更新日も「2017年10月16日」な上、英字なので読むのも手間だ。リファレンスを読むのに機械翻訳任せは少し怖いし。

■certreq | Microsoft Docs

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/certreq_1

読めばわかるが、長い。

とりあえずCMDを管理者権限で開いて、usageを確認してみる。

C:\Users\yab>certreq -v -?
使用法:
CertReq -?
CertReq [-v] -?
CertReq [-Command] -?
​
CertReq -New [Options] [PolicyFileIn [RequestFileOut]]
PolicyFileIn で指示されたとおりに新しい要求を作成します
​
オプション:
-attrib AttributeString
-binary
-cert CertId
-PolicyServer PolicyServer
-config ConfigString
-Anonymous
-Kerberos
-ClientCertificate ClientCertId
-UserName UserName
-p Password
-pin Pin
-user
-machine
-xchg ExchangeCertFile

これも長い。上に貼っているのはCSR作るオプションの箇所だけを抜粋したものだ。

手順としてざっくりまとめると以下のようになる。

(1) テキストエディタ等でINFファイルを作成する

(2) certreq を実行する

INFファイルの作成

INFファイルの標準構成は、MS公式の文章を見て欲しい。そう、いつものようにこれも役に立たない。

INF ファイルの概要 - Windows drivers | Microsoft Docs

なので、私の方で今回のINFファイルで必要そうなセクションをピックアップすると、これまたざっくり以下のようなラインナップとなる。

[Version]

[NewRequest]

[RequestAttributes]

[EnhancedKeyUsageExtension]

[Extensions]

前段が長くなった。それでは早速書いていってしまおう。

まず、サイトを運営する組織の属性情報を準備しよう。ディスティングイッシュネーム、という場合もある。

  • C=:2桁の国コード。日本なら大文字「JP」固定。

  • ST=: 組織の所在地。都道府県名をローマ字表記。ex) Tokyo,Saitama

  • L=: 組織の所在地。都市名をローマ字表示。ex) Minato-ku,Yokohama-shi

  • O=: 組織の正式英語名称。法人格の正式名なのでinc.とか付けること。

  • CN=: SSL接続の際のURL(FQDN)。

実はこれ以外に「OU」(組織単位)がある。各CAのルールによるので各自確認して欲しいが、基本的にここ数年でこのOU欄は空白の証明書が多い。例えばもし申請時にCSR上でOUの情報が含まれていても、CAから出てくる証明書は、OUが空白であることも多く、申請時にも必須情報ではないので、気にしなくて良いだろう。むしろ、ここの情報はブラックリストと突き合わせる目的で利用されることが多く、記載することにメリットは無い。

これらの情報ソースが集まれば後は簡単だ。書いてみよう。

残りのキーのちゃんとした説明については、冒頭のMS公式の資料を参照して欲しいが、なにぶんわかりずらいと思うので、このページでもこの後、ざっくりと補足しながら説明する。

[NewRequest]
Subject = "C=JP;ST=Tokyo;L=Yokohama-shi;O=Yabusan Co.,Ltd;CN=yabuisya.com"
X500NameFlags = 0x40000000
​
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xA0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = CMC
​
[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1
​
[Extensions]
continue="dns=www.hogehoge.com"

NewRequest セクション

・Subject

まずNewRequestセクションのSubjectキーの値を、先に準備しておいた属性情報を元に編集する。

この時、このINFファイルはデフォルトとして「,」(カンマ)が、各項目のセパレータ文字として使われる。つまり、STやLの文字列に「,」が含まれていると、正しくない。上の例でいうと、「O=Yabusan Co.,Ltd;」の箇所が該当する。CSVファイルとかでもよくある問題だ。

これを解決する為のオプションもあって、今回は、それを使って「,」から「;」にセパレータ文字を変更している。その定義が、3行目の「X500NameFlags = 0x40000000」になる。

他の文字をセパレータとして用いたい場合は、冒頭でも挙げた下記のMS公式ドキュメントを参照して欲しい。

certreq | Microsoft Docs

・Exportable

「TRUE」で良いだろう。

TRUEであれば、秘密鍵を証明書とともにエクスポート可能にする。

Exportable = TRUE

・KeyLength

2048で良いだろう。

公開鍵と秘密鍵の長さを定義する。キーの長さは、証明書のセキュリティレベルに影響があるが、1024では申請を受け付けてくれないCAもあるし、2048以上の値に設定すると、システムのパフォーマンスに露骨に影響するので、そこまで上げる必要は殆ど無い。

KeyLength = 2048

・KeySpec

キーをSignature(署名)、Exchange(暗号化)、またはその両方に使用できるかどうかを決定する。

  • AT_NONE -- 0

  • AT_SIGNATURE -- 2

  • AT_KEYEXCHANGE -- 1

KeySpec = 1

・KeyUsage

証明書キーの使用目的を定義する。要は公開鍵の用途だ。

ビット定義は下記の通りなので、利用したい目的を合わせた数値を指定すれば良い。

例えば今回は、

CERT_DIGITAL_SIGNATURE_KEY_USAGE | CERT_KEY_ENCIPHERMENT_KEY_USAGE

なので、0x80+0x20となり、設定値は 0xA0 としている。

    CERT_DIGITAL_SIGNATURE_KEY_USAGE -- 80 (128) ※鍵で署名を行える
    CERT_NON_REPUDIATION_KEY_USAGE -- 40 (64) ※鍵で否認の防止ができる
    CERT_KEY_ENCIPHERMENT_KEY_USAGE -- 20 (32) ※鍵を鍵の暗号化に利用できる
    CERT_DATA_ENCIPHERMENT_KEY_USAGE -- 10 (16) ※鍵をデータの暗号化に利用できる
    CERT_KEY_AGREEMENT_KEY_USAGE -- 8 ※鍵を交換できる
    CERT_KEY_CERT_SIGN_KEY_USAGE -- 4 ※鍵を証明書の署名の検証に利用できる
    CERT_OFFLINE_CRL_SIGN_KEY_USAGE -- 2 ※鍵が証明書失効情報の署名の検証に利用できる
    CERT_CRL_SIGN_KEY_USAGE -- 2
    CERT_ENCIPHER_ONLY_KEY_USAGE -- 1
    CERT_DECIPHER_ONLY_KEY_USAGE -- 8000 (32768)
    
    KeyUsage = 0xA0
    

    ・MachineKeySet

    ユーザーではなくマシンが所有する証明書を作成する必要がある場合に、有効にする。

    基本的にTrueで良いだろう。

    MachineKeySet = True
    

    ・ProviderName

    プロバイダー名。

    Windowsであれば、IISでCSR作成した時と同様に、“Microsoft RSA SChannel Cryptographic Provider” で良いだろう。

    ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
    

    ・ProviderType

    使用しているCSPのプロバイダ種類。

    ProviderNameを選ぶと、固定の値として決まる。ルールは、下記コマンドを投入すると表示される。

    certutil -csplist

    enter image description here

    今回は、12。

    ProviderType = 12
    

    ・RequestType

    リクエスト種類。

    証明書要求の生成と送信に使用される標準を選ぶ。

    CMC で良いと思うが、用途に応じて決定すれば良い。今更PKCS10やPKCS7を選ぶ理由はあまり無い気がする。

    • PKCS10 -- 1

    • PKCS7 -- 2

    • CMC -- 3

    • Cert -- 4

    • SCEP -- fd00 (64768)

    RequestType = CMC
    

    EnhancedKeyUsageExtension セクション

    拡張キーの使用法。

    サーバー認証 (1.3.6.1.5.5.7.3.1)か、クライアント認証 (1.3.6.1.5.5.7.3.2)だが、今回はサーバ認証だけで良いので、前者を選択している。両方いるなら二行に渡って書けば良い。

    OID=1.3.6.1.5.5.7.3.1
    
    OID=1.3.6.1.5.5.7.3.2; Client authentication
    OID=1.3.6.1.5.5.7.3.1; Server authentication
    

    certreqの実行

    INFファイルが出来たなら、あとはもう実行するだけだ。

    CMDを管理者権限で起動したら、下記のようにコマンドを投入すれば良い。

    今回はINFファイル名を「RC.inf」、出力されるファイル名を「CSR.req」としている。

    CertReq -New -f RC.inf CSR.req
    

    さいごに

    よくわからない場合は、他の人に聞いた方が良いと思います。ええ。

    Written with StackEdit.

自己紹介

自分の写真
カレー好きなおっさんです。いい年してるので、ほんのりやさぐれています。

GamerProf.

人気の投稿

QooQ