我正在数字签署xml文档。这里是我的代码:如何在签署文档时检查DSC(USB令牌)是否已连接?
private void mbSign_Click_1(object sender, EventArgs e)
{
try
{
CadesSignature cs = new CadesSignature(FStrDSCSNo);
cs.DigitalSignatureCertificate = DigitalCertificate.LoadCertificate(false, string.Empty, "Select Certificate", "Select the certificate for digital signature");
RSACryptoServiceProvider rsaEncryptor = (RSACryptoServiceProvider)cs.DigitalSignatureCertificate.PrivateKey;
L_ADSC_ValidTo = cs.DigitalSignatureCertificate.NotAfter.ToShortDateString();
if (DateTime.Now <= DateTime.ParseExact(L_ADSC_ValidTo, "dd/MM/yyyy", null))
{
FObjLog.WriteToLog("Valid DSC");
L_ADSC_CertStatus = "A";
// Sign the XML document.
//DataTable dt_SignXMlAndSignaute = new DataTable();
SignXml(rsaEncryptor);
}
}
catch (CryptographicException)
{
MessageBox.Show("Invalid DSC Selection.Please Choose Correct DSC");
FObjLog.WriteToLog("Invalid DSC Selection.Please Choose Correct DSC");
}
catch (NullReferenceException)
{
MessageBox.Show("Please Attach DSC");
FObjLog.WriteToLog("Please Attach DSC");
}
}
public void SignXml(RSA Key)
{
XmlDocument LXMLDoc = new XmlDocument();
if (File.Exists(LXMLPath))
{
LXMLDoc.Load(LXMLPath);
}
if (LXMLDoc == null)
throw new ArgumentException("LXMLDoc");
if (Key == null)
throw new ArgumentException("Key");
// Create a SignedXml object.
SignedXml signedXml = new SignedXml(LXMLDoc);
// Add the key to the SignedXml document.
signedXml.SigningKey = Key;
// Create a reference to be signed.
Reference reference = new Reference();
//reference.Uri = txtfilepath.Text;
reference.Uri = "";
// Add an enveloped transformation to the reference.
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env); // calculating Digest value
// Add the reference to the SignedXml object.
signedXml.AddReference(reference);
// Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new RSAKeyValue((RSA)Key));
signedXml.KeyInfo = keyInfo;
signedXml.ComputeSignature();
string FullSignatureValue = "";
string SignatureValue = "";
XmlElement xmlDigitalSignature = signedXml.GetXml();
FullSignatureValue = xmlDigitalSignature.InnerText;
string[] Sign = FullSignatureValue.Split(new char[] { '=' }, 2);
SignatureValue = Sign[1].ToString();
signedXml = new SignedXml(LXMLDoc);
LXMLDoc.DocumentElement.AppendChild(LXMLDoc.ImportNode(xmlDigitalSignature, true));
}
在这里我能签署文件,但我无法检查是否在签署时连接USB令牌。这里发生的情况是,即使没有连接USB令牌,也会弹出证书供选择,因为证书在本地可用。当您从Internet Explorer中删除所有证书并尝试使用未连接的USB令牌进行签名时,它会要求连接DSC卡(USB令牌)。我只想在连接DSC(USB令牌)时签署文件。我如何确保在签名时连接USB?