C# 如何从Usb令牌(etoken pro 72 k(Java))读取证书并附加到pdf
我想阅读Usb令牌safenet alladin etoken pro 72 kJava的签名,并附上pdf。我不知道怎么做。在以前的版本中,他们提供了导出.pfx文件的选项。现在他们提供了导出.cer文件的选项。当我在谷歌上搜索时,我得到了这个代码。当我运行此代码时,它会在输入密码后提示令牌的密码,我可以验证签名,但我不知道如何将签名附加到pdf。请引导我是否在正确的方向。我用的是c语言C# 如何从Usb令牌(etoken pro 72 k(Java))读取证书并附加到pdf,c#,asp.net,usb,digital-signature,C#,Asp.net,Usb,Digital Signature,我想阅读Usb令牌safenet alladin etoken pro 72 kJava的签名,并附上pdf。我不知道怎么做。在以前的版本中,他们提供了导出.pfx文件的选项。现在他们提供了导出.cer文件的选项。当我在谷歌上搜索时,我得到了这个代码。当我运行此代码时,它会在输入密码后提示令牌的密码,我可以验证签名,但我不知道如何将签名附加到pdf。请引导我是否在正确的方向。我用的是c语言 private void btnGenpdfdigitalSignature_Click(object s
private void btnGenpdfdigitalSignature_Click(object sender, EventArgs e)
{
try
{
// Cert myCert = null;
// Sign text
byte[] signature = Sign("Test", "Name of the signature person");
// Verify signature. Testcert.cer corresponds to "cn=my cert subject"
if (Verify("Test", signature,"jai.cer"))
{
}
else
{
Console.WriteLine("ERROR: Signature not valid!");
}
}
catch (Exception ex)
{
Console.WriteLine("EXCEPTION: " + ex.Message);
}
// Console.ReadKey();
}
static byte[] Sign(string text, string certSubject)
{
// Access Personal (MY) certificate store of current user
X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser);
my.Open(OpenFlags.ReadOnly);
// Find the certificate we'll use to sign
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in my.Certificates)
{
if (cert.Subject.Contains(certSubject))
{
// We found it.
// Get its associated CSP and private key
csp = (RSACryptoServiceProvider)cert.PrivateKey;
}
}
if (csp == null)
{
throw new Exception("No valid cert was found");
}
// Hash the data
SHA1Managed sha1 = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = sha1.ComputeHash(data);
// Sign the hash
return csp.SignHash(hash, CryptoConfig.MapNameToOID("Test"));
}
public bool Verify(string text, byte[] signature, string certPath)
{
// Load the certificate we'll use to verify the signature from a file
cert = new X509Certificate2(certPath);
// Note:
// If we want to use the client cert in an ASP.NET app, we may use something like this instead:
// X509Certificate2 cert = new X509Certificate2(Request.ClientCertificate.Certificate);
// Get its associated CSP and public key
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
// Hash the data
SHA1Managed sha1 = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = sha1.ComputeHash(data);
// Verify the signature with the hash
return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("Test"), signature);
}
看起来,您需要使用存储在USB令牌上的密钥对PDF进行签名
首先要弄清楚的是使用什么样的签名格式。PDF可以根据PDF规范进行签名,其中包括数字签名、PAdES扩展PDF签名,或者使用CMS/CAdES甚至XMLDSig/XAdES作为通用二进制数据进行签名
假设您需要根据PDF规范签署PDF,您很可能需要使用一些库,如我们的或查看许可证和定价
回到技术方面,您提到的.cer文件只包含证书的公共部分,用于签名的私钥通常无法从安全设备(如USB令牌)中提取。PDF签名库必须支持通过某些编程接口调用USB令牌。我们的PDFBlackbox支持CryptoAPI和PKCS11,以便对数据的哈希进行签名 看起来,您需要使用存储在USB令牌上的密钥对PDF进行签名
首先要弄清楚的是使用什么样的签名格式。PDF可以根据PDF规范进行签名,其中包括数字签名、PAdES扩展PDF签名,或者使用CMS/CAdES甚至XMLDSig/XAdES作为通用二进制数据进行签名
假设您需要根据PDF规范签署PDF,您很可能需要使用一些库,如我们的或查看许可证和定价
回到技术方面,您提到的.cer文件只包含证书的公共部分,用于签名的私钥通常无法从安全设备(如USB令牌)中提取。PDF签名库必须支持通过某些编程接口调用USB令牌。我们的PDFBlackbox支持CryptoAPI和PKCS11,以便对数据的哈希进行签名 如果您想使用嵌入签名对PDF进行签名,您很可能需要使用PDF处理库,例如将签名嵌入PDF文档结构的库。iText软件公司的布鲁诺·洛瓦吉(Bruno Lowagie)撰写了一份名为《数字签名》的白皮书,该白皮书是PDF文档中数字签名信息的重要来源 如果你想在Windows以外的平台上使用你的应用程序,那么你应该看看我的库,它扩展了iTextSharp,能够使用几乎所有PKCS11兼容设备智能卡、HSM等上存储的私钥对PDF文档进行数字签名
iTextSharp和Pkcs11Interop.PDF库的最大优点是它们在双许可模式下可用,因此,如果您能够遵守的条款,那么您可以免费使用这两个库。如果您想要使用嵌入签名的PDF签名,您很可能需要使用PDF处理库,例如将嵌入将签名转换为PDF文档的结构。iText软件公司的布鲁诺·洛瓦吉(Bruno Lowagie)撰写了一份名为《数字签名》的白皮书,该白皮书是PDF文档中数字签名信息的重要来源 如果你想在Windows以外的平台上使用你的应用程序,那么你应该看看我的库,它扩展了iTextSharp,能够使用几乎所有PKCS11兼容设备智能卡、HSM等上存储的私钥对PDF文档进行数字签名 iTextSharp和Pkcs11Interop.PDF库的最大优点是它们在双许可模式下可用,因此如果您能够遵守的条款,那么您可以免费使用这两个库