在没有LDAP请求的情况下从X509Certificate2构造RSACryptoServiceProvider

时间:2015-03-04 15:35:18

标签: c# x509certificate2 rsacryptoserviceprovider

执行提取公钥的行时,将发送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的方法,但是很难让任何工作起作用。

提前致谢!

编辑测试程序:

    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

是的,在我收到评论之前,它不是最强的签名或密钥!

再次感谢。

编辑:我实际上通过使用BouncyCastle的建议解决了这个问题。我用它来解析证书:

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

然后我提取模数和指数并将它们推送到Microsoft RSAParameters:

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);
}

1 个答案:

答案 0 :(得分:1)

我从来没有得到任何其他回应,所以这是我使用的Bouncycastle实现。

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

然后我提取模数和指数并将它们推送到Microsoft RSAParameters:

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);
}