如何解决PDF 签名 - 使用 ItextSharp 将时间戳标记设置为签名
我目前正在开发一个 Web 应用程序 (1),该应用程序允许将 pdf 文件的哈希值发送到另一个应用程序 (2)。应用程序 (2) 返回一个签名散列。 我有一个时间戳令牌,它是另一个 API 的返回值, 我正在尝试将它添加到我的签名方法中,但我不知道如何
签名方法
public string GetHash(string AttachID,string InternalAttch_ID,string Certif,string AttachName,bool notPdfFile,bool hasPdf )
{
try
{
string fileName = ConfigurationManager.AppSettings["unsignedPdf"] + AttachID + ".pdf";
string SignedFileName = ConfigurationManager.AppSettings["signedPdf"] + AttachID + "_Signed.pdf";
string SignatureImg = ConfigurationManager.AppSettings["ImagePath"];
Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[1];
byte[] bytes = Convert.FromBase64String(Certif);
var cert = new X509Certificate2(bytes);
chain[0] = new Org.BouncyCastle.X509.X509CertificateParser().ReadCertificate(cert.GetRawCertData());
using (PdfReader reader = new PdfReader(fileName))
{
using (FileStream os = File.OpenWrite(SignedFileName))
{
PdfStamper stamper = PdfStamper.CreateSignature(reader,os,'\0',null,true);
PdfSignatureAppearance appearance = null;
appearance = stamper.SignatureAppearance;
appearance.Reason = "Reason";
appearance.Location = "location";
appearance.SignDate = DateTime.Now.Date;
appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(50,100,270,270),1,UserName);
appearance.IsInvisible();
appearance.Acro6Layers = true;
IExternalSignature signature = new RemoteSignature();
MakeSignature.SignDetached(appearance,signature,chain,CryptoStandard.CADES);
stamper.Close();
os.Close();
}
}
return "GetHash successfully done";
}
catch (Exception e)
{
string err = e.Message;
return null;
}
}
internal class RemoteSignature : IExternalSignature
{
public virtual byte[] Sign(byte[] message)
{
IDigest messageDigest = DigestUtilities.GetDigest(GetHashAlgorithm());
byte[] messageHash = DigestAlgorithms.Digest(messageDigest,message);
string urlEncoded = HttpUtility.UrlEncode(Convert.ToBase64String(messageHash));
byte[] urlEncodedByte = Encoding.ASCII.GetBytes(urlEncoded);
var i = 0;
while (readySignHashFile != true)
{
i++;
}
return Convert.FromBase64String(signedHash);
}
public virtual String GetHashAlgorithm()
{
return "SHA-256";
}
public virtual String GetEncryptionAlgorithm()
{
return "RSA";
}
}
解决方法
你打电话
MakeSignature.SignDetached(appearance,signature,chain,null,CryptoStandard.CADES);
null
参数之一是 ITSAClient
。
要为您的签名加上时间戳,请提供非空的 ITSAClient
,例如 TSAClientBouncyCastle
实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。