使用CertReq.exe,如何对Subject中的特殊字符进行编码

Using CertReq.exe, how to encode special characters in Subject

我们正在使用 Microsoft 证书请求 (CertReq.exe) 以编程方式构建证书请求。为此,我们必须创建输入 INF 文件,see docs here.

主题 属性 定义为 Relative Distinguished Name string values,应按照 RFC 1779 指定的方式进行编码。

这本质上意味着简单地转义一些字符("+,;<>、或 \) 通过在其前面加上 \.

问题是,我不知道如何正确编码具有 属性 "O=Foo + Bar".

的主题

输入(相关 INF 部分):

[NewRequest]
Subject = "CN=www.foo.de,OU=Foobar,O=Foo \+ Bar,L=Foo,S=Bar,C=DE"

输出:

The string contains an invalid X500 name attribute key, oid, value or delimiter. 0x80092023 (-2146885597 CRYPT_E_INVALID_X500_STRING)
c:\file_path.inf([NewRequest] Subject = "CN=www.foo.de,OU=Foobar,O=Foo \+ Bar,L=Foo,S=Bar,C=DE")

RFC 1799 不鼓励重复转义(使用 "\),但似乎解决了 LDAP 查询中的问题(see here、f.i)。 但是,我们也尝试过不使用引号来指定主题,但得到了另一个不想要的结果。

输入:

[NewRequest]
Subject = CN=www.foo.de,OU=Foobar,O=Foo \+ Bar,L=Foo,S=Bar,C=DE

输出:

The data is invalid. 0x8007000d (WIN32: 13 ERROR_INVALID_DATA)
c:\file_path.inf([NewRequest] Subject = "CN=www.foo.de", "OU=Foobar", "O=Foo \+ Bar", "L=Foo", "S=Bar", "C=DE")

整个过程没有+标志。在 INF 文件中编码 RDN(相对专有名称)的正确方法是什么?

通常 + 字符具有特殊含义。您可以像这样禁用该行为,并像使用任何其他字符一样使用 + 字符。

Subject = CN=www.foo.de,OU=Foobar,O=Foo + Bar,L=Foo,S=Bar,C=DE
X500NameFlags = 0x20000000

加号字符通常保留用于分隔多值 RDN 的多个值。

我不完全确定为什么转义它不能像您期望的那样与 CertEnroll 一起工作。