Arhn - архитектура программирования

Проблема с использованием цепочки сертификатов в корде

Я хочу создать собственный центр сертификации и создал rootCertficate, как указано в эту ссылку, используя следующие команды

set RANDFILE=rand
set OPENSSL_CONF=c:\Binaries\openssl-X64\openssl.cnf
openssl req -new -keyout cakey.pem -out careq.pem
openssl x509 -signkey cakey.pem -req -days 3650 -in careq.pem -out caroot.cer -extensions v3_ca

Затем я использую этот сертификат в качестве корневого для подписи и создания других сертификатов с помощью программы Java.

public static X509Certificate signCertificateSigningRequest(
            PKCS10CertificationRequest jcaPKCS10CertificationRequest, KeyPair keyPair, String requestId,
            X509Certificate serverCert) throws Exception
    {
        SubjectPublicKeyInfo pkInfo = jcaPKCS10CertificationRequest.getSubjectPublicKeyInfo();
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
        PublicKey pubKey = converter.getPublicKey(pkInfo);
        X509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(serverCert, new BigInteger("1"), // serial
                new Date(System.currentTimeMillis()),
                new Date(System.currentTimeMillis() + 30L * 365L * 24L * 60L * 60L * 1000L),
                jcaPKCS10CertificationRequest.getSubject(), pubKey
        ).addExtension(new ASN1ObjectIdentifier("2.5.29.19"), false, new BasicConstraints(false)
        // true if it is allowed to sign other certs
        ).addExtension(new ASN1ObjectIdentifier("2.5.29.15"), true, new X509KeyUsage(X509KeyUsage.digitalSignature
                | X509KeyUsage.nonRepudiation | X509KeyUsage.keyEncipherment | X509KeyUsage.dataEncipherment));

        AsymmetricKeyParameter asymmetricKeyParameter = PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded());
        // ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId,
        // digAlgId).build(asymmetricKeyParameter);
        ContentSigner sigGen = new JcaContentSignerBuilder("SHA1withRSA").build(keyPair.getPrivate());

        X509CertificateHolder x509CertificateHolder = certificateBuilder.build(sigGen);
        Certificate eeX509CertificateStructure = x509CertificateHolder.toASN1Structure();
        // Read Certificate
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC");
        InputStream is1 = new ByteArrayInputStream(eeX509CertificateStructure.getEncoded());
        X509Certificate signedCertificate = (X509Certificate) certificateFactory.generateCertificate(is1);
        FileSystemUtility.saveCertificate(signedCertificate.getEncoded(), serverCert.getEncoded(), requestId);
        return signedCertificate;
    }

Где корневой сертификат выбирается с помощью:

public static X509Certificate getServerCertificate() throws Exception
    {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509", "BC");
        return (X509Certificate) certificateFactory.generateCertificate(
                new FileInputStream(new File("C:/Users/varun/Desktop/cert/CA/caroot.cer")));
    }

Но когда я отправляю оба сертификата на стороне получателя, и он пытается его проверить, я получаю следующую ошибку:

Проблема 1

Caused by: java.security.cert.CertPathValidatorException: CA key usage check failed: keyCertSign bit is not set
    at sun.security.provider.certpath.KeyChecker.verifyCAKeyUsage(KeyChecker.java:159) ~[?:1.8.0_131]
    at sun.security.provider.certpath.KeyChecker.check(KeyChecker.java:122) ~[?:1.8.0_131]
    at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:125) ~[?:1.8.0_131]
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:219) ~[?:1.8.0_131]
    at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:140) ~[?:1.8.0_131]
    at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:79) ~[?:1.8.0_131]
    at java.security.cert.CertPathValidator.validate(CertPathValidator.java:292) ~[?:1.8.0_131]
    at sun.security.validator.PKIXValidator.doValidate(PKIXValidator.java:347) ~[?:1.8.0_131]
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:249) ~[?:1.8.0_131]
    at sun.security.validator.Validator.validate(Validator.java:260) ~[?:1.8.0_131]
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) ~[?:1.8.0_131]
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281) ~[?:1.8.0_131]
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) ~[?:1.8.0_131]
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1501) ~[?:1.8.0_131]
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) ~[?:1.8.0_131]
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026) ~[?:1.8.0_131]
    at sun.security.ssl.Handshaker$1.run(Handshaker.java:966) ~[?:1.8.0_131]
    at sun.security.ssl.Handshaker$1.run(Handshaker.java:963) ~[?:1.8.0_131]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_131]
    at sun.security.ssl.Handshaker$DelegatedTask.run(Handshaker.java:1416) ~[?:1.8.0_131]
    at io.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:1268) ~[netty-all-4.1.9.Final.jar:4.1.9.Final]
    at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1176) ~[netty-all-4.1.9.Final.jar:4.1.9.Final]

Проблема 1 решена

Проблема 2

Caused by: java.security.SignatureException: Signature does not match.
at sun.security.x509.X509CertImpl.verify(X509CertImpl.java:449) ~[?:1.8.0_131]
at sun.security.provider.certpath.BasicChecker.verifySignature(BasicChecker.java:166) ~[?:1.8.0_131]
at sun.security.provider.certpath.BasicChecker.check(BasicChecker.java:147) ~[?:1.8.0_131]
at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:125) ~[?:1.8.0_131]
at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:219) ~[?:1.8.0_131]
at sun.security.provider.certpath.PKIXCertPathValidator.validate(PKIXCertPathValidator.java:140) ~[?:1.8.0_131]
at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:79) ~[?:1.8.0_131]

  • Вам необходимо добавить в сертификат CA использование ключа подписи сертификата. 23.11.2017
  • @ pedrofb-как это делается? 23.11.2017
  • все, что я знаю, это то, что я следовал этому руководству jamielinux.com / docs / openssl-certificate-Authority /, то для BouncyCastle код, который вы здесь использовали, работал (хотя, если вы хотите подписывать сертификаты с помощью этого сертификата, вам, скорее всего, следует установить basic constraint на true) 24.11.2017

Ответы:


1

Вам необходимо добавить к сертификату ЦС использование ключа «Подпись сертификата». Убедитесь, что раздел [v3_ca] файла конфигурации OpenSSL включает keyUsage = keyCertSign

[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

См. Полный пример здесь: https://jamielinux.com/docs/openssl-certificate-authority/create-the-root-pair.html.

23.11.2017
  • Вы проверили, что сгенерированный сертификат действительно имеет требуемый keyUsage? 23.11.2017
  • Кажется, вы перечисляете extendedKeyUsage. Я не вижу keyCertSign в вашем списке. Вы правильно это перечисляете? Ваш сценарий включает -extensions v3_ca, поэтому я предположил, что вы используете раздел [v3_ca]. Убедитесь, что вы применяете это 23.11.2017
  • Использование openssl в Windows не должно быть проблемой. Используйте openssl x509 -in caroot.cer -text -noout, чтобы распечатать информацию о сертификации. Посмотрите на X509v3 Key Usage и X509v3 Basic Constraints 23.11.2017
  • клиентская сторона - это реализация с открытым исходным кодом под названием Corda Добавлена ​​новая проблема, с которой я столкнулся сейчас 23.11.2017
  • Вторая ошибка, вероятно, связана с тем, что сертификат сервера неправильно подписан ЦС. Это проблема с кодом bouncycastle, не связанная с первым. Я посмотрю позже 23.11.2017
  • спасибо @pedrofb за помощь, которую вы оказываете, очень признателен ... также, если возможно, поделитесь мне какой-нибудь ссылкой, чтобы подробно разобраться в сертификатах 24.11.2017
  • Нужно ли нам использовать один и тот же закрытый ключ для CA и нового сертификата? Я использовал разные 24.11.2017
  • Ни в коем случае. Закрытый ключ ЦС должен использоваться только для подписи выданных сертификатов и должен храниться в безопасности. Закрытый ключ окончательного сертификата генерируется на клиенте и даже не должен быть известен ЦС. 24.11.2017
  • Я не уверен, в чем причина вашей второй проблемы. Мне пришлось бы отлаживать код, но я подозреваю, что вы не добавляете цепочку сертификации к сертификату. См. Мой ответ здесь, он не принят, но извлечен из рабочий пример 24.11.2017
  • должен ли корневой сертификат быть частью хранилища ключей CA? мы не можем просто прочитать файл сертификата и отправить его через 24.11.2017
  • ЦС не владеет закрытым ключом сертификата, поэтому может хранить только копию выпущенного сертификата. Сертификат не нужно хранить в хранилище ключей. Вам нужно только отправить выпущенный сертификат клиенту, но, как я уже комментировал ранее, сгенерированный сертификат должен включать также цепочку сертификации (в вашем случае сертификат CA) 24.11.2017
  • Я сделал это, но после этого тоже получил Issue #2 26.11.2017
  • Можете ли вы помочь мне в этом, я пробовал вашу ссылку, но получаю ту же ошибку 29.11.2017
  • не могли бы вы опубликовать образец сертификата с образцом ЦС для его анализа? 30.11.2017
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..