Рейтинг:1

Как воспроизвести конфигурацию самозаверяющего сертификата с помощью OpenSSL?

флаг in

У меня есть балансировщик нагрузки, который требует сертификат с определенной конфигурацией, к сожалению, те, кто создавал первые сертификаты, не задокументировали эту конфигурацию, и у меня есть только список команд, который также не является полным.

У меня есть эти два файла: example_ca.crt и пример.crt

И используя эту команду OpenSSL:

openssl x509 -in имя_файла.crt -text -noout

Вот его свойства (не относящуюся к делу информацию опущу):

example_ca.crt

Сертификат:
    Данные:
        Версия: 3 (0x2)
        Серийный номер:
            cb:0f:b8:78:38:9a:a9:да
        Алгоритм подписи: sha256WithRSAEncryption
        Эмитент: CN = example.org
        Срок действия
            Не раньше: 10 июня 10:33:06 2020 GMT
            Не после : 17 мая 10:33:06 21:20 по Гринвичу
        Тема: CN = example.org
        Информация об открытом ключе субъекта:
            Алгоритм открытого ключа: rsaEncryption
                Открытый ключ RSA: (2048 бит)
                Модуль:
                    [...]
                Показатель: 65537 (0x10001)
        Расширения X509v3:
            Идентификатор ключа субъекта X509v3: 
                81:FE:D0:6D:DE:0A:CC:10:1D:B3:74:EA:4B:C8:F3:43:37:B4:D1:FD
            Идентификатор ключа авторизации X509v3: 
                ID ключа:81:FE:D0:6D:DE:0A:CC:10:1D:B3:74:EA:4B:C8:F3:43:37:B4:D1:FD

            Основные ограничения X509v3: 
                КА: ИСТИНА
    Алгоритм подписи: sha256WithRSAEncryption
         [...]

пример.crt

Сертификат:
    Данные:
        Версия: 3 (0x2)
        Серийный номер:
            80:1d:bb:9e:9f:2c:4e:ce
        Алгоритм подписи: sha256WithRSAEncryption
        Эмитент: CN = example.org
        Срок действия
            Не раньше: 10 июня 10:33:44 2020 GMT
            Не после : 17 мая 10:33:44 21:20 по Гринвичу
        Тема: CN = example.org
        Информация об открытом ключе субъекта:
            Алгоритм открытого ключа: rsaEncryption
                Открытый ключ RSA: (2048 бит)
                Модуль:
                    [...]
                Показатель: 65537 (0x10001)
        Расширения X509v3:
            Использование расширенного ключа X509v3: 
                Аутентификация веб-клиента TLS, Аутентификация веб-сервера TLS
            Идентификатор ключа авторизации X509v3: 
                ID ключа:81:FE:D0:6D:DE:0A:CC:10:1D:B3:74:EA:4B:C8:F3:43:37:B4:D1:FD

            Идентификатор ключа субъекта X509v3: 
                B1:2C:74:04:EE:03:84:C9:F7:92:35:CE:6E:20:EF:C6:FE:B8:23:A7
    Алгоритм подписи: sha256WithRSAEncryption
         [...]

мне удалось воспроизвести example_ca.crt с этими командами и конфигурацией (срок действия не имеет значения):

openssl genrsa -out example_ca.key 2048
openssl req -new -x509 -days 365 -key example_ca.key -out example_ca.crt -config root.cnf

корень.cnf

# Конфигурация OpenSSL для Root CA

[требуется]

подсказка = нет
строка_маска = по умолчанию

биты по умолчанию = 2048
отличительное_имя = req_distinguished_name
x509_extensions = x509_ext

[ req_distinguished_name ]
общее имя = example.org

[ x509_ext ]
расширенныйKeyUsage = клиентская аутентификация, серверная аутентификация
subjectKeyIdentifier = хэш
authorKeyIdentifier = идентификатор ключа
основные ограничения = CA: правда

Моя проблема возникает в этот момент, когда я не могу воспроизвести пример.crt, я перепробовал так много возможностей в сервер.cnf и openssl.cnf файл, и я не приближаюсь к желаемому результату.

Для последних шагов я использовал эти команды:

openssl genrsa -out пример.ключ 2048
openssl req -new -out example.csr -key example.key -config server.cnf

эхо extendedKeyUsage = clientAuth> openssl.cnf
openssl x509 -req -in example.csr -out example.crt -signkey example.key -CA example_ca.crt -CAkey example_ca.key -CAcreateserial -days 365 -extfile openssl.cnf

я пропущу содержание сервер.cnf потому что здесь мне нужна помощь. Но в основном я всегда скучаю по «Расширения X509v3» сессия пример.crt

Не стесняйтесь принудительно использовать пароль, если это необходимо, или исправить мою репликацию example_ca.crt Я просто объяснил основы.

ОБНОВИТЬ:

сервер.cnf

# Конфигурация OpenSSL для сертификата конечного объекта

[требуется]
подсказка = нет
строка_маска = по умолчанию

биты по умолчанию = 2048
отличительное_имя = req_distinguished_name

x509_extensions = x509_ext

[ req_distinguished_name ]
общее имя = example.org

[ x509_ext ]
keyUsage = критический, digitalSignature, keyAgreement

subjectAltName = @alt_names

Возможны несколько альтернативных имен
[alt_names]
DNS.1 = example.org
IP.1 = 127.0.0.1
# DNS.2 = altName.example.com
флаг br
Людям было бы легче помочь вам с `server.cnf`, если бы вы указали свой в своем вопросе.
dave_thompson_085 avatar
флаг jp
Не используйте `-signkey` вместе с `-CA -CAkey` - оба они не могут быть применены к одному и тому же сертификату, но вместо ошибки это, по-видимому, приводит к дублированию расширений (!!) и, возможно, к искажению.
dave_thompson_085 avatar
флаг jp
ТАКЖЕ: если вы действительно используете показанные имена, у вас есть `CN=example.org` для **и** ЦС, и сервера; это не сработает, когда вы попытаетесь использовать сертификат для чего-либо. Они должны быть разными. Для HTTPS (я предполагаю, что балансировщик нагрузки - HTTPS) CN должен быть именем домена, когда SAN отсутствует (что было бы лучше, но у вас его нет); имя CA не обязательно должно быть доменным именем (и даже не обязательно CN; вы можете использовать O, OU и т. д.).
Willy avatar
флаг in
Большое спасибо! Я смог все решить, CN не является окончательным, это просто пример.
Рейтинг:0
флаг br

Создать местный.cnf файл с чем-то похожим на (удалите мои комментарии, если хотите):

[сервер]

# Эти двое ожидаются...
subjectKeyIdentifier=хэш
authorKeyIdentifier=keyid:всегда,эмитент

# Это разумно для конечных объектов и ДОЛЖНО быть критическим:
# keyUsage = Critical, digitalSignature, keyAgreement
# Выбирайте (с умом) из: digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, encipherOnly и decipherOnly
# но не keyCertSign или cRLSign, как для ЦС.

# Это только для сертификатов конечных объектов.
расширенныйKeyUsage = клиентская аутентификация, серверная аутентификация
# Выбирайте (с умом) из: https://www.openssl.org/docs/manmaster/man5/x509v3_config.html#Extended-Key-Usage

Затем используйте следующие флаги на вашем OpenSSL x509 команда для применения:

openssl x509 ... -extfile local.cnf -сервер расширений
Willy avatar
флаг in
Я сделал то, что вы сказали, но две детали: порядок «subjectKeyIdentifier» и «authorityKeyIdentifier» различается в каждом файле .crt, следуя вашим инструкциям, порядок одинаков для обоих файлов. С другой стороны, значения «extendedKeyUsage» повторяются дважды, я обновил вопрос, чтобы вы могли видеть содержимое server.cnf, но я действительно не верю, что сделал это правильно.
dave_thompson_085 avatar
флаг jp
Ваша первая часть неверна; если `x509 -req` имеет `-extfile`, но не `-extensions`, он либо использует значение `extensions` из раздела по умолчанию (которого не было у OP), либо сам раздел по умолчанию (который был у OP) . Но вы правы в отношении значений, которые должны быть _в_ используемом разделе, каким бы он ни был. @Willy: чтобы предотвратить дублирование расширений, удалите `-signkey`, как я прокомментировал вопрос Q.
флаг br
@dave_thompson_085 - спасибо. Я исправил это. Каждый день школьный :-)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.