2016-04-29 26 views
5

Tôi đã đoạn mã sau đó tạo ra một cert ký tự đẹp, hoạt động tốt, nhưng tôi muốn cập nhật đến BouncyCastle mới nhất (1.8.1.0) và tôi nhận được cảnh báo về việc sử dụng trở nên lỗi thời:Làm cách nào để tạo chứng chỉ tự ký mà không sử dụng mã BouncyCastle 1.7.0 lỗi thời?

var persistedCertificateFilename = "ClientCertificate.pfx"; 
if (!string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["PersistedCertificateFilename"])) { persistedCertificateFilename = ConfigurationManager.AppSettings["PersistedCertificateFilename"].Trim(); } 
if (persistCertificateToDisk) 
{ 
    if (File.Exists(persistedCertificateFilename)) 
    { 
     var certBytes = File.ReadAllBytes(persistedCertificateFilename); 
       this.clientCertificate = new X509Certificate2(certBytes, (string) null, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); 
    } 
} 

if (this.clientCertificate == null) 
{ 
    // Initialize the new secure keys 
    KeyGenerator keyGenerator = KeyGenerator.Create(); 
    KeyPair keyPair = keyGenerator.GenerateKeyPair(); 
    this.privateKey = keyPair.ToEncryptedPrivateKeyString(privateKeySecret); 
    this.publicKey = keyPair.ToPublicKeyString(); 

    // Client certificate permissions 
    var certificatePermissions = new ArrayList() 
    { 
     KeyPurposeID.IdKPCodeSigning, 
     KeyPurposeID.IdKPServerAuth, 
     KeyPurposeID.IdKPTimeStamping, 
     KeyPurposeID.IdKPOcspSigning, 
     KeyPurposeID.IdKPClientAuth 
    }; 

    // Initialize the certificate generation 
    var certificateGenerator = new X509V3CertificateGenerator(); 
    BigInteger serialNo = BigInteger.ProbablePrime(128, new Random()); 
    certificateGenerator.SetSerialNumber(serialNo); 
    certificateGenerator.SetSubjectDN(GetLicenseeDN()); 
    certificateGenerator.SetIssuerDN(GetLicencerDN()); 
    certificateGenerator.SetNotAfter(DateTime.Now.AddYears(100)); 
    certificateGenerator.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0))); 
    //ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA512WITHRSA", keyPair.PrivateKey); // ?? 
    certificateGenerator.SetSignatureAlgorithm("SHA512withRSA"); 
    certificateGenerator.AddExtension(X509Extensions.ExtendedKeyUsage, false, new ExtendedKeyUsage(certificatePermissions)); 
    var subjectKeyIdentifier = new SubjectKeyIdentifier(SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyPair.PublicKey)); 
    certificateGenerator.AddExtension(X509Extensions.SubjectKeyIdentifier.Id, false, subjectKeyIdentifier); 
    certificateGenerator.SetPublicKey(keyPair.PublicKey); 
    var result = certificateGenerator.Generate(keyPair.PrivateKey); 
    var secure = new SecureString(); 
    foreach (char c in privateKeySecret) 
    { 
     secure.AppendChar(c); 
    } 

    X509KeyStorageFlags flags = X509KeyStorageFlags.MachineKeySet; 
    if (persistCertificateToDisk) { flags |= X509KeyStorageFlags.Exportable; flags |= X509KeyStorageFlags.PersistKeySet; } 
    this.clientCertificate = new X509Certificate2(Org.BouncyCastle.Security.DotNetUtilities.ToX509Certificate(result).Export(X509ContentType.Cert), secure, flags); 

    // This section allows us to use this certificate on Azure (no file access required) 
    CspParameters cspParams; 
    const int PROVIDER_RSA_FULL = 1; 
    cspParams = new CspParameters(PROVIDER_RSA_FULL); 
    cspParams.KeyContainerName = new Guid().ToString(); 
    cspParams.Flags = CspProviderFlags.UseMachineKeyStore; 
    cspParams.ProviderName = "Microsoft Strong Cryptographic Provider"; 
    var rule = new CryptoKeyAccessRule("everyone", CryptoKeyRights.FullControl, AccessControlType.Allow); 
    cspParams.CryptoKeySecurity = new CryptoKeySecurity(); 
    cspParams.CryptoKeySecurity.SetAccessRule(rule); 

    // Set the private key 
    var tempRcsp = (RSACryptoServiceProvider) Org.BouncyCastle.Security.DotNetUtilities.ToRSA((RsaPrivateCrtKeyParameters) keyPair.PrivateKey); 
    var rcsp = new RSACryptoServiceProvider(cspParams); 
    rcsp.ImportCspBlob(tempRcsp.ExportCspBlob(true)); 
    this.clientCertificate.PrivateKey = rcsp; 

    if (persistCertificateToDisk) 
    { 
     if (!File.Exists(persistedCertificateFilename)) 
     { 
      File.WriteAllBytes(persistedCertificateFilename, this.clientCertificate.Export(X509ContentType.Pkcs12, (string) null)); 
     } 
    } 
} 

Cụ thể, những lời cảnh báo là:

'X509V3CertificateGenerator.SetSignatureAlgorithm (string)' là lỗi thời: 'Không cần thiết nếu Tạo ra sử dụng với một ISignatureFactory'

'X509V3CertificateGenerator.Generate (AsymmetricKeyParameter)' là lỗi thời: 'Sử dụng Generate với một ISignatureFactory'

Vì vậy, câu hỏi của tôi là:

  1. Tôi có cần phải lo lắng về những cảnh báo này?
  2. Nếu có, dòng nào thay đổi?
  3. Nếu tôi cập nhật mã này, có lợi ích hiệu suất không?

Lưu ý: Nếu có ai tò mò, lý do tôi kiên trì đĩa này là mã này tạo chứng chỉ mỗi khi khách hàng được khởi tạo và điều này đặc biệt khắc nghiệt do kích thước khóa tối thiểu là 2048 và hiệu suất của 1.7.0.

Trả lời

8

Tôi cũng phải vật lộn với điều này một thời gian. Cuối cùng tôi đã có một giải pháp cho việc này. Chúng ta hãy một trong các lỗi:

'X509V3CertificateGenerator.Generate(AsymmetricKeyParameter)' is obsolete: 'Use Generate with an ISignatureFactory' 

cơ bản Bạn đang sử dụng (tôi đã làm điều tương tự) Generate phương pháp như thế này:

var certificate = certificateGenerator.Generate(issuerCertificate.PrivateKey, random); 

nơi certificateGenerator là thể hiện của lớp CertificateContainer Lỗi nói rằng: 'Use Generate with an ISignatureFactory'
Vì vậy, điều này cho phép chúng tôi tạo một phiên bản đầu tiên cho ISignatureFactory.

ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA512WITHRSA", issuerKeyPair.Private, random); 

Và để làm việc này một cách chính xác trước khi điều này bạn cũng nên công bố các nội dung sau:

var randomGenerator = new CryptoApiRandomGenerator(); 
var random = new SecureRandom(randomGenerator); 
AsymmetricCipherKeyPair subjectKeyPair = default(AsymmetricCipherKeyPair); 
var keyGenerationParameters = new KeyGenerationParameters(random, keyStrength); 

keyPairGenerator.Init(keyGenerationParameters); 
subjectKeyPair = keyPairGenerator.GenerateKeyPair(); 
AsymmetricCipherKeyPair issuerKeyPair = subjectKeyPair; 

Và bây giờ sau khi những thay đổi này, thay đổi phương pháp Generate từ:

var certificate = certificateGenerator.Generate(issuerCertificate.PrivateKey, random); 

để:

var certificate = certificateGenerator.Generate(signatureFactory); 

Tôi hy vọng nó sẽ giúp.

+0

Đã hoạt động hoàn hảo! Cảm ơn! – djbyter

+0

Thanx cho phản hồi. – drgmak

+0

Tôi đang gặp sự cố khi cố gắng sử dụng giải pháp.Không có đề cập đến biến keystrenght trong mã của bạn và sau đó tôi quyết định sử dụng các giá trị số nguyên tùy ý để xem giá trị nào tôi nên sử dụng. Nhưng, tôi có ngoại lệ: hệ thống arithmeticexception bit.length <2 bouncy castle big integer –

Các vấn đề liên quan