Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在登录iTextSharp时自动输入密码_.net_Itext_Digital Signature_Smartcard_X509certificate2 - Fatal编程技术网

.net 如何在登录iTextSharp时自动输入密码

.net 如何在登录iTextSharp时自动输入密码,.net,itext,digital-signature,smartcard,x509certificate2,.net,Itext,Digital Signature,Smartcard,X509certificate2,我必须使用存储在安全令牌中的证书。我可以从windows证书存储访问它,但该设备有密码,因此会显示一个带有输入字段的弹出窗口,我使用了CspParameters自动输入密码 但是,当我在弹出的数千个文件上签名时,会再次显示输入密码。 这是我用于加载证书的代码: public X509Certificate2 loadX509byPass() { var store = new X509Store(StoreName.My, StoreLocation.Cu

我必须使用存储在安全令牌中的证书。我可以从windows证书存储访问它,但该设备有密码,因此会显示一个带有输入字段的弹出窗口,我使用了CspParameters自动输入密码

但是,当我在弹出的数千个文件上签名时,会再次显示输入密码。 这是我用于加载证书的代码:

public X509Certificate2 loadX509byPass()
        {
            var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.MaxAllowed);
            var certificates = store.Certificates.Find(X509FindType.FindBySerialNumber, SerialNumber, false);
            var cert = certificates[0];
            store.Close();

            var pass = new SecureString();           
            char[] array = Password.ToCharArray();
            foreach (char ch in array)
            {
                pass.AppendChar(ch);
            }
             var privateKey = cert.PrivateKey as RSACryptoServiceProvider;
             CspParameters cspParameters = new CspParameters(privateKey.CspKeyContainerInfo.ProviderType,
             privateKey.CspKeyContainerInfo.ProviderName,
             privateKey.CspKeyContainerInfo.KeyContainerName,
               new System.Security.AccessControl.CryptoKeySecurity(),
             pass);  

            var rsaCsp = new RSACryptoServiceProvider(cspParameters);              
            // set modified RSA crypto provider back
            cert.PrivateKey = rsaCsp;
            return cert;
        }
签署文件时:

                         Cert = SingletonCA.Instance.loadX509byPass();
                         ....
                         BcX509.X509Certificate bcCert = DotNetUtils.FromX509Certificate(Cert);
                        var chain = new List<BcX509.X509Certificate> { bcCert };
                        var FontColour = new BaseColor(0, 0, 255); 
                        IExternalSignature pks = new X509Certificate2Signature(Cert, "SHA1");                        

                        MakeSignature.SignDetached(appearance, pks, chain, null, null, null, 0, CryptoStandard.CMS);  
Cert=SingletonCA.Instance.loadX509byPass();
....
BcX509.x509证书bcCert=DotNetUtils.fromx509证书(Cert);
var chain=新列表{bcCert};
var FONTCOLOR=新的基色(0,0,255);
IExternalSignature pks=新X509Certificate2Signature(证书,“SHA1”);
MakeSignature.signDistached(外观、pks、链、null、null、null、0、CryptoStandard.CMS);
是否可以在不显示此消息的代码中发送密码


谢谢您的帮助。

您是只调用一次
loadX509byPass()
还是一次又一次地调用每个签名?是的,兄弟。我想USB令牌被拒绝了是的,只有一次一次的文件。每个文件一次?为什么不简单一次呢?我不理解这个用例。如果不是某种形式的批准(当然需要手动输入),签名应该表明什么?缓存PIN的想法违反了任何安全性概念。如果说它更像是一种完整性保护,那么数字签名就不是一个很有说服力的选择。如果你坚持这样做,有些卡不需要PIN码就可以使用钥匙。