Стоит задача подписать xml c помощью приватного ключа и пароля, потом проверить подпись с помощью сертификата.
Проблема заключается как правильно инициализировать RSACryptoServiceProvider.
Читал тут, но так не понял как прикрутить ключ, пароль и сертификат.
Заранее спасибо.
Здравствуйте, LF, Вы писали:
LF>Читал тут, но так не понял как прикрутить ключ, пароль и сертификат. LF>Заранее спасибо.
Очень просто. Пишу по памяти, по этому будут синтаксические ошибки.
Вариант 1:
X509Certificate2 cer = new X509Certificate2([байты нашего pfx-контейнера], [пароль к контейнеру]);
Как с помощью OpenSSL обернуть сертификат и ключ в контейнер pfx -- найдете или пример нужен?
объект cer имеет поле PrivateKey. Это и есть RSACryptoServiceProviderили DSACryptoServiceProvider. Т.е. можно написать, к примеру, так:
string xmlKey = cer.PrivateKey.ToXmlString(true);
Вариант 2.
Можно использовать прямо из системного хранилища ключей. Только нужно знать название контейнера. Там легко -- в конструкторе Service есть необходимый параметр, по памяти не помню точно.
0K>X509Certificate2 cer = new X509Certificate2([байты нашего pfx-контейнера], [пароль к контейнеру]);
0K>
0K>Как с помощью OpenSSL обернуть сертификат и ключ в контейнер pfx -- найдете или пример нужен? 0K>объект cer имеет поле PrivateKey. Это и есть RSACryptoServiceProviderили DSACryptoServiceProvider. Т.е. можно написать, к примеру, так: 0K>
Ни о каких pfx речи не идет.
0K>Вариант 2. 0K>Можно использовать прямо из системного хранилища ключей. Только нужно знать название контейнера. Там легко -- в конструкторе Service есть необходимый параметр, по памяти не помню точно.
К сожалению, требование такое, что хранить сертификаты в центральном хранилище нельзя.
И еще один вопрос, допустим подписали мы с помощью X509Certificate2.
Теперь как проверить подпись не зная пароля?
Конструктор X509Certificate2 ругается, если указать только массив байт без пароля.
Подпись работает, проблем вроде нет.
Далее пытаюсь подпись так проверить:
var base64 = // беру данные из mycert.pem из секции CERTIFICATE@"MIICqDCCAhGgAwIBAgIJALRPuxdjdMPMMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV
BAYTAnJ1MQ0wCwYDVQQIDAR0ZXN0MQ0wCwYDVQQHDAR0ZXN0MQ0wCwYDVQQKDAR0
ZXN0MQ0wCwYDVQQLDAR0ZXN0MQ0wCwYDVQQDDAR0ZXN0MRMwEQYJKoZIhvcNAQkB
FgR0ZXN0MB4XDTEwMDgwNDEzMTAyMFoXDTExMDgwNDEzMTAyMFowbTELMAkGA1UE
BhMCcnUxDTALBgNVBAgMBHRlc3QxDTALBgNVBAcMBHRlc3QxDTALBgNVBAoMBHRl
c3QxDTALBgNVBAsMBHRlc3QxDTALBgNVBAMMBHRlc3QxEzARBgkqhkiG9w0BCQEW
BHRlc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALEYj0a5pCeucggicBfE
LTgrfyGH0dRDRm3BuWUCLUDcc4ymV8UE8Cjz3Imw+OwgNVhfAsd9s+TUg6wg+YRX
Nxud+BTSvAgiT7jz6A8BDNZyUvfKCBt9JCDzXWuMUB0gUuMFXhEp2T3C+mpljwWn
wS+aqLjx/Dv4J+iAmBhBP+7dAgMBAAGjUDBOMB0GA1UdDgQWBBSg7OKolAan49XE
MBdywX8+YxPhNDAfBgNVHSMEGDAWgBSg7OKolAan49XEMBdywX8+YxPhNDAMBgNV
HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAEmHZZ9N7YwIKlJkqhy3zzLrypyo
meRFOZPHir9y7onlmfWAFVakXYUHPhHSc4YO4AIFtGJ3ipNpt+88e6nnu+WUFbwG
Dg7v93GAN/+uWaDDYueCVPh7j5CPjozYJV0pExe8pwZnOQmELvNkLuaXqKTTYR7F
itNHp7q0+0PHbb76";
var rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(Convert.FromBase64String(base64)); // тут исключение System.Security.Cryptography.CryptographicException: Плохая версия поставщика