在没有发出 LDAP 请求的情况下从 X509Certificate2 构造 RSACryptoServiceProvider
Constructing RSACryptoServiceProvider from X509Certificate2 without LDAP request being made
执行提取 public 密钥的行时,将发送 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);
}
我从未收到任何其他回复,所以这是我使用的 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);
}
执行提取 public 密钥的行时,将发送 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);
}
我从未收到任何其他回复,所以这是我使用的 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);
}