Подписание сертификатов X509 с BouncyCastle - недействительная цифровая подпись

Возможный дубликат:
Сгенерированный подписанный сертификат клиента X.509 недействителен (отсутствует цепочка сертификатов к его ЦС)

Я последовал примеру по адресу:

http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation

Но полученный подписанный клиентский сертификат имеет следующую ошибку при открытии в 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");

person znelson    schedule 13.01.2011    source источник
comment
По крайней мере, вы не установили использование ключа.   -  person Eugene Mayevski 'Callback    schedule 13.01.2011
comment
Это правда, но я еще не зашел так далеко. Объяснит ли это недопустимые ошибки открытого ключа в сертификате клиента? Я не устанавливал его в своем самозаверяющем сертификате CA, и Windows распознает его для всех целей.   -  person znelson    schedule 13.01.2011
comment
Можете ли вы опубликовать команду, которую вы использовали для создания самозаверяющего сертификата?   -  person Chris B. Behrens    schedule 13.01.2011
comment
Крис, это поможет вам в этом: bouncycastle.org/wiki/display/JA1/ — но раздел «Создание сертификата версии 3» должен быть неправильным, потому что я продолжаю получать недопустимые исключения открытого ключа, как описано выше.   -  person znelson    schedule 14.01.2011


Ответы (1)


Я понял это. Если вы вызываете X509Certificate.Verify(publicKey), вы должны передать открытый ключ ЦС, а не открытый ключ клиента из Pkcs10CertificationRequest.

person znelson    schedule 14.01.2011