2015-03-04 6 views
1

Когда линия для извлечения открытого ключа выполняется, запрос LDAP посылается:Построив RSACryptoServiceProvider из X509Certificate2 без запроса LDAP делается

 this.certificate = new X509Certificate2(buffer); 
     System.Security.Cryptography.X509Certificates.PublicKey key = this.certificate.PublicKey; 

50 0,853745000 xxx.xxx.xxx.xxx xxx.xxx .xxx.xxx LDAP 404 searchRequest (1) "" baseObject

... который, как я считаю, аутентифицирует текущего пользователя. Мне действительно нужно избегать этого вызова, так как на клиентской системе это вызывает длительную задержку из-за конфигурации сети.

Я предполагаю, что он пытается выполнить некоторую аутентификацию в каком-либо хранилище ключей, но так как в этом случае сертификат содержится в предоставленном буфере, все, что я хочу, это использовать ключ без этого запроса послал.

Все, что я действительно хочу, это создать RSACryptoServiceProvider из закрытого ключа в сертификате. Я попробовал несколько методов, которые я нашел здесь, используя GetPrivateKey, но изо всех сил пытался заставить что-то работать.

Заранее благодарен!

EDIT программы Тест:

static void Main(string[] args) 
    { 
     var certificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(@"E:\Temp\Cert.cer"); 
     System.Security.Cryptography.X509Certificates.PublicKey key = certificate.PublicKey; 
    } 

Свидетельство я тестировал с можно найти здесь: Cert.cer

Да, это не самая сильная подпись или ключ, прежде чем я получаю комментарии!

Еще раз спасибо.

EDIT: Я действительно работал вокруг этого, используя предложение использовать BouncyCastle. Я использую это для разбора сертификата:

X509CertificateParser parser = new X509CertificateParser(); 
Org.BouncyCastle.X509.X509Certificate cert = parser.ReadCertificate(buffer); 

Я тогда извлечь модуль и экспоненту и толкать их в RSAParameters Microsoft:

RsaKeyParameters key = (RsaKeyParameters)cert.GetPublicKey(); 

// Construct a microsoft RSA crypto service provider using the public key in the certificate 
RSAParameters param = new RSAParameters(); 
param.Exponent = key.Exponent.ToByteArrayUnsigned(); 
param.Modulus = key.Modulus.ToByteArrayUnsigned(); 

Затем я могу построить Microsoft RSACryptoServiceProvider из этого:

using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider()) 
{ 
    provider.ImportParameters(param); 
    byte[] rsaBlock = provider.Encrypt(preMasterSecret, false); 
    this.Client.Writer.Write(rsaBlock); 
} 
+0

вы уверены, что это строка выполняет запрос LDAP? Можете ли вы показать нам больше кода? – Crypt32

+0

Я воспроизвел это с помощью простой тестовой программы и самозаверяющего сертификата. Я обновлю вопрос с помощью тестового кода. –

+0

И да, когда я перехожу на вторую строку, я получаю следующее в Wireshark: [link] (https://dl.dropboxusercontent.com/u/106407239/Wireshark%20from%20private%20key.png) –

ответ

1

У меня не было никакого другого ответа, так что вот реализация Bouncycastle, которую я использовал.

X509CertificateParser parser = new X509CertificateParser(); 
Org.BouncyCastle.X509.X509Certificate cert = parser.ReadCertificate(buffer); 

я затем извлечь модуль и экспоненту и подтолкнуть их в RSAParameters Microsoft:

RsaKeyParameters key = (RsaKeyParameters)cert.GetPublicKey(); 

// Construct a microsoft RSA crypto service provider using the public key in the certificate 
RSAParameters param = new RSAParameters(); 
param.Exponent = key.Exponent.ToByteArrayUnsigned(); 
param.Modulus = key.Modulus.ToByteArrayUnsigned(); 

Я тогда построим Microsoft RSACryptoServiceProvider из этого:

using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider()) 
{ 
    provider.ImportParameters(param); 
    byte[] rsaBlock = provider.Encrypt(preMasterSecret, false); 
    this.Client.Writer.Write(rsaBlock); 
}