Как изменить параметр CSP для RSACryptoServiceProvider

Я делаю подпись rsa-sha256 xml, используя класс SignedXML. Но проблема в том, что мне нужно изменить CSP для поддержки sha256.

Вот как я выбираю сертификат,

public X509Certificate2 GetCertificateFromStore()
        {
            X509Store st = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            st.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection col = st.Certificates.Find(X509FindType.FindByTimeValid, (object)DateTime.Now, false);

            X509Certificate2 x509Certificate =null;
            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(col, "Certificate", "Select single certificate to sign", X509SelectionFlag.SingleSelection);
            if (sel.Count > 0)
            {
                X509Certificate2Enumerator en = sel.GetEnumerator();
                en.MoveNext();
                x509Certificate = en.Current;
            }
            st.Close();
            //x509Certificate.s
            return x509Certificate;
        }

Вот как я пытаюсь изменить параметр CSP.

byte[] privateKeyBlob;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            rsa = cert.PrivateKey as RSACryptoServiceProvider;
            try
            {
                privateKeyBlob = rsa.ExportCspBlob(true);
            }
            catch
            {
                throw new ApplicationException("Private key fails to export");
            }
            // To use the RSA-SHA256 the CryptoAPI needs to select a special CSP: Microsoft Enhanced RSA and AES Cryptographic Provider
            // By reinstantiating a CSP of type 24 we ensure that we get the right CSP.
            CspParameters cp = new CspParameters(24);
            rsa = new RSACryptoServiceProvider(cp);
            rsa.ImportCspBlob(privateKeyBlob);


            signer.SigningKey = rsa;
            signer.KeyInfo = getKeyInfo(signer, cert);

Проблема в том, что я использую токен USB-устройства и сомневаюсь, что закрытый ключ нельзя экспортировать. При экспорте выдается ошибка «Ключ недействителен для использования в указанном состоянии.».

Кто-нибудь может помочь, как это сделать?


person Matt    schedule 28.07.2012    source источник
comment
В какой строке выдается исключение?   -  person craig1231    schedule 28.07.2012
comment
эта строка privateKeyBlob = rsa.ExportCspBlob(true);   -  person Matt    schedule 28.07.2012
comment
Поможет ли stackoverflow.com/q/10673146/589259?   -  person Maarten Bodewes    schedule 28.07.2012
comment
Исключением является то, что rsa.CspKeyContainerInfo.Exportable имеет значение false, поэтому закрытый ключ нельзя экспортировать.   -  person Suicide Platypus    schedule 21.12.2016


Ответы (1)


Если кому-то интересно, вот мое решение, в итоге я использовал еще одну новую версию моего стороннего CSP. Версия CSP, которую я использовал, была старой, и я переключился на новую версию. Теперь подпись работает. Спасибо за вашу помощь.

person Matt    schedule 30.07.2012