web-dev-qa-db-ja.com

秘密鍵を.netのX509Certificate2クラスに関連付けます

私は、X509certificateと公開/秘密キーのペアを作成するコードに取り組んでいます。公開鍵は証明書に追加され、署名するCAに送信されます。

返された証明書は、System.Security.Cryptography.X509Certificates.X509Certificate2クラスを通じてアクセスされます。次に、この証明書を使用して、他のクライアントとの安全な接続を開始します。したがって、SslStreamクラスを使用します。 SSLハンドシェイクを開始するには、次の方法を使用します。

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クラスにはPrivateKeyというプロパティがあり、プライベートキーを証明書に関連付けると思いますが、このプロパティを設定する方法が見つかりません。

秘密鍵を.net X509クラスに関連付ける方法はありますか?

19
PogoMips

同じ問題を抱えている他のすべての人のために、私はあなたがそれを正確に行えるようにするきちんとした小さなコードを見つけました:

http://www.codeproject.com/Articles/162194/Certificates-to-DB-and-Back

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;

編集:ヘルパーメソッドのコード(それ以外の場合はcodeprojectログインが必要)は次のとおりです。

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