OpenSSLを使用してIIS7 SSL更新CSRを確認/読み取る方法


10

私は毎週最大5つのSSL CSRを処理し、CAに渡してアクションを実行する前にそれらの有効性をチェックする特権があります。UbuntuマシンでOpenSSLを使用してそれらが有効であることを確認し、正しいOU名、適切なCN、2048ビット以上のキーサイズなどをテストします。

先日、IIS7マシンから更新リクエストを受け取りました。OpenSSLを使用してこれを読み取る方法がまったくわかりません。私のCAがそれを受け入れたので、それは有効です...

'file(1)'は「RFC1421セキュリティ証明書署名要求テキスト」であると言います。これは、私がここに持っているCSRの〜50%について言っているものです(残りは「PEM証明書要求」です)。

$ head iis7rcsr
-----BEGIN NEW CERTIFICATE REQUEST-----
MIIQsQYJKoZIhvcNAQcCoIIQojCCEJ4CAQExCzAJBgUrDgMCGgUAMIIJegYJKoZI
hvcNAQcBoIIJawSCCWcwggljMIIIzAIBADCB2zELMAkGA1UEBhMCTloxDTALBgNV
BBEMBDkwNTQxDjAMBgNVBAgMBU90YWdvMRAwDgYDVQQHDAdEdW5lZGluMRwwGgYD
...
...

openssl req、CSR(PKCS#10)を読み取ると、CSRを理解できません...

$ openssl req -in iis7rcsr -text
unable to load X509 request
5156:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1316:
5156:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509_REQ_INFO
5156:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:748:Field=req_info, Type=X509_REQ
5156:error:0906700D:PEM routines:PEM_ASN1_read_bio:ASN1 lib:pem_oth.c:83:

MSDNブログのAndreas Kleinによるこの記事は、IIS7更新CSRがPKCS#7コンテナーであり、CSRと現在の証明書に基づく署名が付いていることを示していますが、それでもまだ読み取ることができません。

$ openssl pkcs7 -in iis7rcsr -text
unable to load PKCS7 object
6581:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: PKCS7

'openssl base64'を使用してファイルをデコードし、結果のバイナリファイルで、CSRのような文字列と、古い証明書に基づく署名から取得されたはずのCA参照を確認できます。したがって、コンテナ(CSR、署名)の考え方はもっともらしいようです。

しかし、私はまだそこにあるCSRを読む方法を見つけることができません!私は多くのことを試しましたが、ここでは詳細を示しませんが、ここで私が試したバリエーションの高いポイントを示します。pkcs12pkcs7 PEM DER req x509 verify ...

残念ながら、CSR自体をここに掲載することはできません。誰かがこのファイルの読み取り/確認方法を理解するのを手伝ってくれる?


偶然にも、リクエストにサブジェクトの別名を探す属性が含まれていますか?
シェーンマッデン2011

私はそれを疑います-それは単一の名前を持つ内部サーバー用です。もちろん、返される証明書には通常、「www」の付いたSANフィールドがあります。無理やり挿入しましたが、一緒に暮らしています!
ジムチータム2011

Windowsマシンのcertutilはこの証明書を読み取り、PKCS10メッセージ要求(古いCAからのx509証明書を含む)と、別のx509証明書を含む証明書チェーンを含むPKCS7メッセージとして記述します。「certutil -split」はこれらの部分を分解し、Blob0_1.p10はDER形式で私が見つけたいCSRです。近づいてきています...はい、リクエストにSANフィールドがあります。これはおそらく「www」の強制挿入の結果です。昨年、オリジナルの証明書を取得したとき...
ジムチータム

1
openssl asn1parseリクエストを読み取ることができ、そこから通常のCSRを抽出できます。私はまだ自己回答できません(あまりに早く解決しました)ので、質問をソリューションで更新し、明日修正します:-)
Jim Cheetham

いいですね。
シェーンマッデン2011

回答:


8

このIIS7更新要求の構造は、実際には非常にエレガントです。これは現在の証明書を更新するためのリクエストであるため、リクエストが正しいホストから送信されていることを証明する必要があるという前提から始まっているようです。つまり、現在の証明書を実際に使用しているホスト&∴キー。インターネットの世界では、署名されたCSRを作成するのではなく、元のユーザーとしてCAに認証することにより、証明書の更新を要求できることを証明します。

更新要求を発行する権利を証明するために、IIS7は通常のCSR(PKCS#10オブジェクト)を作成して署名し、署名したキーの証明書を提供します。

  • IIS7更新CSR
    • PKCS#7データ
      • PKCS#10データ(通常のCSR)
    • 通常のサーバー証明書
    • CAデータの発行
    • RSA署名(想定)

を使用openssl asn1parse -in iis7rcsr -iしてファイルの構造を確認し、これを通常のCSRと比較します。最初に、「:pkcs7-data」というラベルの付いたオブジェクトのOCTET STRINGが表示されます。これは、CSRを取得するために抽出する必要があるものです。

$ openssl asn1parse -in iis7rcsr -i
0:d=0  hl=4 l=4273 cons: SEQUENCE          
4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
15:d=1  hl=4 l=4258 cons:  cont [ 0 ]        
19:d=2  hl=4 l=4254 cons:   SEQUENCE          
23:d=3  hl=2 l=   1 prim:    INTEGER           :01
26:d=3  hl=2 l=  11 cons:    SET               
28:d=4  hl=2 l=   9 cons:     SEQUENCE          
30:d=5  hl=2 l=   5 prim:      OBJECT            :sha1
37:d=5  hl=2 l=   0 prim:      NULL              
39:d=3  hl=4 l=2426 cons:    SEQUENCE          
43:d=4  hl=2 l=   9 prim:     OBJECT            :pkcs7-data
54:d=4  hl=4 l=2411 cons:     cont [ 0 ]        
58:d=5  hl=4 l=2407 prim:      OCTET STRING      [HEX DUMP]:3082096330820...

ここから実際のPKCS#10 CSRを取得するには、この例では「58」というオフセット番号が必要です。次に、そのオフセットを使用して、そのオブジェクトのバイナリバージョンを抽出できます。

$ openssl asn1parse -in iis7rcsr -strparse 58 -out thecsr -noout

次に、で出力ファイル 'thecsr'を読み取ることができますopenssl req。入力形式DERを指定することを忘れないでください。

$ openssl req -in thecsr -inform DER -text -noout
Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (normal CSR Subject: line, censored)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
...

Linuxを使用して/proc/self/fd/opensslをだますことができる限り、これらすべてを一時ファイルなしで1つのコマンドラインにまとめることができます(ただし、元の証明書を2回読み取ります)(パスワード処理のためにファイル記述子でネイティブトリックを実行しますが、通常の出力ではありません)。

$ openssl asn1parse -in iis7rcsr -strparse $(openssl asn1parse -in iis7rcsr | grep -A2 ':pkcs7-data'|tail -1|cut -d: -f1) -out /dev/stdout -noout | openssl req -inform DER -noout -text

Certificate Request:
Data:
    Version: 0 (0x0)
    Subject: (Subject: line censored again)
    Subject Public Key Info:
        Public Key Algorithm: rsaEncryption
        RSA Public Key: (1024 bit)
            Modulus (1024 bit):
...

この長いコマンドラインはopenssl req -in non-iis7rcsr -noout -text、私が通常使用する単純なものと直接同等です:-)



2

非常に役立つこの優れた情報を提供してくれたJimに感謝します。w2008/ IIS7サーバー証明書を更新しようとして、まったく同じ問題が発生しました。

1つだけ追加します。次のコマンドを使用して、CSRをP10形式で直接抽出できる場合があります certutil -split iis7rcsr (iis7rcsrはIISマネージャー経由で取得した.csrです)。次にcsrがblob0_1.p10 It's binary format(DER)という名前のファイルに抽出されます。次のコマンドを使用して、base64でエンコードする必要がある場合があります。 certutil -encode blob0_1.p10 finalcsr.csr

しかし、最後の問題があります。次に、opensslを使用して.csrコンテンツをダンプし、更新プロセスが1024ビットキーの使用を自動的に強制したことを発見しました(サーバー証明書用にサーバーで作成された元の秘密キーは2048ビット長でした)。その場合、IIS7の更新プロセスを使用して2048ビットキーの使用を強制することはできないようです。

唯一の適切なオプションは、新しいキー/証明書を作成し、更新プロセスを使用しないことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.