Как создать CSR с темой utf8 в openssl?

Я пытаюсь создать запрос на подпись сертификата с темой UTF-8.

$ openssl req  -utf8 -nodes -newkey rsa:2048 -keyout my.private_key.pem -out my.csr.pem -text
Generating a 2048 bit RSA private key
......................................................................................................................................................................+++
......+++
writing new private key to 'my.private_key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [PL]:
State or Province Name (full name) []:Zażółć gęślą jaźń
problems making Certificate Request
12376:error:0D07A07C:asn1 encoding routines:ASN1_mbstring_ncopy:illegal characters:a_mbstr.c:162:

Кодировка терминала - UTF-8, у меня возникает та же проблема, когда я использую тему командной строки (...) -subj /C=PL/ST=zażółć\ gęślą\ jaźń/O=my-company/CN=ThisIsMeForSure

Когда я пропускаю переключатель -utf8, CSR генерируется со всеми символами, отличными от ascii, замененными шестнадцатеричной нотацией (например, ó становится \xC3\xB3). Такой CSR не может быть правильно прочитан с помощью php (openss_x509_parse) - исходный ó читается как четыре байта, представляющие два странных символа...

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


person SWilk    schedule 10.05.2013    source источник
comment
Использование openssl req без пользовательского файла конфигурации означает, что имя сервера будет в файле CN. Эта практика осуждается как IETF, так и форумами CA/B. Вместо этого вы должны убедиться, что имена серверов (и IP-адреса) находятся в файле SAN. См., например, Как создать самоподписанный сертификат с помощью openssl? (ответ используется как для запросов подписи, так и для самоподписанных сертификаты). И string_mask = utf8only устанавливается в файле conf.   -  person jww    schedule 15.04.2015


Ответы (3)


Я был успешным с командой

openssl req -new -utf8 -nameopt multiline,utf8 -config example.com.cnf -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr

Где example.com.cnf — файл конфигурации в UTF-8:

[req]
prompt = no
distinguished_name = dn
req_extensions = ext

[dn]
CN = Описание сайта                # Site description
emailAddress = [email protected]
O = Моя компания                   # My company
OU = Моё подразделение             # My dept
L = Москва                         # Moscow
C = RU

[ext]
subjectAltName = DNS:example.com,DNS:*.example.com

Корректно отображается в Chrome, Firefox и Safari.

person Envek    schedule 15.04.2015
comment
На самом деле опция -nameopt multiline,utf8 в этом контексте бесполезна. Только -utf8 имеет значение. Пользователь по-прежнему может не устанавливать этот параметр в командной строке с помощью соответствующего файла конфигурации. Просто добавьте utf8 = yes в раздел [req]. Это должно быть предпочтительным способом, поскольку если вы забудете параметр -utf8 в командной строке, это может привести к нежелательным результатам. При отображении сертификата вам нужно использовать параметр -nameopt utf8, параметр -nameopt multiline,utf8 заставляет меня игнорировать значение utf8. OpenSSL версии 1.0.2h. - person Achille; 29.05.2016
comment
Я подтвердил, что одного варианта -utf8 достаточно. openssl req -new -newkey rsa:2048 -sha256 -nodes -utf8 -subj "/C=JP/ST=大阪府/L=大阪市/O=架空の会社名の例/OU=あ/CN=www.example.jp" -out ./clients/$client_domain/$client_domain.csr.pem -keyout ./clients/$client_domain/$client_domain.key.pem $ dpkg-query -W -f='${Version}\n' openssl 1.0.2g-1ubuntu4.5 Спасибо, Ахилл! - person hnakamur; 24.10.2016
comment
вы не дали электронную почту на неанглийском языке. У вас есть какая-то конкретная причина для этого @Envek? - person SUMIT KUMAR SINGH; 19.04.2017
comment
Ну, я никогда не видел нелатинских адресов электронной почты. Если вам нужно указать почтовый ящик в интернационализированном домене, вам нужно указать домен в Punycode (после @). Но я не знаю о части имени пользователя (до @) - person Envek; 19.04.2017

Попробуйте использовать опцию string_mask:

string_mask

Этот параметр маскирует использование определенных типов строк в определенных полях. Большинству пользователей не потребуется изменять этот параметр.

Для него можно установить несколько значений по умолчанию, которые также являются параметром по умолчанию, использующим PrintableStrings, T61Strings и BMPStrings, если используется значение pkix, то будут использоваться только PrintableStrings и BMPStrings. Это соответствует рекомендации PKIX в RFC2459. Если используется параметр utf8only, то будут использоваться только строки UTF8: это рекомендация PKIX в RFC2459 после 2003 года. конкретный Нетскейп.

person elecengin    schedule 03.06.2013
comment
По-видимому, этого (string_mask) недостаточно. (Это фактически дает коды UTF-8 для символов, но не обрабатывает их таким образом при отображении во многих инструментах). -utf8 или utf8 = yes - это путь. (проверено опытным путем). - person Cromax; 08.08.2017
comment
@Кромакс, ты прав. Можете ли вы сделать ответ из комментария? - person Vlastimil Ovčáčík; 15.11.2017
comment
@Vlastimil Ответ с самым высоким рейтингом уже включает переключатель -utf8, поэтому я не совсем уверен, есть ли в этом необходимость. Это просто добавляет дополнительные разъяснения, но ничего действительно важного. Спасибо, ты. - person Cromax; 17.11.2017

У меня работает любой юникод, из файла php.

<? shell_exec('openssl req -new -md5 -utf8 -key C:/Temp/1.key -out C:/Temp/1.csr -subj "/C=MD/ST=ff/O=Religie/OU=Cen/CN=中国/[email protected]" -config C:/Temp/openssl.cnf'); ?>
person Vitalicus    schedule 21.02.2015