2013-05-10 141 views
7

我正在尝试使用UTF-8主题生成证书签名请求。如何在openssl中使用utf8主题创建CSR?

$ 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,I得到了同样的问题,当我使用命令行受试者 (...) -subj /C=PL/ST=zażółć\ gęślą\ jaźń/O=my-company/CN=ThisIsMeForSure

当我跳过-utf8开关,CSR与替换所有的非ASCII字符产生用十六进制符号(例如ó变成\xC3\xB3)。这样的CSR无法用php(openss_x509_parse)正确读取 - 原始的ó被读为四个字节,代表两个奇怪的字符...

我在做什么错?

+0

使用'openssl req' * *没有*自定义conf文件意味着服务器名称将在'CN'中。 IETF和CA/B论坛都不赞成这种做法。相反,你应该确保服务器名称(和IP地址)在'SAN'中。例如,请参阅[如何使用openssl创建自签名证书?](http://stackoverflow.com/a/27931596)(答案用于签署请求和自签名证书)。并且在配置文件中设置了'string_mask = utf8only'。 – jww 2015-04-15 12:07:56

回答

1

尝试使用string_mask选项:

string_mask

此选项屏蔽了使用在某些领域某些字符串类型的。大多数用户不需要改变这个选项。

它可以设置为几个默认值,如果使用pkix值则默认选项使用PrintableStrings,T61Strings和BMPStrings,则只使用PrintableStrings和BMPStrings。这遵循RFC2459中的PKIX建议。 如果使用utf8only选项,那么只会使用UTF8Strings:这是2003年后RFC2459中的PKIX推荐。最后,nombstr选项只使用PrintableStrings和T61Strings:某些软件在BMPStrings和UTF8Strings方面存在问题:特别是Netscape。

+2

显然这(string_mask)是不够的。 (这实际上给字符提供了UTF-8编码,但在许多工具中显示时不会以这种方式处理它们)。 '-utf8'或'utf8 = yes'是要走的路。 (经验检查)。 – Cromax 2017-08-08 11:23:42

+0

@Cromax你是对的。你能从评论中回答吗? – 2017-11-15 16:14:05

+0

@Vlastimil最高评分的答案已经包括'-utf8'开关,所以我不确定是否需要这个。它只是增加了额外的澄清,但没有什么重要的。谢谢,你。 – Cromax 2017-11-17 09:09:05

0

任何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=中国/[email protected]" -config C:/Temp/openssl.cnf'); ?> 
9

我已经成功地使用命令

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中正确显示。

+4

实际上,在这种情况下,-nameopt multiline,utf8选项是无用的。只有-utf8正在发挥作用。用户仍然可以避免使用适当的配置文件在命令行上设置此选项。只需在[req]部分添加utf8 = yes即可。这应该是更喜欢的方式,因为在命令行上忘记-utf8选项可能会导致不期望的结果。 当显示证书时,需要使用-nameopt utf8选项,-nameopt multiline,utf8选项使得我忽略utf8的值。 OpenSSL版本1.0.2h。 – Achille 2016-05-29 19:17:53

+2

我确认'-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 谢谢,Achille! – hnakamur 2016-10-24 08:03:22

+0

你没有给非英语的电子邮件。你有任何具体的理由为@ Envek? – 2017-04-19 04:36:32