2012-02-04 20 views
8
đang

mẫu:Tạo một X509Certificate2 từ RSACryptoServiceProvider không thành công với Không thể tìm thấy các yêu cầu đối tượng

 CspParameters cspParameters = new CspParameters(); 
     cspParameters.ProviderType = 1; // PROV_RSA_FULL 

     // Create the crypto service provider, generating a new 
     // key. 
     mRsaCSP = new RSACryptoServiceProvider(mDefaultKeyLength, cspParameters); 
     mRsaCSP.PersistKeyInCsp = true; 
     RSAParameters privateKey = mRsaCSP.ExportParameters(true); 


     byte[] rsaBytes = mRsaCSP.ExportCspBlob(true); 

     try 
     { 
      X509Certificate2 cert = new X509Certificate2(rsaBytes);     
      mKeyDataPfx = Convert.ToBase64String(cert.Export(X509ContentType.Pkcs12, password)); 
     } 
     catch (Exception ce) 
     { 
      string error = ce.Message; 
     } 
+0

Khóa RSA không tương thích trực tiếp với Chứng chỉ X509. Chứng chỉ X509 cần có khóa được ký bởi tổ chức phát hành, ngay cả khi nó được ký tự. Bạn có thể cho chúng tôi biết bạn đang thực sự cố gắng thực hiện điều gì không? Bạn đang cố gắng tự động tạo chứng chỉ X509 trong mã? –

+1

Có. Đó chính là điều tôi đang cố gắng làm. Ý tưởng là tôi có các chứng chỉ RSA cũ được lưu trữ dưới dạng chuỗi với RSACryptoServiceProvider.ToXmlString (true). Những thứ đó sẽ cần được đọc và xuất dưới dạng tệp PFX. Chứng chỉ RSA mới sẽ cần được tạo và lưu trữ dưới dạng tệp PFX. – chiefbrownbotom

+0

Tôi khuyên bạn nên kiểm tra mã nguồn Bouncy Castle .NET và các ví dụ. Tôi nghĩ rằng ví dụ bccrypto-net-1.7-src \ csharp \ crypto \ test \ src \ pkcs \ example \ PKCS12Example.cs sẽ giúp bạn bắt đầu. http://www.bouncycastle.org/csharp/ –

Trả lời

2

Đây là giải pháp của tôi, sử dụng thư viện BouncyCastle.

// create the RSA key from an XML string 
RSACryptoServiceProvider key = new RSACryptoServiceProvider(); 
key.FromXmlString(keyTextBox.Text); 

// convert to BouncyCastle key object 
var keypair = DotNetUtilities.GetRsaKeyPair(key); 

var gen = new X509V3CertificateGenerator(); 

string certName = Path.GetFileNameWithoutExtension(fileName); 
var name = new X509Name("CN=" + certName); 
var serial = BigInteger.ProbablePrime(120, new Random()); 

gen.SetSerialNumber(serial); 
gen.SetSubjectDN(name); 
gen.SetIssuerDN(name); 
gen.SetNotAfter(DateTime.Now.AddYears(10)); 
gen.SetNotBefore(DateTime.Now); 
gen.SetSignatureAlgorithm("MD5WithRSA"); 
gen.SetPublicKey(keypair.Public); 

// generate the certificate 
var newCert = gen.Generate(keypair.Private); 
// convert back to .NET certificate 
var cert = DotNetUtilities.ToX509Certificate(newCert); 
// export as byte array 
byte[] certData = cert.Export(X509ContentType.Pfx); 

File.WriteAllBytes(fileName, certData); 
Các vấn đề liên quan