Utf 8 如何在openssl中使用utf8主题创建CSR?

Utf 8 如何在openssl中使用utf8主题创建CSR?,utf-8,openssl,csr,Utf 8,Openssl,Csr,我正在尝试生成具有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 ..............................................................................................

我正在尝试生成具有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,当我使用命令行主题时,我会遇到同样的问题
(…)-subc/C=PL/ST=zażłć\gęślą\jaźń/O=my company/CN=ThisIsMeForSure

当我跳过
-utf8
开关时,将生成CSR,其中所有非ascii字符都替换为十六进制符号(例如
o
变为
\xC3\xB3
)。这种CSR不能用php正确读取(
openss\u x509\u parse
)-原始的
被读取为四个字节,代表两个奇怪的字符


我做错了什么

尝试使用字符串掩码选项:

字符串掩码

此选项屏蔽了某些字段中某些字符串类型的使用。大多数用户不需要更改此选项

它可以设置为多个默认值,这也是默认选项使用可打印字符串、T61字符串和BMPString如果使用pkix值,则仅使用可打印字符串和BMPString。这遵循RFC2459中的PKIX建议如果使用utf8only选项,则仅使用UTF8Strings:这是RFC2459中2003年之后的PKIX建议。最后,nombstr选项只使用可打印字符串和t61字符串:某些软件在bmpstring和utf8string方面存在问题:特别是Netscape


任何unicode为我工作,从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=中国/emailAddress=test@religiasatanista.ro" -config C:/Temp/openssl.cnf'); ?>

我已经成功地使用了命令

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 = envek@envek.name
O = Моя компания                   # My company
OU = Моё подразделение             # My dept
L = Москва                         # Moscow
C = RU

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

在Chrome、Firefox和Safari中正确显示。

使用
openssl req
而不使用自定义配置文件意味着服务器名称将位于
CN
中。IETF和CA/B论坛都反对这种做法。相反,您应该确保服务器名称(和IP地址)位于
SAN
中。例如,请参见(答案用于签名请求和自签名证书)。在conf文件中设置了
string\u mask=utf8 only
。事实上,-nameopt multiline,utf8选项在此上下文中是无用的。只有-utf8起作用。用户仍然可以使用正确的配置文件避免在命令行上设置此选项。只需将utf8=yes添加到[req]部分。这应该是首选方法,因为忘记命令行上的-utf8选项可能会导致不希望的结果。当显示证书时,您需要使用-nameopt utf8选项,-nameopt multiline,utf8选项使我忽略utf8值。OpenSSL版本1.0.2h。我确认
-utf8
选项就足够了<代码>openssl请求-new-newkey rsa:2048-sha256-nodes-utf8-subc”/C=JP/ST=大阪府/L=大阪市/O=架空の会社名の例/OU=あ/CN=www.example.jp“-out./clients/$client\u domain/$client\u domain.csr.pem-keyout./clients/$client\u domain/$client\u domain.key.pem
$dpkg query-W-f='${Version}\n'openssl
1.0.2g-1ubuntu4.5谢谢你,阿齐尔!您没有用非英语发送电子邮件。你对@Envek有什么特别的原因吗?我从来没有见过非拉丁语的电子邮件地址。如果需要在国际化域中指定邮箱,则需要在Punycode中指定域(在@之后)。但是我不知道用户名部分(在@之前)显然这个(字符串掩码)是不够的。(这实际上为字符提供了UTF-8代码,但在许多工具中显示时并没有这样处理)
-utf8
utf8=yes
是正确的选择。(经验性检查)。@Cromax你是对的。你能从评论中得到答案吗?@Vlastimil评分最高的答案已经包括了
-utf8
开关,所以我不确定是否有必要这样做。它只是增加了额外的澄清,但没有什么真正重要的。谢谢你,你。