Подписание PDF с использованием itextsharp и токена - PullRequest
0 голосов
/ 15 декабря 2018

Спасибо за вашу помощь, я протестировал предложенное решение, но проблема в том, что когда я вызываю getrangestream (), возникает исключение NullPointerException. Вот код:

 public byte[] presign(string src,string dest){
 PdfReader reader=new PdfReader(src);  
 FileStream os=File.OpenWrite(dest);
 PdfStamper stamper = 
 PdfStamper.CreateSignature(reader, os, '\0'); 
 sap = stamper.SignatureAppearance; 
 Stream data=sap.GetRangeStream();
 hash = DigestAlgorithms.Digest(data, "SHA256");
 return hash;
 }//returns the hash to signing application on the server 
 public void postsign(byte[] signed_bytes){ 
IExternalSignature mysig=new MySignature(); 
 mysig.Sign(signed_bytes);//the signed_hash is returned from the server 
 MakeSignature.SignDetached(sap,mysig,final_chain,crlList,null, 
 null,8192,CryptoStandard.CMS)}

// crllistи final_chain - это информация «crl info» и «cert chain» соответственно, которые создаются при чтении файла pem

1 Ответ

0 голосов
/ 18 декабря 2018

Простой способ реализовать подписание PDF с помощью iText 5.5.x с использованием внешней службы подписи или устройства - использовать реализацию IExternalSignature или IExternalSignatureContainer, в которой соответствующий метод Sign вызывает службу внешней подписи иликод для подписи этим устройством для данных из его аргумента и возврата сигнатуры результата.

Для простоты давайте предположим, что ваша служба подписи / устройство могут использоваться для возврата полноценного контейнера сигнатур CMS.В этом случае можно использовать реализацию IExternalSignatureContainer, подобную этой:

PdfReader reader = new PdfReader(SRC);
FileStream os = new FileStream(DEST, FileMode.Create);
PdfStamper stamper = PdfStamper.CreateSignature(reader, os, '\0');
// Creating the appearance
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
appearance.Reason = "For a reason surely";
appearance.Location = "Positively somewhere";
appearance.SetVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
IExternalSignatureContainer externalSignatureContainer = new ExternalServiceContainerSigner();
// Creating the signature
MakeSignature.SignExternalContainer(appearance, externalSignatureContainer, 8192);

с

class ExternalServiceContainerSigner : IExternalSignatureContainer
{
    public void ModifySigningDictionary(PdfDictionary signDic)
    {
        signDic.Put(PdfName.FILTER, PdfName.ADOBE_PPKLITE);
        signDic.Put(PdfName.SUBFILTER, PdfName.ADBE_PKCS7_DETACHED);
    }

    public byte[] Sign(Stream data)
    {
        String hashAlgorithm = "SHA256";
        byte[] hash = DigestAlgorithms.Digest(data, hashAlgorithm);
        // call your external signature service to create a CMS signature
        // container for the given document hash and return the bytes of
        // that signature container.
        return CALL_YOUR_EXTERNAL_SIGNATURE_SERVICE_TO_CREATE_A_CMS_SIGNATURE_CONTAINER_FOR(hash);
    }
}

Если ваша служба подписи / устройство не предлагает создать контейнер подписи CMS, а вместо этоготолько голые байты подписи или подпись в стиле PKCS # 1, вы можете либо

  • заменить вызов CALL_YOUR_EXTERNAL_SIGNATURE_SERVICE_TO_CREATE_A_CMS_SIGNATURE_CONTAINER_FOR, приведенный выше, своим собственным кодом, подготавливая и подписывая контейнер подписи для хэша данного документа, используя внешнюю службу/ device или
  • использует реализацию IExternalSignature, вызывающую вашу службу, и MakeSignature.SignDetached, чтобы использовать эту реализацию.
...