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'
và
'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à:
- Tôi có cần phải lo lắng về những cảnh báo này?
- Nếu có, dòng nào thay đổi?
- 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.
Đã hoạt động hoàn hảo! Cảm ơn! – djbyter
Thanx cho phản hồi. – drgmak
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 –