2017-09-15 23 views
1

すべての同様の質問を行っていますが、itextsharp据え置き署名が適用されているケースは見つかりませんでした。デジタル署名(PKCS#7 - 据え置き署名)/署名が適用されてから文書が変更または破損しました

基本的に、私のアプリケーションは、リモートWebサービスによって作成されたPKCS#7署名を使用してpdf文書に署名します。

私のアプリケーションは、元のドキュメントのハッシュ(空の署名フィールドが追加された後の署名可能なバイトのハッシュ)を送信し、Base64でエンコードされた署名ファイルを受け取ります。

このシグネチャは、署名フィールドが空の以前に生成された一時的なpdfファイルに埋め込みます。

最終的に私の署名は検証されません.Adobe Readerは、文書が変更されたか破損していると言います。空の署名フィールドを追加し、この操作tempPdfの結果PDFファイル

public static string GetBytesToSign(string unsignedPdf, string tempPdf, string signatureFieldName) 
{ 
    if (File.Exists(tempPdf)) 
     File.Delete(tempPdf); 

    using (PdfReader reader = new PdfReader(unsignedPdf)) 
    { 
     using (FileStream os = File.OpenWrite(tempPdf)) 
     { 
      PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0'); 
      PdfSignatureAppearance appearance = stamper.SignatureAppearance; 
      appearance.SetVisibleSignature(new Rectangle(36, 748, 250, 400), 1, signatureFieldName); 

      IExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED); 

      MakeSignature.SignExternalContainer(appearance, external, 8192); 

      byte[] array = SHA256Managed.Create().ComputeHash(appearance.GetRangeStream()); 

      return Convert.ToBase64String(array); 
     } 
    } 
} 

の署名可能バイトを取得し

コードが生成され、私は、このtempPdfからPDF文書の署名可能バイトのハッシュを受け取りますファイル。

次のコードを使用して、このtempFileを再度開き、Base64でエンコードされたPKCS#7シグネチャを埋め込みます。一時PDFファイルを開き、signedPdf私の最後のこの操作の結果、受信した署名

public static void EmbedSignature(string tempPdf, string signedPdf, string signatureFieldName, string signature) 
{ 
    byte[] signedBytes = Convert.FromBase64String(signature); 

    using (PdfReader reader = new PdfReader(tempPdf)) 
    { 
     using (FileStream os = File.OpenWrite(signedPdf)) 
     { 
      IExternalSignatureContainer external = new MyExternalSignatureContainer(signedBytes); 
      MakeSignature.SignDeferred(reader, signatureFieldName, os, external); 
     } 
    } 
} 

を埋め込み

コードが生成されます。しかし、アドビは、署名が変更や破損によって有効ではないと言います。

enter image description here

My Original File

Temporary File Generated For Signing

Final Signed File

私は、Webサービスに送信された一時ファイルのファイルのハッシュは以下のとおりです。

z9qIyvtp4cRBZ1SSCQ + P0JVRinz5lv jYjXk3L7YPは/ IEは=

Iは、Webサービスから受信した署名である:私は私が考える一時署名ファイルのために使用される一時ファイルとsignedFileのバイトと一時ファイルのゼロのみを(比較

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 

)はsignedFileの実際の署名に置き換えられます。

enter image description here

enter image description here

私は本当にこの時点で立ち往生しています。私は次にどこを見なければならないのか分かりません。あなたは、Webサービスから受信した署名で

+0

'GetBytesToSign'の' return'行が 'Convert.ToBase64String(array)'ではなく 'Convert.FromBase64String(array)'を実際に返していますか?前者は意味がありません。 'array'はbase64文字列ではないので、base64文字列から*変換する呼び出しの引数にはなりません。 – mkl

+0

申し訳ありませんタイプミスで修正しました。私はGetBytesToSignの外で変換を行い、質問を書いている間にメソッド内に移動しました。 –

+0

Raadol Hallederiz ..... – sotn

答えて

1

あり:ここ

39 59: . . . SEQUENCE { 
    41 9: . . . . OBJECT IDENTIFIER data (1 2 840 113549 1 7 1) 
     : . . . . . (PKCS #7) 
    52 46: . . . . [0] { 
    54 44: . . . . . OCTET STRING  
     : . . . . . . 7A 39 71 49 79 76 74 70 z9qIyvtp 
     : . . . . . . 34 63 52 42 5A 31 53 53 4cRBZ1SS 
     : . . . . . . 43 51 2B 50 30 4A 56 52 CQ+P0JVR 
     : . . . . . . 69 6E 7A 35 6C 76 6A 59 inz5lvjY 
     : . . . . . . 6A 58 6B 33 4C 37 59 50 jXk3L7YP 
     : . . . . . . 2F 49 45 3D    /IE= 
     : . . . . . } 
     : . . . . } 
[...] 
1955 9: . . . . . SEQUENCE { 
1957 5: . . . . . . OBJECT IDENTIFIER sha1 (1 3 14 3 2 26) 
     : . . . . . . . (OIW) 
1964 0: . . . . . . NULL 
     : . . . . . . } 
1966 93: . . . . . [0] { 
1968 24: . . . . . . SEQUENCE { 
1970 9: . . . . . . . OBJECT IDENTIFIER contentType (1 2 840 113549 1 9 3) 
     : . . . . . . . . (PKCS #9) 
1981 11: . . . . . . . SET { 
1983 9: . . . . . . . . OBJECT IDENTIFIER data (1 2 840 113549 1 7 1) 
     : . . . . . . . . . (PKCS #7) 
     : . . . . . . . . } 
     : . . . . . . . } 
1994 28: . . . . . . SEQUENCE { 
1996 9: . . . . . . . OBJECT IDENTIFIER signingTime (1 2 840 113549 1 9 5) 
     : . . . . . . . . (PKCS #9) 
2007 15: . . . . . . . SET { 
2009 13: . . . . . . . . UTCTime 22/09/2017 13:18:38 GMT 
     : . . . . . . . . } 
     : . . . . . . . } 
2024 35: . . . . . . SEQUENCE { 
2026 9: . . . . . . . OBJECT IDENTIFIER messageDigest (1 2 840 113549 1 9 4) 
     : . . . . . . . . (PKCS #9) 
2037 22: . . . . . . . SET { 
2039 20: . . . . . . . . OCTET STRING  
     : . . . . . . . . . EF 37 38 3B B1 31 AB 96 .78;.1.. 
     : . . . . . . . . . CE FC 47 1E 32 A7 79 73 ..G.2.ys 
     : . . . . . . . . . 5D 95 15 04    ]... 
     : . . . . . . . . } 
     : . . . . . . . } 
     : . . . . . . } 
2061 13: . . . . . SEQUENCE { 
2063 9: . . . . . . OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) 
     : . . . . . . . (PKCS #1) 
2074 0: . . . . . . NULL 
     : . . . . . . } 

あなたのbase64でエンコードされたハッシュ埋め込まれた署名されたデータ(オフセット56..99)として表示されます。さらに、ハッシュアルゴリズムは「SHA-1」(オフセット1955.1965)として選択され、署名付き文書ハッシュはSHA-1ハッシュ値のサイズに一致する20バイトの値である。さらに、PKCS#1 1.5(2061.2075のオフセット)で説明されているようにRSAが署名に使用されます。

したがって、署名サービスでは、入力をbase64でエンコードされた事前計算ドキュメントのハッシュ値として使用するのではなく、SHA1withRSA/2048を使用して署名するためのプレーンなデータとして見えます。

エラーはあなたのiTextのコードではなく、あなたの署名サービスの呼び出しコードにあります。

+0

ありがとうございました。私はbase64でエンコードされたハッシュ値の署名を明示的に要求していましたが、サービスは共有している署名を返していました。 –

+0

SHA1アルゴリズムが署名に使用されたので、署名は無効ですか? –

+0

いいえ。あなたがサービスに与えたデータはすでに文書データのハッシュであったため、サービスはハッシュしなければならない平易なデータを取得しました。 – mkl

関連する問題