2011-02-08 8 views
9

Web servisine erişmek için sertifikaya ihtiyacım var. Mağaza X509 Sertifika veritabanı

benim certs oluşturulan:

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

Şimdi o zaman X509Certificate2 olarak benim pfx dosyası yüklü

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

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

tarafından pfx sertifikası içine bu ikisini birleşti, isterim Aşağıdaki alanları içeren veri tabanına bir tablo oluşturmak gibi:

Daha sonra public.cer için aynı içeriğe ----- BEGIN CERTIFICATE ----- ve ----- END CERTIFICATE ----- ile birlikte private.key dosyasından kopyalayın. ve şifreyi ayarlayın. Şimdi, bu verileri DB'den okuyarak X509Certificate2'nin uygun bir örneğini nasıl edinebilirim? Başka bir deyişle, özel anahtar ve sertifikayı temel alarak koddan bir pfx dosyasını nasıl oluşturabilirim?

Ben daha doğrusu dener:

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

Bu kodu doğru ----- ve bitiş ----- başlayarak (x509 sertifikası sertifika dize yük SERTİFİKA BAŞLANGICI olacak --- --END SERTİFİKASI -----).

Benim özel anahtar (----- RSA ÖZEL KEY ---- vb ... BEGIN)

Ben gerek RSA biçimindedir:

Şimdi özel anahtarı almak gerekir Web servisinde kimlik doğrulaması yapmak için bu sertifikayı kullanabilmek için onu yükleyin ve serverCert'e atayın.

Bunu nasıl yapacağınıza dair herhangi bir öneriniz var mı?

+0

buradan bulacaksınız bu sorunun cevabı. http://www.codeproject.com/KB/security/CertificatesToDBandBack.aspx Saygılar –

+0

İlgili: https://stackoverflow.com/questions/893757 – explunit

cevap

4

Bayt [] ile bir kurucunuz var. Eğer bir bayt dizisi olarak sertifikanızı depolamak ve

public X509Certificate2(
    byte[] rawData 
) 

link ile sertifikanızı yükleyebilirsiniz Yani: http://msdn.microsoft.com/en-us/library/ms148413%28v=VS.100%29.aspx

+0

Bu benim durumum için geçerli değildir. İstemcinin private.key ve public cert'i oluşturmasına izin vermeliyim, o zaman bu iki dosyanın içeriğini DB'ye kopyalamalı ve özel bir anahtarın parolasını da DB'ye kaydetmelidir. Şimdi, bu verilere dayanarak, koddan geçerli bir X509Certificate2 nesnesi oluşturmam gerekiyor. –

+0

@MaiO: Bu, sorunuza eklemeniz gereken bir ayrıntıdır. Her halükarda, ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Sadece Base64 kodlanmış veriler Başlamak için iyi bir yer, metni "Covert.FromBase64String()" ile çalıştırabilir. – josh3736

+0

Belgelerin söylediklerine rağmen bu aslında işe yaramıyor. Hata CryptographicException: İstenen nesneyi bulamıyor – r590

6

bundan hiçbir basit bir açıklama buldum rağmen Yani bu aslında kolaydır. Benim ve özü sertifika dizeleri bıraktım (örnek sertifika, hiçbir güvenli veri)

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