Подпись XML c помощью сертификата.
От: LF  
Дата: 04.08.10 11:00
Оценка:
Добрый день.
С помощью OpenSSL генерирую приватный ключ:
openssl genrsa -des3 -out keys/ca.key 1024

потом на основе ключа сертификат:
openssl req -new -x509 -days 1001 -key keys/ca.key -out certs/ca.cer

Стоит задача подписать xml c помощью приватного ключа и пароля, потом проверить подпись с помощью сертификата.
Проблема заключается как правильно инициализировать RSACryptoServiceProvider.

Читал тут, но так не понял как прикрутить ключ, пароль и сертификат.
Заранее спасибо.
Re: Подпись XML c помощью сертификата.
От: 0K Ниоткуда  
Дата: 04.08.10 12:59
Оценка: 2 (1)
Здравствуйте, LF, Вы писали:

LF>Читал тут, но так не понял как прикрутить ключ, пароль и сертификат.

LF>Заранее спасибо.

Очень просто. Пишу по памяти, по этому будут синтаксические ошибки.

Вариант 1:

X509Certificate2 cer = new X509Certificate2([байты нашего pfx-контейнера], [пароль к контейнеру]);


Как с помощью OpenSSL обернуть сертификат и ключ в контейнер pfx -- найдете или пример нужен?

объект cer имеет поле PrivateKey. Это и есть RSACryptoServiceProviderили DSACryptoServiceProvider. Т.е. можно написать, к примеру, так:

string xmlKey = cer.PrivateKey.ToXmlString(true);


Вариант 2.

Можно использовать прямо из системного хранилища ключей. Только нужно знать название контейнера. Там легко -- в конструкторе Service есть необходимый параметр, по памяти не помню точно.
Re[2]: Подпись XML c помощью сертификата.
От: LF  
Дата: 04.08.10 13:19
Оценка:
Спасибо за ответ.

0K>Вариант 1:

0K>
0K>X509Certificate2 cer = new X509Certificate2([байты нашего pfx-контейнера], [пароль к контейнеру]);
0K>

0K>Как с помощью OpenSSL обернуть сертификат и ключ в контейнер pfx -- найдете или пример нужен?
0K>объект cer имеет поле PrivateKey. Это и есть RSACryptoServiceProviderили DSACryptoServiceProvider. Т.е. можно написать, к примеру, так:
0K>
0K>string xmlKey = cer.PrivateKey.ToXmlString(true);
0K>

А без pfx можно обойтись? Просто по требованию на вход функции передаются пароль и файл типа такого:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,E51866A70EBE71A7247F5FC33994A7B7

QHF0aIjqk/kJAg3hE/WHd9POq54BG9/KW8zKt0duG0asl6DUJSLaND/4HVayVAql
...
-----END RSA PRIVATE KEY-----

На выходе подписанный хмл.

А функция проверки получает на вход файл такой:
-----BEGIN CERTIFICATE-----
MIICqDCCAhGgAwIBAgIJAJ6zdswgUNkmMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNV
...
-----END CERTIFICATE-----


Ни о каких pfx речи не идет.

0K>Вариант 2.

0K>Можно использовать прямо из системного хранилища ключей. Только нужно знать название контейнера. Там легко -- в конструкторе Service есть необходимый параметр, по памяти не помню точно.
К сожалению, требование такое, что хранить сертификаты в центральном хранилище нельзя.
Re[2]: Подпись XML c помощью сертификата.
От: LF  
Дата: 04.08.10 13:36
Оценка:
И еще один вопрос, допустим подписали мы с помощью X509Certificate2.
Теперь как проверить подпись не зная пароля?
Конструктор X509Certificate2 ругается, если указать только массив байт без пароля.
Re[3]: Подпись XML c помощью сертификата.
От: 0K Ниоткуда  
Дата: 04.08.10 14:06
Оценка: 2 (1)
Здравствуйте, LF, Вы писали:

LF>А без pfx можно обойтись? Просто по требованию на вход функции передаются пароль и файл типа такого:


Можно. Но проще всего с pfx. Иначе нужно использовать сторонние библиотеки для расшифровки вашего ключа.
Re[3]: Подпись XML c помощью сертификата.
От: 0K Ниоткуда  
Дата: 04.08.10 14:07
Оценка: 2 (1)
Здравствуйте, LF, Вы писали:

LF>Теперь как проверить подпись не зная пароля?


Передавайте не pfx, а cer. Пароль не нужен.
Re[2]: Подпись XML c помощью сертификата.
От: LF  
Дата: 05.08.10 07:06
Оценка:
Задам еще несколько вопросов, что то у меня пробелы в данной области
Генерирую pfx так:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
openssl pkcs12 -export -out mycert.pfx -in mycert.pem -name "My Certificate"

Подпись работает, проблем вроде нет.
Далее пытаюсь подпись так проверить:
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: Плохая версия поставщика

Что то я в тупике.
Re[3]: Подпись XML c помощью сертификата.
От: LF  
Дата: 05.08.10 07:14
Оценка:
LF>Что то я в тупике.
Все разобрался.
надо делать так:
var base64 =
@"MIICqDCCAhGgAwIBAgIJALRPuxdjdMPMMA0GCSqGSIb3DQEBBQUAMG0xCzAJBgNVBAYTAnJ1MQ0wCwYDV
QQIDAR0ZXN0MQ0wCwYDVQQHDAR0ZXN0MQ0wCwYDVQQKDAR0ZXN0MQ0wCwYDVQQLDAR0ZXN0MQ0wCwYDVQQD
DAR0ZXN0MRMwEQYJKoZIhvcNAQkBFgR0ZXN0MB4XDTEwMDgwNDEzMTAyMFoXDTExMDgwNDEzMTAyMFowbTE
LMAkGA1UEBhMCcnUxDTALBgNVBAgMBHRlc3QxDTALBgNVBAcMBHRlc3QxDTALBgNVBAoMBHRlc3QxDTALBg
NVBAsMBHRlc3QxDTALBgNVBAMMBHRlc3QxEzARBgkqhkiG9w0BCQEWBHRlc3QwgZ8wDQYJKoZIhvcNAQEBB
QADgY0AMIGJAoGBALEYj0a5pCeucggicBfELTgrfyGH0dRDRm3BuWUCLUDcc4ymV8UE8Cjz3Imw+OwgNVhf
Asd9s+TUg6wg+YRXNxud+BTSvAgiT7jz6A8BDNZyUvfKCBt9JCDzXWuMUB0gUuMFXhEp2T3C+mpljwWnwS+
aqLjx/Dv4J+iAmBhBP+7dAgMBAAGjUDBOMB0GA1UdDgQWBBSg7OKolAan49XEMBdywX8+YxPhNDAfBgNVHS
MEGDAWgBSg7OKolAan49XEMBdywX8+YxPhNDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAEmHZ
Z9N7YwIKlJkqhy3zzLrypyomeRFOZPHir9y7onlmfWAFVakXYUHPhHSc4YO4AIFtGJ3ipNpt+88e6nnu+WU
FbwGDg7v93GAN/+uWaDDYueCVPh7j5CPjozYJV0pExe8pwZnOQmELvNkLuaXqKTTYR7FitNHp7q0+0PHbb76";

/*
            var rsa = new RSACryptoServiceProvider();
            rsa.ImportCspBlob(Convert.FromBase64String(base64));
*/
            var x509 = new X509Certificate2(Convert.FromBase64String(base64));            
            var xmlDoc = new XmlDocument();

А потом этот x509 передать на вход signedXml.CheckSignature, всем спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.