2010-06-09 5 views
5

я создаю сертификат x509 с помощью MakeCert со следующими параметрами:Создать сертификат x509 с OpenSSL/MakeCert инструмент

MakeCert -r -pe -n "CN = Client" -ss MyApp

Я хочу использовать этот сертификат для шифрования и расшифровки данных с помощью алгоритма RSA. Я смотрю на сгенерированный сертификат в хранилище сертификатов Windows, и все выглядит нормально (у него есть закрытый ключ, открытый ключ - RSA-ключ с 1024 бит и т. Д.)

Теперь я использую этот код C# для шифрования данных:

X509Store store = new X509Store("MyApp", StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadOnly); 
X509Certificate2Collection certs = store.Certificates.Find(X509FindType.FindBySubjectName, "Client", false); 
X509Certificate2 _x509 = certs[0]; 

using (RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)_x509.PublicKey.Key) 
{ 
    byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello"); 
    _encryptedData = rsa.Encrypt(dataToEncrypt, true); 
} 

При выполнении метода шифрования я получаю исключение CryptographicException с сообщением «Bad key».

Я думаю, что код в порядке. Возможно, я не создаю сертификат должным образом. Любые комментарии?

---------------- EDIT --------------
Если кто-либо знает, как создать сертификат с использованием OpenSsl, это также действительный ответ для меня.

+0

При создании своего сертификата какой бит пары частных/открытых ключей вы указываете? Возможно, вам нужно указать более длинные ключи 4048 бит? – berkay

+0

Я не уверен, о чем вы говорите. Я просто использовал параметры, показанные выше в команде makecert. Если вы говорите об одном, предположите значение по умолчанию. Но мой открытый ключ имеет 1024 бита. –

+0

okey, тогда я никогда не использую makecert, просто выполните поиск, чтобы создать его 4048 бит.1024 бит сломан по этой причине, вы можете получить ошибку. – berkay

ответ

3

Чтобы разрешить использование ключа для шифрования, вы должны использовать -sky-option. По умолчанию в файле «aakecert» используется спецификация ключа AT_SIGNATURE, которая не будет работать с шифрованием/расшифровкой. Вместо того, чтобы иметь его использовать спецификацию AT_KEYEXCHANGE, выполнив следующую команду:

makecert -r -pe -n "CN=Client" -ss MyApp -sky Exchange 

(Не забудьте удалить предыдущую клавишу или используйте другое имя-контейнер).

+0

Я прочитал RSA algoritm можно использовать как для подписывания, так и для шифрования сообщений. Нельзя ли в одном сертификате шифровать и подписывать ключи? –

+1

AT_KEYEXCHANGE может использоваться как для подписания, так и для шифрования, а не наоборот. –

1

Это была другая страница, на которую я наткнулся, когда пытался найти примеры использования makcert с сертификатами x509 и rsa с помощью C#, и, к сожалению, это лишь часть решения. Я поместил все биты в запись в блоге, которую могут заинтересовать люди, и ее можно найти здесь: http://nick-howard.blogspot.com/2011/05/makecert-x509-certificates-and-rsa.html