1. ホーム
  2. c#

[解決済み] OCSPが埋め込まれたiTextを使用してPDFに署名する方法

2022-01-28 03:04:36

質問事項

最初の画像は、LTVが有効なpdf署名のものです。このドキュメントは私が作成したものではありません。

失効情報では、以下の文章が表示されます。

選択された証明書は、署名に埋め込まれたオンライン証明書ステータスプロトコル(OCSP)応答を使用して検証した結果、失効していないため有効であるとみなされます。

iTextを使用してpdf文書に署名し、OCSPも適用しています。

OCSPVerifier ocspVerifier = new OCSPVerifier(null, null); // null,null >https://stackoverflow.com/questions/40765907/itextsharp-ocspclientbouncycastle-constructor-is-deprecated-whats-the-replacem
IOcspClient ocspClient = new OcspClientBouncyCastle(ocspVerifier);
var ocsp = ocspClient.GetEncoded(ocspCert,ocspRootCert, "http://www.myurl.com/aia/ocsp");

if (ocsp == null)
    Console.WriteLine("oscp is null");
else
    Console.WriteLine("ocsp is not null");

//Create the pkcs7 container
PdfPKCS7 sgn = new PdfPKCS7(null, c.ToArray(), HashAlgorithm, false);
Console.WriteLine("PdfPKCS7");
byte[] sh = sgn.GetAuthenticatedAttributeBytes(hash, ocsp, null, PdfSigner.CryptoStandard.CMS);
Console.WriteLine("GetAuthenticatedAttributeBytes");

//Load the signature via pkcs11 hardware
byte[] extSignature = GetSignatureFromHashViaPkcs11(sh, pin);
Console.WriteLine("GetSignatureFromHashViaPkcs11");
sgn.SetExternalDigest(extSignature, null, DigestEncryptionAlgorithm);
Console.WriteLine("SetExternalDigest");
var ret = sgn.GetEncodedPKCS7(hash, tsaClient, ocsp, null, PdfSigner.CryptoStandard.CMS);
Console.WriteLine("GetEncodedPKCS7");

Console.WriteLine($"IsTsp : {sgn.IsTsp()}");

この場合、生成された署名は有効であると表示されますが、LTVは有効ではありません。

失効情報では、以下の文章が表示されます。

選択された証明書は、オンラインで取得したオンライン証明書ステータスプロトコル(OCSP)を使用してリアルタイムで検証した結果、失効していないため有効であるとみなされます。

私の推測では、この違いがLTVの問題の原因になっていると思います。iTextでOCSPをオンラインではなく、埋め込むように設定するにはどうしたらよいでしょうか?

解決方法は?

ここで取得したOCSPレスポンスを1つ追加します。

var ocsp = ocspClient.GetEncoded(ocspCert,ocspRootCert, "http://www.myurl.com/aia/ocsp");

しかし、これは署名者証明書の OCSP レスポンスを取得するのではなく、PKI の OCSP 証明書を取得するものです。

必要なのは、関係するすべての証明書とそのチェーン(トラストアンカーを除く)の失効情報です。

このように

  1. は、署名者証明書とそのチェーンから始める必要があります。

    例)もしあなたの c がチェーンとしてソートされている場合、OCSPレスポンスは c[0], c[1] であれば c[1], c[2] , c[2], c[3] など、トラストアンカーまで。

  2. 署名にタイムスタンプが含まれる場合、TSA証明書についても手順1を実行する。

  3. 次に、これらのOCSPレスポンスを検査し、その署名者証明書を取得し、そのチェーンを構築し、それらすべてに対してステップ1を実行する必要があります。 ただし を持つ証明書。 id-pkix-ocsp-nocheck の拡張子を持つ。

    その証明書自身が署名した証明書に対するOCSPレスポンスは、明らかに10円の価値もないのでご注意を...。