登录PDF文件使用iTextSharp的5.3.3和USB令牌 [英] Sign PDF with iTextSharp 5.3.3 and USB token
本文介绍了登录PDF文件使用iTextSharp的5.3.3和USB令牌的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是新来iTextSharp的(和计算器)。我试图签署使用外部USB令牌在C#中的PDF文件。我尝试使用后续的代码中,我从互联网上挖出。
Org.BouncyCastle.X509.X509CertificateParser CP =新的组织。 BouncyCastle.X509.X509CertificateParser();
//获取Sertifiacte
X509Certificate2 certClient = NULL;
的X509Store ST =新的X509Store(StoreName.My,StoreLocation.CurrentUser);
st.Open(OpenFlags.MaxAllowed);
X509Certificate2Collection集合= X509Certificate2UI.SelectFromCollection(st.Certificates,请选择证书,,X509SelectionFlag.SingleSelection);
如果(collection.Count大于0){
certClient =集合[0];
}
st.Close();
//获取证书链
&IList的LT; Org.BouncyCastle.X509.X509Certificate>链=新的List< Org.BouncyCastle.X509.X509Certificate>();
X509Chain x509chain =新X509Chain();
x509chain.Build(certClient);
的foreach(X509ChainElement x509ChainElement在x509chain.ChainElements){
chain.Add(DotNetUtilities.FromX509Certificate(x509ChainElement.Certificate));
}
PdfReader读卡器=新PdfReader(sourceDocument);
的FileStream resStream =新的FileStream(resultDocument,FileMode.Create,FileAccess.ReadWrite);
PdfStamper压模= PdfStamper.CreateSignature(读卡器,resStream,\0',NULL,TRUE);
PdfSignatureAppearance外观= stamper.SignatureAppearance;
appearance.Reason =原因;
appearance.Location =位置;
appearance.SetVisibleSignature(新iTextSharp.text.Rectangle(20,10,170,60),1,签名);
X509Certificate2Signature ES =新X509Certificate2Signature(certClientSHA-1);
MakeSignature.SignDetached(外观,ES,链条,NULL,NULL,NULL,0,CryptoStandard.CMS);
的问题是,我收到一个例外:
<预类=郎无prettyprint-覆盖>
System.Security.Cryptography.CryptographicException了未处理
消息=无效类型指定。
来源= mscorlib程序
堆栈跟踪:
在System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32小时)
在System.Security.Cryptography.Utils._GetKeyParameter( safeKeyHandle的hKey,UInt32的paramID)
在System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType关键字类型,CspParameters参数,布尔randomKeyContainer,的Int32 dwKeySize,safeProvHandle&安培; safeProvHandle,safeKeyHandle&安培; safeKeyHandle)
在System.Security。 Cryptography.RSACryptoServiceProvider.GetKeyPair()
在System.Security.Cryptography.RSACryptoServiceProvider..ctor(的Int32 dwKeySize,CspParameters参数,布尔useDefaultKeySize)
在System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()在iTextSharp.text.pdf.security.X509Certificate2Signature..ctor(X509Certificate2证书的HashAlgorithm字符串)
在WindowsFormsApplication1.PDFSignerHelper.signPdfFile(字符串sourceDocument,字符串resultDocument,X509Certificate2 certClient,原因字符串,字符串位置)
的InnerException:
解决方案
这个方法工作正常我们(iTextSharp的5.3.3)。我们使用智能卡和USB令牌(供应商 - www.author.kiev.ua ):
的X509Store店=新的X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection SEL = X509Certificate2UI.SelectFromCollection(store.Certificates,NULL,NULL,X509SelectionFlag.SingleSelection);
X509Certificate2证书= SEL [0];
Org.BouncyCastle.X509.X509CertificateParser CP =新Org.BouncyCastle.X509.X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate [] =链新Org.BouncyCastle.X509.X509Certificate [] {
cp.ReadCertificate(cert.RawData)};
IExternalSignature externalSignature =新X509Certificate2Signature(证书,SHA-1);
PdfReader pdfReader =新PdfReader(pathToBasePdf);
signedPdf =新的FileStream(pathToBasePdf,FileMode.Create);
pdfStamper = PdfStamper.CreateSignature(pdfReader,signedPdf,\0');
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
signatureAppearance.SignatureGraphic = Image.GetInstance(pathToSignatureImage);
signatureAppearance.SetVisibleSignature(新的Rectangle(100,100,250,150),pdfReader.NumberOfPages,签名);
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;
MakeSignature.SignDetached(signatureAppearance,externalSignature,链条,NULL,NULL,NULL,0,CryptoStandard.CMS);
I'm new to iTextSharp (and StackOverFlow). I'm trying to sign a PDF in C# using external USB token. I try using the follow code I've digged from the internet.
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
//Get Sertifiacte
X509Certificate2 certClient = null;
X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
st.Open(OpenFlags.MaxAllowed);
X509Certificate2Collection collection = X509Certificate2UI.SelectFromCollection(st.Certificates, "Please choose certificate:", "", X509SelectionFlag.SingleSelection);
if (collection.Count > 0){
certClient = collection[0];
}
st.Close();
//Get Cert Chain
IList<Org.BouncyCastle.X509.X509Certificate> chain = new List<Org.BouncyCastle.X509.X509Certificate>();
X509Chain x509chain = new X509Chain();
x509chain.Build(certClient );
foreach (X509ChainElement x509ChainElement in x509chain.ChainElements){
chain.Add(DotNetUtilities.FromX509Certificate(x509ChainElement.Certificate));
}
PdfReader reader = new PdfReader(sourceDocument);
FileStream resStream = new FileStream(resultDocument, FileMode.Create, FileAccess.ReadWrite);
PdfStamper stamper = PdfStamper.CreateSignature(reader, resStream , '\0', null, true);
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
appearance.Reason = reason;
appearance.Location = location;
appearance.SetVisibleSignature(new iTextSharp.text.Rectangle(20, 10, 170, 60), 1, "Signed");
X509Certificate2Signature es = new X509Certificate2Signature(certClient, "SHA-1");
MakeSignature.SignDetached(appearance, es, chain, null, null, null, 0, CryptoStandard.CMS);
The problem is that I receive an exception:
System.Security.Cryptography.CryptographicException was unhandled
Message=Invalid type specified.
Source=mscorlib
StackTrace:
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.Utils._GetKeyParameter(SafeKeyHandle hKey, UInt32 paramID)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
at iTextSharp.text.pdf.security.X509Certificate2Signature..ctor(X509Certificate2 certificate, String hashAlgorithm)
at WindowsFormsApplication1.PDFSignerHelper.signPdfFile(String sourceDocument, String resultDocument, X509Certificate2 certClient, String reason, String location)
InnerException:
解决方案
This approach works fine for us (iTextSharp 5.3.3). We use smart-card and USB-token (vendor - www.author.kiev.ua):
X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
X509Certificate2 cert = sel[0];
Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] {
cp.ReadCertificate(cert.RawData)};
IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");
PdfReader pdfReader = new PdfReader(pathToBasePdf);
signedPdf = new FileStream(pathToBasePdf, FileMode.Create);
pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '\0');
PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
signatureAppearance.SignatureGraphic = Image.GetInstance(pathToSignatureImage);
signatureAppearance.SetVisibleSignature(new Rectangle(100, 100, 250, 150), pdfReader.NumberOfPages, "Signature");
signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;
MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
这篇关于登录PDF文件使用iTextSharp的5.3.3和USB令牌的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文