34

Я получаю следующую ошибку от openssl req:

unable to find 'distinguished_name' in config
problems making Certificate Request
41035:error:0E06D06C:configuration file routines:NCONF_get_string:no value:/SourceCache/OpenSSL098/OpenSSL098-52.30.1/src/crypto/conf/conf_lib.c:329:group=req name=distinguished_name

Насколько я понимаю, это "Субъект", который он не может найти ... однако я уточняю, что:

openssl req -new \
    -key "$PRIVATE_KEY" \
    -sha256 \
    -config "$OPTIONS_FILE" \
    -subj "/C=US/ST=California/L=San Francisco/O=ACME, Inc./CN=*.*.$DOMAIN/" \
    -out "$CSR_FILENAME"

Единственное предложение руководства состоит в том, что файл конфигурации не существует; Я могу cat "$OPTIONS_FILE" , так что он определенно есть, и этой ошибке не предшествует ошибка, указанная в руководстве, которой предшествует, если бы это было так, поэтому я уверен, что openssl видит файл конфигурации.

Мой конфигурационный файл содержит следующее:

[req]
req_extensions = v3_req

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.*.example.com 

... что в буквальном смысле является примером в документации.

Что я здесь не так делаю?

4 ответа4

23

Насколько я могу судить, -config переопределяет какую-то внутреннюю конфигурацию; если вы видите раздел "ПРИМЕРЫ" для страницы руководства для openssl req, он показывает пример файла конфигурации с distinguished_name в нем. Надеюсь, я добавил следующее в мою конфигурацию:

[req]
…
distinguished_name = req_distinguished_name

[req_distinguished_name]
# empty.

Таким образом, весь мой конфиг выглядел примерно так

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]

[v3_req]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.*.${DOMAIN}

(Обратите внимание, что здесь ${DOMAIN} не является буквальным; вы должны заменить его на свое доменное имя DNS; я создаю этот файл в сценарии bash с помощью cat >"$OPTIONS_FILE" <<EOF , за которым следует выше, а затем EOF)

openssl req … -subj <my subject> -config <that file> … затем взял мою тему из командной строки. Для интересующихся вся команда выглядит так:

openssl req -new \
    -key "$PRIVATE_KEY" \
    -sha256 \
    -config "$OPTIONS_FILE" \
    -subj "/C=US/ST=California/L=San Francisco/O=My Company, Inc./CN=*.*.$DOMAIN/" \
    -out "$CSR_FILENAME"

На момент публикации я понимаю, что SHA-1 устарела ¹ для сертификатов X.509, следовательно, -sha256 (это недокументированный флаг…), а subjectAltName становится обязательным², отсюда и необходимость в конфигурации. Единственное, что мне известно о том, что для создания лучшего CSR, о котором я знаю, является то, что вы должны использовать размер ключа RSA не менее 2048 бит (если вы используете RSA, которым я являюсь); Вы должны указать размер команде openssl genrsa как текущее значение по умолчанию небезопасно.

«Пока я не сломлен, когда я пишу это, люди чувствуют, что это только вопрос времени. Смотрите "Постепенно закат SHA1"
«Использование CN для доменного имени больше не рекомендуется; Я не уверен, когда / если браузеры планируют отказаться от этого. «Отойдите от включения и проверки строк, которые выглядят как доменные имена в общем имени субъекта.», RFC 6125
Примечание: я менее уверен в "правильном" значении keyUsage .

10

У меня была такая же проблема, и я нашел ответ здесь:

https://www.citrix.com/blogs/2015/04/10/how-to-create-a-csr-for-a-san-certificate-on-netscaler/

Файл конфигурации выглядит следующим образом:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = VA
L = SomeCity
O = MyCompany
OU = MyDivision
CN = www.company.com
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = www.company.com
DNS.2 = company.com
DNS.3 = www.company.net 
DNS.4 = company.net 

А потом:

openssl req -new -key private.key -sha256 -nodes -config openssl.conf -out certificate.csr
3

Мне кажется, что эта ошибка вызвана неправильным созданием пути при запуске команды в Windows Server 2012, C:\OpenSSL-Win32\bin

openssl req -new -sha256 -key private.pem -out example.csr

который выводит неблокирующую ошибку перед запросом пропуска фаре:

Не могу открыть C:\Program Files (x86)\Common Files\SSL/openssl.cnf для чтения, Нет такого файла или каталога

Очевидно, что путь неверен из-за неправильной косой черты, поэтому файл конфигурации должен быть явно добавлен в командной строке:

openssl req -new -sha256 -key private.pem -config openssl.cfg -out example.csr
1

Эта похожая ошибка:

$ openssl req -x509 -newkey rsa:4096 -keyout _key.pem -out cert.pem -days 365 -nodes Вам будет предложено ввести информацию, которая будет включена в ваш запрос сертификата. То, что вы собираетесь ввести, это то, что называется отличительным именем или DN. Есть довольно много полей, но вы можете оставить некоторые пустыми. Для некоторых полей будет использоваться значение по умолчанию. Если вы введете «.», Поле останется пустым. ----- Название страны (двухбуквенный код) [AU]:проблемы с оформлением запроса на сертификат

(Ubuntu 17.04) означало "вам нужно добавить

-subj "/C=US/ST=California/L=San Francis co/O=ACME, Inc./CN=*.*.$DOMAIN/"

в командной строке "FWIW.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .