我尝试使用iText7实施数字签名时遇到问题。根据iText的文档和几个示例,我需要实现IExternalSignature
(here),就像这样:IExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm);
,但这是我得到异常的地方:
var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(cert.PrivateKey).Private;
这基本上意味着“在当前状态下使用无效的密钥”(?)。
大多数示例来自旧版本的iText库和Java(我正在使用C#),我无法完全弄清楚。
我将非常感谢您提供任何提示。谢谢!
编辑:这里是一些示例代码,仅用于复制异常:
static void Main(string[] args)
{
string output = "D:/Development/TestApp/testOutputMoje.pdf";
string input = "D:/Development/TestApp/testInput.pdf";
PdfReader reader = new PdfReader(input);
string digestAlgorithm = DigestAlgorithms.SHA256;
List<X509Certificate2> oCertChain = new List<X509Certificate2>();
//getting certificates from store
X509Store store = new X509Store(StoreName.My);
store.Open(OpenFlags.ReadOnly);
foreach (var oCert in store.Certificates)
{
oCertChain.Add(oCert);
}
store.Close();
//siginig with first certificate - just example
var cert = oCertChain[0];
//exception here:
var pk = Org.BouncyCastle.Security.DotNetUtilities.GetKeyPair(cert.PrivateKey).Private;
X509Certificate[] bouncyCert = { Org.BouncyCastle.Security.DotNetUtilities.FromX509Certificate(cert) };
StampingProperties stampProp = new StampingProperties();
stampProp.PreserveEncryption();
IExternalSignature signature = new PrivateKeySignature(pk, digestAlgorithm);
PdfSigner signer = new PdfSigner(reader, new FileStream(output, FileMode.Create), stampProp);
signer.SignDetached(signature, bouncyCert, null, null, null, 0, CryptoStandard.CADES);
reader.Close();
}
加上有关证书的更多信息(不幸的是我无法向您显示任何详细信息)
问题出在证书中。必须将其标记为“可导出”。我不知道如何解决这种情况,但是在我的情况下,我以这种方式使用了自己的证书:
var cert = new X509Certificate2();
cert.Import(File.ReadAllBytes(@"C:\temp\certificate.cer"), "password", X509KeyStorageFlags.Exportable);
这有效。
您需要找到更改证书标志的方法。也许用store.Open(OpenFlags.MaxAllowed)
起作用,但这不起作用。