web-dev-qa-db-ja.com

OpenSSLを使用してIIS7SSL更新CSRを確認/読み取るにはどうすればよいですか?

私には、週に最大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)を読み取ると理解できない...

$ 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自体をここに掲載することはできません。誰かがこのファイルの読み取り/確認方法を理解するのを手伝ってくれる?

10
Jim Cheetham

このIIS7更新要求の構造は、実際には非常にエレガントです。これはcurrent証明書の更新要求であるため、要求が正しいホスト(つまり、現在の証明書を実際に使用しているホスト)から送信されていることを証明する必要があるという前提から始まっているようです。証明書&∴は関連する秘密鍵を所有しています。インターネットの世界では、署名された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
_

次に、入力形式DERを指定することを忘れずに、その出力ファイル 'thecsr'を_openssl req_で読み取ることができます。

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

$ 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_と直接同等です:-)

8
Jim Cheetham

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

一つだけ付け加えておきます。次のコマンドを使用して、CSRをP10形式で直接抽出できる場合があります。certutil -split iis7rcsr(iis7rcsrはIIS manager)経由で取得する.csrです)。csrが抽出されます。 blob0_1.p10という名前のファイル内のバイナリ形式(DER)の場合、次のコマンドを使用してbase64でエンコードする必要がある場合があります。certutil -encode blob0_1.p10 finalcsr.csr

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

唯一の良いオプションは、更新プロセスを使用せずに、新しいキー/証明書を作成することであるようです。

2
Florent Vélu