Возможный дубликат:
Сгенерированный подписанный сертификат клиента X.509 недействителен (отсутствует цепочка сертификатов к его ЦС)
Я последовал примеру по адресу:
Но полученный подписанный клиентский сертификат имеет следующую ошибку при открытии в Windows:
«Этот файл недопустим для использования в качестве следующего: Сертификат безопасности»
Если я все равно устанавливаю его и просматриваю с помощью certmgr, путь сертификации выглядит нормально — я вижу свой самозаверяющий центр сертификации (это нормально, проблем нет), но клиентский сертификат имеет следующий статус:
«Этот сертификат имеет недопустимую цифровую подпись».
Если я вызову X509Certificate.Verify(), он выдаст следующее исключение:
"Открытый ключ представлен не для подписи сертификата"
Тем не менее, я использую тот же самый открытый ключ, извлеченный из Pkcs10CertificationRequest, и когда я вызвал Verify(), все в порядке.
Любые идеи? После нескольких дней борьбы с этим у меня все работает, кроме последнего, и что действительно сбивает с толку, так это то, что мой самозаверяющий сертификат CA в порядке. Просто что-то происходит с сертификатом клиента. Вот весь блок кода:
TextReader textReader = new StreamReader("certificaterequest.pkcs10");
PemReader pemReader = new PemReader(textReader);
Pkcs10CertificationRequest certificationRequest = (Pkcs10CertificationRequest)pemReader.ReadObject();
CertificationRequestInfo certificationRequestInfo = certificationRequest.GetCertificationRequestInfo();
SubjectPublicKeyInfo publicKeyInfo = certificationRequestInfo.SubjectPublicKeyInfo;
RsaPublicKeyStructure publicKeyStructure = RsaPublicKeyStructure.GetInstance(publicKeyInfo.GetPublicKey());
RsaKeyParameters publicKey = new RsaKeyParameters(false, publicKeyStructure.Modulus, publicKeyStructure.PublicExponent);
bool certIsOK = certificationRequest.Verify(publicKey);
// public key is OK here...
// get the server certificate
Org.BouncyCastle.X509.X509Certificate serverCertificate = DotNetUtilities.FromX509Certificate(System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile("servermastercertificate.cer"));
// get the server private key
byte[] privateKeyBytes = File.ReadAllBytes("serverprivate.key");
AsymmetricKeyParameter serverPrivateKey = PrivateKeyFactory.CreateKey(privateKeyBytes);
// generate the client certificate
X509V3CertificateGenerator generator = new X509V3CertificateGenerator();
generator.SetSerialNumber(BigInteger.ProbablePrime(120, new Random()));
generator.SetIssuerDN(serverCertificate.SubjectDN);
generator.SetNotBefore(DateTime.Now);
generator.SetNotAfter(DateTime.Now.AddYears(5));
generator.SetSubjectDN(certificationRequestInfo.Subject);
generator.SetPublicKey(publicKey);
generator.SetSignatureAlgorithm("SHA512withRSA");
generator.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(serverCertificate));
generator.AddExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(publicKey));
var newClientCert = generator.Generate(serverPrivateKey);
newClientCert.Verify(publicKey); // <-- this blows up
return DotNetUtilities.ToX509Certificate(newClientCert).Export(X509ContentType.Pkcs12, "user password");