Я работаю на Win 7 Professional и C # (VS2010). Мне нужно подписать файл и создать конверт PKCS.
Сертификат, используемый для подписи, находится на смарт-карте USB (я установил CSP поставщика услуг шифрования, поставляемый вместе со смарт-картой).
Это код, который я написал, используя надувной замок
private byte[] SignData(byte[] DataTosign)
{
X509Certificate2 card = GetCertificate();
Org.BouncyCastle.X509.X509Certificate cert = DotNetUtilities.FromX509Certificate(card);
Org.BouncyCastle.Crypto.AsymmetricKeyParameter K = DotNetUtilities.GetKeyPair(card.PrivateKey).Private;
CmsSignedDataGenerator generator = new CmsSignedDataGenerator();
generator.AddSigner(K, cert, CmsSignedDataGenerator.EncryptionRsa, CmsSignedDataGenerator.DigestSha1);
ArrayList certList = new ArrayList();
certList.Add(cert);
Org.BouncyCastle.X509.Store.X509CollectionStoreParameters PP = new Org.BouncyCastle.X509.Store.X509CollectionStoreParameters(certList);
Org.BouncyCastle.X509.Store.IX509Store st1 = Org.BouncyCastle.X509.Store.X509StoreFactory.Create("CERTIFICATE/COLLECTION", PP);
generator.AddCertificates(st1);
CmsSignedData signedData = generator.Generate("1.2.840.113549.1.7.1", new CmsProcessableByteArray(DataTosign), true); // <- here is the flag
return signedData.GetEncoded();
}
public static X509Certificate2 GetCertificate()
{
X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
st.Open(OpenFlags.ReadOnly);
X509Certificate2Collection col = st.Certificates;
X509Certificate2 card = null;
X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificates", "Select one to sign", X509SelectionFlag.SingleSelection);
if (sel.Count > 0)
{
X509Certificate2Enumerator en = sel.GetEnumerator();
en.MoveNext();
card = en.Current;
}
st.Close();
return card;
}
Проблема в Org.BouncyCastle.Crypto.AsymmetricKeyParameter K = DotNetUtilities.GetKeyPair(card.PrivateKey).Private;
где я получаю
System.Security.Cryptography.CryptographicException (Указанный тип сообщения недействителен)
Кажется, проблема в том, что приватный ключ находится на смарт-карте, но для использования генератора. AddSigner, я должен передать приватный ключ. Может кто-нибудь помочь мне с тем, как подписаться сертификатом на смарт-карте?
Большое спасибо!