2
次のようなユースケースは、次のとおりです。C#が - PDF署名から公開鍵を取得
- ユーザーは、ユーザーがPDFをダウンロードすることができ
- 有効な場合、証明書を提示する必要がウェブサイトに入力し、それに署名
- PDFをアップロード
- サーバーの検証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は同じではありません。あなたのコードで
は基本的に異なります(長さとバイトシーケンスの部分の全体的な類似性に関して)か、あるいは単にDER/base64エンコーディングの不一致でしょうか?また、オペレーティングシステムまたはPDFビューアの証明書のプロパティダイアログを使用して両方の証明書を調べると、一致するものはありますか? – dlatikay
私はそれにもかかわらず。私のコードは、ビューアの証明書のプロパティから直接見ることができ、証明書と同じではないので、PDFから取得しています – A77ak
[公開鍵](https:// msdn)を使用してブラウザ/ Microsoftの/ en-us/library/system.web.httpclientcertificate.publickey(v = vs.110).aspx)...次に、違いが最初に明らかになる場所を見つけようとする必要があります。私はテストのための何らかの種類の自己署名証明書を持っていると思いますか?署名されたPDFに表示されている公開鍵は最初の証明書と一致していますか? – dlatikay