2017-05-10 22 views
2

次のようなユースケースは、次のとおりです。C#が - PDF署名から公開鍵を取得

  1. ユーザーは、ユーザーがPDFをダウンロードすることができ
  2. 有効な場合、証明書を提示する必要がウェブサイトに入力し、それに署名
  3. PDFをアップロード
  4. サーバーの検証PDFには、Webサイトに提示するのと同じ証明書で署名します。

私はステップ4で立ち往生しています。クライアント証明書の公開鍵をWebサイトからもPDFからも取得できましたが、同じではありません。公開鍵は2048ビットのSHA256 RSAです。また、iTextSharpを使用してPDF文書を処理しています。

は、ここに私のコードです。このコードcertKeyで

HttpRequest request = context.Request; 

HttpClientCertificate cert = request.ClientCertificate; 

//get public key from client certificate 
string certKey = BitConverter.ToString(cert.PublicKey).Replace("-", " ") 

//now gets PDF and retrieves public key 
PdfReader pdfreader = new PdfReader("path_to_pdf"); 


AcroFields fields = pdfreader.AcroFields; 
AcroFields.Item item = fields.GetFieldItem("Signature1"); 
List<string> names = fields.GetSignatureNames(); 

foreach (string name in names){ 
    PdfDictionary dict = fields.GetSignatureDictionary(name); 
    PdfPKCS7 pkcs7 = fields.VerifySignature(name); 
    Org.BouncyCastle.X509.X509Certificate cert = pkcs7.SigningCertificate; 

    //get public key from PDF cert 
    SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(cert.GetPublicKey()); 
    byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); 
    string serializedPublic = BitConverter.ToString(serializedPublicBytes).Replace("-", " "); 
} 

とserializedPublicは同じではありません。あなたのコードで

+0

は基本的に異なります(長さとバイトシーケンスの部分の全体的な類似性に関して)か、あるいは単にDER/base64エンコーディングの不一致でしょうか?また、オペレーティングシステムまたはPDFビューアの証明書のプロパティダイアログを使用して両方の証明書を調べると、一致するものはありますか? – dlatikay

+1

私はそれにもかかわらず。私のコードは、ビューアの証明書のプロパティから直接見ることができ、証明書と同じではないので、PDFから取得しています – A77ak

+0

[公開鍵](https:// msdn)を使用してブラウザ/ Microsoftの/ en-us/library/system.web.httpclientcertificate.publickey(v = vs.110).aspx)...次に、違いが最初に明らかになる場所を見つけようとする必要があります。私はテストのための何らかの種類の自己署名証明書を持っていると思いますか?署名されたPDFに表示されている公開鍵は最初の証明書と一致していますか? – dlatikay

答えて

0

あなたは

  • と証明書(HttpClientCertificate.PublicKey)から公開鍵とそのアルゴリズムをラップSubjectPublicKeyInfoオブジェクト(publicKeyInfo.ToAsn1Object().GetDerEncoded())のバイナリ値を

    • 公開鍵バイナリ値を比較します。

    後者、従って、と予想されることでが一致しない前者が、を含みます。

    SubjectPublicKeyInfoは、次のように定義されています。その代わり、フルSubjectPublicKeyInfoオブジェクトのバイナリ表現と比較すること

    SubjectPublicKeyInfo ::= SEQUENCE { 
        algorithm AlgorithmIdentifier, 
        publicKey BIT STRING 
    } 
    

    、したがって、あなたが含まれている公開鍵のバイナリ表現を比較する必要があります:

    publicKeyInfo.PublicKeyData.GetBytes() 
    
  • 関連する問題