2011-02-08 16 views
9

ウェブサービスにアクセスするには、証明書が必要です。X509証明書をデータベースに保存

私は私の本命を生成:

openssl genrsa 1024 > private.key 
openssl req -new -x509 -nodes -sha1 -days 1100 -key private.key > public.cer 

、私は、X509Certificate2

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

として私PFXファイルをロードし、その後

openssl pkcs12 -in public.cer -inkey private.key -export -out client.pfx 

によってPFX証明書には、この2のでしょうマージ次のフィールドを含むテーブルをデータベースに作成したい:

PrivateKey NVARCHAR 
PublicCer NVARCHAR 
Password NVARCHAR 

次に、private.keyファイルのコンテンツを----- BEGIN CERTIFICATE -----と----- END CERTIFICATE -----と一緒にpublic.cerと同じにコピーします、パスワードを設定します。 DBからこのデータを読み取って、X509Certificate2の適切なインスタンスを取得するにはどうすればよいですか? つまり、秘密鍵と証明書に基づいてコードからpfxファイルを生成するにはどうすればよいですか?

私はより正確にしようとします:----- --- -----証明書をBEGINと終了

string connectionString; string query; string cert; 

    connectionString = ConfigurationManager.ConnectionStrings[0].ConnectionString; 
    query = "SELECT clientcert FROM settings_services WHERE ID = 1"; 

    using (SqlConnection cn = new SqlConnection(connectionString)) 
    { 
     SqlCommand cmd = new SqlCommand(query, cn); 
     cn.Open(); 
     cert = (string)cmd.ExecuteScalar(); 
    } 

    X509Certificate2 serverCert = new X509Certificate2(Encoding.UTF8.GetBytes(cert)); 

このコードは正しく始まる証明書の文字列(x509証明書をロードします - 証明書を送付する-----)。

私の秘密鍵は(----- RSA PRIVATE KEY ----などを... BEGIN)

私がする必要があるRSA形式である:

は、今私は、秘密鍵を取得する必要がありますこれをロードしてserverCertに割り当て、この証明書をWebサービスでの認証に使用できるようにします。

どうすればよいですか?

+0

あなたはここでそれを見つけるでしょう、この問題への答え。 http://www.codeproject.com/KB/security/CertificatesToDBandBack.aspxよろしく、 –

+0

関連:https://stackoverflow.com/questions/893757 – explunit

答えて

4

バイト[]を持つコンストラクタがあります。だから、バイト配列としてあなたの証明書を保管し、

public X509Certificate2(
    byte[] rawData 
) 

リンクを使用して証明書をロードすることができますhttp://msdn.microsoft.com/en-us/library/ms148413%28v=VS.100%29.aspx

+0

これは私の場合には当てはまりません。クライアントがprivate.keyと公開証明書を生成できるようにする必要があります。次に、これらの2つのファイルの内容をDBにコピーし、プライベートキーのパスワードをDBに保存する必要があります。さて、これらのデータに基づいて、コードから、私は有効なX509Certificate2オブジェクトを作成する必要があります。 –

+0

@MaiO:これはあなたの質問に含めるべき細部です。とにかく、 '----- BEGIN CERTIFICATE -----'と '----- END CERTIFICATE -----'の間のものはBase64でエンコードされたデータです。開始するには、 'Covert.FromBase64String()'を使ってテキストを実行してください。 – josh3736

+0

これは実際には動作していないようです。エラーはCryptographicExceptionです:要求されたオブジェクトが見つかりません – r590

6

私はそれの簡単な説明を発見したが、これは、実際には簡単です。私は私の要旨で証明書の文字列を残してきた(サンプル証明書なしの安全なデータ)

https://gist.github.com/BillKeenan/5435753

[TestMethod] 
public void TestCertificate() 
{ 
    const string publicCert = @"MIIBrzCCARigAwIBAgIQEkeKoXKDFEuzql5XQnkY9zANBgkqhkiG9w0BAQUFADAYMRYwFAYDVQQDEw1DZXJ0QXV0aG9yaXR5MB4XDTEzMDQxOTIwMDAwOFoXDTM5MTIzMTIzNTk1OVowFjEUMBIGA1UEAxMLc2VydmVyMS5jb20wgZ0wDQYJKoZIhvcNAQEBBQADgYsAMIGHAoGBAIEmC1/io4RNMPCpYanPakMYZGboMCrN6kqoIuSI1n0ufzCbwRkpUjJplsvRH9ijIHMKw8UVs0i0Ihn9EnTCxHgM7icB69u9EaikVBtfSGl4qUy5c5TZfbN0P3MmBq4YXo/vXvCDDVklsMFem57COAaVvAhv+oGv5oiqEJMXt+j3AgERMA0GCSqGSIb3DQEBBQUAA4GBAICWZ9/2zkiC1uAend3s2w0pGQSz4RQeh9+WiT4n3HMwBGjDUxAx73fhaKADMZTHuHT6+6Q4agnTnoSaU+Fet1syVVxjLeDHOb0i7o/IDUWoEvYATi8gCtcV20KxsQVLEc5jkkajzUc0eyg050KZaLzV+EkCKBafNoVFHoMCbm3n"; 
    const string privateCert = @"<RSAKeyValue><Modulus>gSYLX+KjhE0w8Klhqc9qQxhkZugwKs3qSqgi5IjWfS5/MJvBGSlSMmmWy9Ef2KMgcwrDxRWzSLQiGf0SdMLEeAzuJwHr270RqKRUG19IaXipTLlzlNl9s3Q/cyYGrhhej+9e8IMNWSWwwV6bnsI4BpW8CG/6ga/miKoQkxe36Pc=</Modulus><Exponent>EQ==</Exponent><P>mmRPs28vh0mOsnQOder5fsxKsuGhBkz+mApKTNQZkkn7Ak3CWKaFzCI3ZBZUpTJag841LL45uM2NvesFn/T25Q==</P><Q>1iTLW2zHVIYi+A6Pb0UarMaBvOnH0CTP7xMEtLZD5MFYtqG+u45mtFj1w49ez7n5tq8WyOs90Jq1qhnKGJ0mqw==</Q><DP>JFPWhJKhxXq4Kf0wlDdJw3tc3sutauTwnD6oEhPJyBFoPMcAjVRbt4+UkAVBF8+c07gMgv+VHGyZ0lVqvDmjgQ==</DP><DQ>lykIBEzI8F6vRa/sxwOaW9dqo3fYVrCSxuA/jp7Gg1tNrhfR7c3uJPOATc6dR1YZriE9QofvZhLaljBSa7o5aQ==</DQ><InverseQ>KrrKkN4IKqqhrcpZbYIWH4rWoCcnfTI5jxMfUDKUac+UFGNxHCUGLe1x+rwz4HcOA7bKVECyGe6C9xeiN3XKuQ==</InverseQ><D>Fsp6elUr6iu9V6Vrlm/lk16oTmU1rTNllLRCZJCeUlN/22bHuSVo27hHyZ1f+Q26bqeL9Zpq7rZgXvBsqzFt9tBOESrkr+uEHIZwQ1HIDw2ajxwOnlrj+zjn6EKshrMOsEXXbgSAi6SvGifRC2f+TKawt9lZmGElV4QgMYlC56k=</D></RSAKeyValue>"; 

    var certificate = new X509Certificate2(Convert.FromBase64String(publicCert)); 

    var crypto = new RSACryptoServiceProvider(); 

    crypto.FromXmlString(privateCert); 

    certificate.PrivateKey = crypto; 

    //export a private key 
    var exportedPrivate = certificate.PrivateKey.ToXmlString(true); 
    var exportedPublic = Convert.ToBase64String(certificate.RawData); 

    Assert.AreEqual(publicCert, exportedPublic); 
    Assert.AreEqual(privateCert, exportedPrivate); 
} 
関連する問題