关于c#:将私钥与.net中的X509Certificate2类相关联

Associate a private key with the X509Certificate2 class in .net

我正在研究一些创建X509证书和公钥/私钥对的代码。公钥被添加到证书中,并发送到签署它的CA。

然后通过system.security.cryptography.x509certificates.x509certificate2类访问返回的证书。现在,我想使用这个证书启动与其他客户机的安全连接。因此,我使用sslstream类。要启动SSL握手,我使用以下方法:

1
2
3
4
5
6
server.AssociatedSslStream.AuthenticateAsServer(
                        MyCertificate,                      // Client Certificate
                        true,                               // Require Certificate from connecting Peer
                        SslProtocols.Tls,                   // Use TLS 1.0
                        false                               // check Certificate revocation
                    );

此方法要求私钥与证书关联。当然,CA返回的证书不包含私钥。但它在硬盘上存储为.key文件。X509certificate2类有一个名为private key的属性,我想它会将私钥与证书关联起来,但我找不到设置此属性的方法。

我是否可以将私钥与.NET X509类关联?


您可以省去复制粘贴所有代码的麻烦,并将证书旁边的私钥存储在pfx/pkcs#12文件中:

1
openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx

您必须提供一个密码,该密码必须传递给X509Certificate2的构造函数:

1
X509Certificate2 cert = new X509Certificate2("mycert.pfx","password");


对于其他所有有同样问题的人,我发现了一小段整洁的代码,让我们让您做到这一点:

http://www.codeproject.com/articles/162194/certificates-to-db-and-back

1
2
3
4
5
6
7
byte[] certBuffer = Helpers.GetBytesFromPEM(publicCert, PemStringType.Certificate);
byte[] keyBuffer  = Helpers.GetBytesFromPEM(privateKey, PemStringType.RsaPrivateKey);

X509Certificate2 certificate = new X509Certificate2(certBuffer, password);

RSACryptoServiceProvider prov = Crypto.DecodeRsaPrivateKey(keyBuffer);
certificate.PrivateKey = prov;

编辑:helper方法(否则需要codeproject登录)的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static byte[] GetBytesFromPEM(string pemString, PemStringType type)
{
    string header; string footer;
    switch (type)
    {
        case PemStringType.Certificate:
            header ="-----BEGIN CERTIFICATE-----";
            footer ="-----END CERTIFICATE-----";
            break;
        case PemStringType.RsaPrivateKey:
            header ="-----BEGIN RSA PRIVATE KEY-----";
            footer ="-----END RSA PRIVATE KEY-----";
            break;
        default:
            return null;
    }

    int start = pemString.IndexOf(header) + header.Length;
    int end = pemString.IndexOf(footer, start) - start;
    return Convert.FromBase64String(pemString.Substring(start, end));
}