Сертификат x509 Расширения

У меня какое-то закрытое приложение работает как HTTP-сервер, который использует SSL. Я хотел бы поменять местами сертификаты, но по какой-то причине мой самоподписанный сертификат отклонен, и сервер не отправляет привет серверу (у меня ошибка 104). Кто-нибудь знает, в чем разница между ними и в чем может быть проблема? Кстати. Есть также несколько центров сертификации, но я не думаю, что это имеет значение, потому что без них сервер также отправляет обратно свой сертификат. Я пытаюсь создать свой сертификат, используя:

openssl req -x509 -newkey rsa: 2048 -keyout key.pem -out cert.pem -days 360

Мой сертификат:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            e7:ee:93:5d:78:65:56:ad
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: O=(...), CN=(...)
        Validity
            Not Before: Apr 23 17:58:29 2014 GMT
            Not After : Apr 18 17:58:29 2015 GMT
        Subject: O=(...), CN=(...)
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                (...)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                31:CD:5A:41:C0:64:DD:C4:96:30:AB:E2:99:9F:2D:40
            X509v3 Authority Key Identifier:
                keyid:31:CD:5A:41:C0:64:DD:C4:96:30:AB:E2:99:9F
1

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
    (...)

-----BEGIN CERTIFICATE-----
(...)
-----END CERTIFICATE-----

Оригинальный сертификат:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1284084212 (0x4c8991f4)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: O=(...), CN=(...)
        Validity
            Not Before: Apr 23 17:58:29 2014 GMT
            Not After : Apr 18 17:58:29 2015 GMT
        Subject: CN=(...).com, O=(...)
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                (...)
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment
            X509v3 Certificate Policies: 
                Policy: (...)

            X509v3 Subject Alternative Name: 
                DNS:(...).com
            X509v3 Authority Key Identifier: 
                keyid:(...)

            X509v3 Subject Key Identifier: 
                (...)
    Signature Algorithm: sha256WithRSAEncryption
    (...)
-----BEGIN CERTIFICATE-----
(...)
-----END CERTIFICATE-----

person Suprido    schedule 23.04.2014    source источник
comment
Итак, ваш исходный сертификат тоже был самоподписанным?   -  person user2260054    schedule 23.04.2014
comment
Нет, исходный подписан каким-то ЦС, но этот сервер не имеет подключения к Интернету и, я думаю, может базироваться только на локальных ЦС.   -  person Suprido    schedule 23.04.2014


Ответы (2)


Если я понимаю, как работает ssl, вот что происходит: раньше у вас был сервер с сертификатом, подписанным каким-то органом, которому ваш браузер доверяет. Несмотря на то, что у него нет подключения к Интернету, когда вы пытаетесь получить доступ к URL-адресу на своем сервере с помощью https: // ..., браузер проверяет сертификат сервера, эй, он подписан с помощью ca, чему я доверяю, так что мы в порядке. Но это уже не так. Как сделать так, чтобы ваш клиент доверял самозаверяющему сертификату, зависит от того, кто является клиентом: браузер, мобильное приложение и т. Д. Если это браузер, проверьте его настройки. Примечание. Тот факт, что сервер не имеет подключения к Интернету, не означает, что сертификат был подписан каким-то локальным ЦС, поскольку список некоторых глобально доверенных ЦС по умолчанию предварительно настроен в настройках браузера.

person user2260054    schedule 23.04.2014
comment
SSL-соединение начинается с Client Hello, и сервер обязан воспроизвести Server Hello и его сертификат. Затем клиентский сайт может проверить сертификат или нет. В этом случае сертификат даже не отправляется, поэтому проблема на сервере. Как я уже упоминал, это не классический HTTP-сервер, и возможно ли, что он проверяет свой сертификат на основе полей расширения? - person Suprido; 23.04.2014
comment
Сервер проверяет, должен ли он отправлять сертификат? Как узнать, кому клиент хочет доверять? Что ж, если это какой-то нетривиальный сервер, работающий с каким-то нестандартным протоколом, все возможно. - person user2260054; 23.04.2014
comment
Я думаю, что этот сервер каким-то образом проверяет правильность его сертификата или нет. - person Suprido; 24.04.2014

Следующие расширения необходимы, но, похоже, отсутствуют:

  • Использование ключа: критическое, keyEncipherment (может быть, digitalSignature тоже?)
  • Расширенное использование ключа: serverAuth
  • возможно: Netscape Cert Тип: сервер

Кроме того, CN должен соответствовать имени хоста (или альтернативные имена субъектов соответствуют имени хоста). И, конечно же, поскольку сертификат является самоподписанным, вы должны явно добавить доверие клиенту.

person Steffen Ullrich    schedule 23.04.2014
comment
Да, я заметил, что отсутствуют некоторые расширения, но проблема в том, как их добавить? - person Suprido; 24.04.2014
comment
Вам необходимо настроить конфигурацию openssl. Посмотрите в примере конфигурации для keyUsage...keyEncipherment и убедитесь, что вы добавили в соответствующую часть, которая обычно v3_ca, а не v3_req, если вы создаете CA. - person Steffen Ullrich; 24.04.2014