web-dev-qa-db-ja.com

S / MIME署名と検証-適切な証明書を見つけるにはどうすればよいですか?

正しく機能していないS/MIME署名フレームワークをデバッグしようとしています。入力で私が持っています

  • detached証明書付きの署名付きメッセージ
  • メッセージがおそらく署名された秘密鍵の証明書

しかし、これをすべてまとめようとすると、

openssl smime -verify \
-in /tmp/efx5a9e37e3992a3/response.p7b -inform der \
-certfile /tmp/efx5a9e37e3992a3/equifax.pem -noverify \
-out /tmp/efx5a9e37e3992a3/response.xml

Verification failure
139699112142480:error:21FFF080:PKCS7routines:func(4095):
signer certificate not found:pkcs7/pk7_smime.c:470:

このエラーは、opensslユーティリティが、メッセージを確認するために提案している証明書が本物ではないことを明確に認識していることが原因であると理解しています。だから私の質問は-どうすれば自分のためにこれを見ることができますか?署名されたメッセージからASN.1構造をダンプし、証明書のシリアルまたは指紋のように比較できると思いますか?他のいくつかの属性)私が検証に使用している証明書を使用して-そして自分自身で確認-大丈夫、それはそれですか?

また、誰かがこれを説明しているドキュメントを私に向けてくれればいいのですが。

4
drookie

命名に注意してください

余談ですが、「個別」または「個別に提供」または「含まれていない」証明書を言いたいかもしれません。 PKCS7/CMS/SMIMEの「切り離された」と「埋め込まれた」署名はかなり重要な機能であり、署名と証明書は異なるものですが、簡単に混乱する可能性があります。

Hexdump

はい、PKCS7/CMSをダンプし、発行者名とシリアル番号、または(まれに、 1999年のrfc2630以降)keyフィンガープリント(証明書ではない)。以下は、証明書を含まないsigneddataの例ですが、データを埋め込み(切り離すのではなく)(コマンドが示唆するため)、署名された属性を使用します(どちらか一方を示していない)。

$ xxd se181073.p7b
0000000: 3082 0262 0609 2a86 4886 f70d 0107 02a0  0..b..*.H.......
0000010: 8202 5330 8202 4f02 0101 310b 3009 0605  ..S0..O...1.0...
0000020: 2b0e 0302 1a05 0030 1706 092a 8648 86f7  +......0...*.H..
0000030: 0d01 0701 a00a 0408 666f 6f62 6172 0d0a  ........foobar..
0000040: 3182 0222 3082 021e 0201 0130 2030 1331  1.."0......0 0.1
0000050: 1130 0f06 0355 0403 0c08 7365 3138 3130  .0...U....se1810
0000060: 3733 0209 0083 2c1c 0d9b 0320 b930 0906  73....,.... .0..
0000070: 052b 0e03 021a 0500 a081 d830 1806 092a  .+.........0...*
0000080: 8648 86f7 0d01 0903 310b 0609 2a86 4886  .H......1...*.H.
0000090: f70d 0107 0130 1c06 092a 8648 86f7 0d01  .....0...*.H....
00000a0: 0905 310f 170d 3138 3033 3037 3036 3033  ..1...1803070603
00000b0: 3032 5a30 2306 092a 8648 86f7 0d01 0904  02Z0#..*.H......
00000c0: 3116 0414 60e6 44a5 6cb3 048e 15e6 2d88  1...`.D.l.....-.
00000d0: e311 c28e 5a4f 6d28 3079 0609 2a86 4886  ....ZOm(0y..*.H.
00000e0: f70d 0109 0f31 6c30 6a30 0b06 0960 8648  .....1l0j0...`.H
00000f0: 0165 0304 012a 300b 0609 6086 4801 6503  .e...*0...`.H.e.
0000100: 0401 1630 0b06 0960 8648 0165 0304 0102  ...0...`.H.e....
0000110: 300a 0608 2a86 4886 f70d 0307 300e 0608  0...*.H.....0...
0000120: 2a86 4886 f70d 0302 0202 0080 300d 0608  *.H.........0...
0000130: 2a86 4886 f70d 0302 0201 4030 0706 052b  *.H.......@0...+
0000140: 0e03 0207 300d 0608 2a86 4886 f70d 0302  ....0...*.H.....
0000150: 0201 2830 0d06 092a 8648 86f7 0d01 0101  ..(0...*.H......
0000160: 0500 0482 0100 0eea c31c bebb b64f 5c55  .............O\U
0000170: d5a5 5202 d59e 4742 57df cbce 42c9 f6b9  ..R...GBW...B...
0000180: 954a f6dd 1336 a99a be66 2513 bbba e176  .J...6...f%....v
0000190: acbd 2cf6 6988 847f 5fcd 6f28 e23f 1097  ..,.i..._.o(.?..
00001a0: 76a7 5f65 c028 25e2 c26d e054 d3a5 d7dc  v._e.(%..m.T....
00001b0: 5168 a71d 1860 b4e8 96fc e553 032d 3a03  Qh...`.....S.-:.
00001c0: 25cd 3761 3076 99a6 bf79 43ea 43a5 7438  %.7a0v...yC.C.t8
00001d0: d10b e160 dd66 f592 cea1 6ab7 221b 8ec1  ...`.f....j."...
00001e0: 9921 9ae1 f739 5b61 6495 290b 1f7f dae4  .!...9[ad.).....
00001f0: 41d5 0f9b 5acf 2331 1447 5755 a063 c7de  A...Z.#1.GWU.c..
0000200: 6830 ed43 875d a733 c588 370c e161 a7e8  h0.C.].3..7..a..
0000210: 005e 8afa c07b 5ade 2ffe dfb3 c0a0 1e28  .^...{Z./......(
0000220: 9726 5679 be4e d5ae 005c 8e50 ee83 13ac  .&Vy.N...\.P....
0000230: 1ea0 144c ad72 df79 d60b 9f5b 4f5f 188d  ...L.r.y...[O_..
0000240: f644 52cd 932b a24b b277 323c 7991 7418  .DR..+.K.w2<y.t.
0000250: 1bf8 c997 fd2f 1652 7658 ca42 be2f dc92  ...../.RvX.B./..
0000260: 678d 8dbd 756a                           g...uj

asn1parse

asn1parseは、ASN.1構造とほとんどの内容をダンプします。

$ openssl asn1parse -in se181073.p7b -inform der -i
    0:d=0  hl=4 l= 610 cons: SEQUENCE
    4:d=1  hl=2 l=   9 prim:  OBJECT            :pkcs7-signedData
   15:d=1  hl=4 l= 595 cons:  cont [ 0 ]
   19:d=2  hl=4 l= 591 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=2 l=  23 cons:    SEQUENCE
   41:d=4  hl=2 l=   9 prim:     OBJECT            :pkcs7-data
   52:d=4  hl=2 l=  10 cons:     cont [ 0 ]
   54:d=5  hl=2 l=   8 prim:      OCTET STRING      :foobar

   64:d=3  hl=4 l= 546 cons:    SET
   68:d=4  hl=4 l= 542 cons:     SEQUENCE
   72:d=5  hl=2 l=   1 prim:      INTEGER           :01
   75:d=5  hl=2 l=  32 cons:      SEQUENCE
   77:d=6  hl=2 l=  19 cons:       SEQUENCE
   79:d=7  hl=2 l=  17 cons:        SET
   81:d=8  hl=2 l=  15 cons:         SEQUENCE
   83:d=9  hl=2 l=   3 prim:          OBJECT            :commonName
   88:d=9  hl=2 l=   8 prim:          UTF8STRING        :se181073
   98:d=6  hl=2 l=   9 prim:       INTEGER           :832C1C0D9B0320B9
  109:d=5  hl=2 l=   9 cons:      SEQUENCE
  111:d=6  hl=2 l=   5 prim:       OBJECT            :sha1
  118:d=6  hl=2 l=   0 prim:       NULL
  120:d=5  hl=3 l= 216 cons:      cont [ 0 ]
  123:d=6  hl=2 l=  24 cons:       SEQUENCE
  125:d=7  hl=2 l=   9 prim:        OBJECT            :contentType
  136:d=7  hl=2 l=  11 cons:        SET
  138:d=8  hl=2 l=   9 prim:         OBJECT            :pkcs7-data
  149:d=6  hl=2 l=  28 cons:       SEQUENCE
  151:d=7  hl=2 l=   9 prim:        OBJECT            :signingTime
  162:d=7  hl=2 l=  15 cons:        SET
  164:d=8  hl=2 l=  13 prim:         UTCTIME           :180307060302Z
  179:d=6  hl=2 l=  35 cons:       SEQUENCE
  181:d=7  hl=2 l=   9 prim:        OBJECT            :messageDigest
  192:d=7  hl=2 l=  22 cons:        SET
  194:d=8  hl=2 l=  20 prim:         OCTET STRING      [HEX DUMP]:60E644A56CB3048E15E62D88E311C28E5A4F6D28
  216:d=6  hl=2 l= 121 cons:       SEQUENCE
  218:d=7  hl=2 l=   9 prim:        OBJECT            :S/MIME Capabilities
  229:d=7  hl=2 l= 108 cons:        SET
  231:d=8  hl=2 l= 106 cons:         SEQUENCE
  233:d=9  hl=2 l=  11 cons:          SEQUENCE
  235:d=10 hl=2 l=   9 prim:           OBJECT            :aes-256-cbc
  246:d=9  hl=2 l=  11 cons:          SEQUENCE
  248:d=10 hl=2 l=   9 prim:           OBJECT            :aes-192-cbc
  259:d=9  hl=2 l=  11 cons:          SEQUENCE
  261:d=10 hl=2 l=   9 prim:           OBJECT            :aes-128-cbc
  272:d=9  hl=2 l=  10 cons:          SEQUENCE
  274:d=10 hl=2 l=   8 prim:           OBJECT            :des-ede3-cbc
  284:d=9  hl=2 l=  14 cons:          SEQUENCE
  286:d=10 hl=2 l=   8 prim:           OBJECT            :rc2-cbc
  296:d=10 hl=2 l=   2 prim:           INTEGER           :80
  300:d=9  hl=2 l=  13 cons:          SEQUENCE
  302:d=10 hl=2 l=   8 prim:           OBJECT            :rc2-cbc
  312:d=10 hl=2 l=   1 prim:           INTEGER           :40
  315:d=9  hl=2 l=   7 cons:          SEQUENCE
  317:d=10 hl=2 l=   5 prim:           OBJECT            :des-cbc
  324:d=9  hl=2 l=  13 cons:          SEQUENCE
  326:d=10 hl=2 l=   8 prim:           OBJECT            :rc2-cbc
  336:d=10 hl=2 l=   1 prim:           INTEGER           :28
  339:d=5  hl=2 l=  13 cons:      SEQUENCE
  341:d=6  hl=2 l=   9 prim:       OBJECT            :rsaEncryption
  352:d=6  hl=2 l=   0 prim:       NULL
  354:d=5  hl=4 l= 256 prim:      OCTET STRING      [HEX DUMP]:0EEAC31CBEBBB64F5C55D5A55202D59E474257DFCBCE42C9F6B9954AF6DD1336A99ABE662513BBBAE176ACBD2CF66988847F5FCD6F28E23F109776A75F65C02825E2C26DE054D3A5D7DC5168A71D1860B4E896FCE553032D3A0325CD3761307699A6BF7943EA43A57438D10BE160DD66F592CEA16AB7221B8EC199219AE1F7395B616495290B1F7FDAE441D50F9B5ACF233114475755A063C7DE6830ED43875DA733C588370CE161A7E8005E8AFAC07B5ADE2FFEDFB3C0A01E2897265679BE4ED5AE005C8E50EE8313AC1EA0144CAD72DF79D60B9F5B4F5F188DF64452CD932BA24BB277323C799174181BF8C997FD2F16527658CA42BE2FDC92678D8DBD756A
 $ # -i causes the output 'details' to be indented according to the structure; 
 $ # you can omit this and just use the d=depth values but that's slightly harder

SignerInfo構造

これを、PKCS7で指定された構造またはそのより新しく便利なIETF化された形式の暗号化メッセージ構文CMS rfc2315セクション9 または rfc2360セクション5.1 または rfc3369 ditto と比較してください。 =または rfc3852同上 。最初に、OIDおよびcontext-0タグのシーケンスである外部ラッパー(上記の参考文献のセクション7または3で定義)があり、signeddataの場合はシーケンスです。オフセットで23にはバージョン番号があり、26にはダイジェストAlgIdのセットがあり、39にはデータを含むEncapsulatedContentInfoがあります。(すべての)証明書が省略されているため、オフセット64に、セクション9.2の後半の数ページで定義されているSignerInfoのセットがあります。 5.3:

SignerInfo ::= SEQUENCE {
        version CMSVersion,
        sid SignerIdentifier,
        digestAlgorithm DigestAlgorithmIdentifier,
        signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
        signatureAlgorithm SignatureAlgorithmIdentifier,
        signature SignatureValue,
        unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }

SignerIdentifier ::= CHOICE {
        issuerAndSerialNumber IssuerAndSerialNumber,
        subjectKeyIdentifier [0] SubjectKeyIdentifier }

-- SubjectKeyIdentifier is defined elsewhere as OCTET STRING

SignatureValue ::= OCTET STRING

したがって、オフセット72にはSIのバージョンがあり、77には発行者名があり、これは通常いくつかのSETのシーケンスです(私の簡単な例では1つだけですが、 CommonName)OID and value、)の1つ以上(ここでは1つ)のペア(SEQUENCE)を含み、98でシリアル番号;これらは、証明書の発行者名とシリアル番号に一致します(これらから取得されます)。他の署名ソフトウェアでは、SubjectKeyIdentifier拡張機能に一致する(および取得される)OCTET STRINGを含むcontext-0タグを使用できます(存在する場合)証明書内。

最後に、オフセット102では、ダイジェストのAlgIdがあり、120ではcontext-0にOIDおよびSETのペア(SEQUENCE)の暗黙のシーケンスである署名済み属性(以前は認証済みと呼ばれていました)が含まれています。の値、および339でAlgIdおよびOCTET STRINGとしての署名自体。

わからない場合は、AlgIdに短縮するAlgorithmIdentifierをX.509(したがってrfc3280およびrfc5280)でOID for algorithm for 'parameters'そのアルゴリズムのさまざまなタイプ-私が使用したアルゴリズム、RSAの場合、パラメーターはNULLです。このペアリングは暗号で非常に広く使用されています。rsaEncryptionに割り当てられているOIDはRSA署名にも使用されています) 、「署名は秘密鍵による暗号化である」という1970年代の元々の概念は危険なほど誤解を招き、削除されましたが、security.SXとcrypto.SXにはこれについて多数の回答とコメントがあります。

検証成功

そして、これはその証明書を使用して成功した検証のデモンストレーションです:

$ openssl x509 -issuer -serial -subject -in se181073.cer
issuer= /CN=se181073
serial=832C1C0D9B0320B9
subject= /CN=se181073
-----BEGIN CERTIFICATE-----
MIIC+TCCAeGgAwIBAgIJAIMsHA2bAyC5MA0GCSqGSIb3DQEBBQUAMBMxETAPBgNV
BAMMCHNlMTgxMDczMB4XDTE4MDMwNzA1NTk1NloXDTE4MDQwNjA1NTk1NlowEzER
MA8GA1UEAwwIc2UxODEwNzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQDG2pTlbFNwDnlrdY7FvncTzVyQt5xkb7fYqnqPtD3HxH8u7lcxZ9KwhOPjwvgU
+axwhELXYBuzgKRDwTWoEqM7UfeGh5HSLlGiG12R8oiSJ9h/iQt5clVbNm3seaof
MzdutbOhINKJ31daZMu3MQpf49Ebj1itzudGfi4lzYcaK+Y7eCymc0LPi0CIvWzK
TUVaFA7/VqVzakUB/+ocuIWZ+OBW4/6q0ZiR0CdsAuA/POCsdqM3KfA+hoI2D0Oo
omi5uU3+h6DmUZbkcutESEDKnKNlRuThQ7AVGHG62Gkz47m+E7miq6jRz55Ls+vn
DfjAKsBChKALE3hND0vS51ghAgMBAAGjUDBOMB0GA1UdDgQWBBTX5DUE4YccOajN
0HSvLQeUND0dLzAfBgNVHSMEGDAWgBTX5DUE4YccOajN0HSvLQeUND0dLzAMBgNV
HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCasepCDDCmsoGfUj8ixP56AeSe
caqxtrm67weKGwEJQiVbMUkvWtrMHoySGlWFymzy/GKvrpuW+7TuyrYcu8JqO6gK
MaxhLSum5peJlE9H8HZNhaznjTwj2Vl9tDCP0WN0e+9z/4oPlE7x3GLtUoELcWvj
trrIVYYvX5hO62EDeKNpW6EbY33KuabsudEc5VV1a1dPnAnI5bbSNEoE2RKBvQ6V
f3MWzarGIDC0Pe1Q6TmAuCcXnz9OXclPD7TGqOCB6YwrQFOWe/9fV69k/D5TsFyz
SH4U9V9adNyY1T67Ib5EYFMbUXU4FAAwj0SIPjGjGvkehoNRojMZuWlA0pnX
-----END CERTIFICATE-----
$ openssl smime -verify -in se181073.p7b -inform der -certfile se181073.cer -noverify
foobar
Verification successful
3