如何阅读从USB令牌证书(电子令牌亲72 K(JAVA)),并连接到PDF(How to Read

2019-10-19 23:48发布

我想读通过USB令牌SafeNet的签名(阿拉丁的eToken亲72 K(JAVA)),并连接到PDF格式。 我不知道如何做到这一点。 在以前,他们给导出选项.pfx文件。 现在,他们正在给出口选项.cer文件。 当我用Google搜索我得到这个代码。 当我运行此代码它提示令牌的密码后输入密码,我可以能够验证签名,但我不知道如何将签名附加到PDF格式。 请指导我是否是方向正确与否。 我使用C#语言

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);


        }

Answer 1:

因为它似乎,你需要签署与存储在USB令牌密钥的PDF。

要弄清楚的第一件事是什么签约要使用的格式。 PDF可以根据PDF说明书(包括数字签名),的PAdES(扩展PDF签名)进行签名,或者作为使用CMS / CADES或甚的XMLDSig /的XAdES一个通用的二进制数据。

假设你需要签署PDF根据PDF规范,你很可能需要使用一些库比如我们PDFBlackbox或iText的 (观看许可和定价!)。

回到技术面 - 你提到包含证书的唯一公共部分.CER文件和私有密钥,用于签名,通常不能被提取从安全设备,如USB令牌。 PDF格式的签名库必须支持通过一些编程接口调用USB令牌(我们PDFBlackbox支持的CryptoAPI和PKCS#11),将它签数据的哈希值。



Answer 2:

如果你想签订嵌入的签名PDF您很可能会需要使用PDF处理库如iTextSharp的将嵌入到签名PDF文档的结构。 从iText的软件布鲁诺Lowagie写所谓的“白皮书对PDF文档的数字签名是关于在PDF文档中的数字签名信息的重要来源。”

如果你也想使用你的应用在除Windows以外的平台,那么你应该看看我的Pkcs11Interop.PDF库扩展iTextSharp的与以数字方式存储在几乎所有的PKCS#11兼容设备的私钥(PDF文件签署的能力智能卡,HSM等)。

有关iTextSharp的和Pkcs11Interop.PDF库伟大的事情是,他们可用的双许可模式下,所以如果你能够遵守的条款AGPL许可证 ,那么你可以使用这两个库是免费的。



Answer 3:

现代令牌中间件(驱动器)来与它的顶部CSP(加密服务提供程序)。 该CSP检测并处理事件,当USB令牌在插入或删除,使得证书在Windows证书存储区中可用的令牌。 您可以使用Windows X509安全库在C#访问的签署证书,访问哪个轮流使用CSP使用令牌中的私钥签名来获得内容的证书存储。 私钥永不出来的令牌。

如果您正在寻找在Web应用程序中使用它,请参阅本SO答案



文章来源: How to Read a certificate from Usb Token(etoken pro 72 k(Java) )and attach to pdf