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

Windows 使用CertReq.exe,如何对主题中的特殊字符进行编码,windows,sdk,distinguishedname,Windows,Sdk,Distinguishedname,我们正在使用Microsoft证书请求(CertReq.exe)以编程方式生成证书请求。为此,我们必须创建输入INF文件 主题属性定义为相对可分辨名称字符串值,应按照指定的方式对其进行编码 这基本上意味着只需在某些字符(“,+,,,;,,,或\)前面加上\)进行转义即可 问题是,我不知道如何正确编码一个属性为“O=Foo+Bar”的主题 输入(相关INF部分): 输出: The string contains an invalid X500 name attribute key, oid, va

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

主题属性定义为相对可分辨名称字符串值,应按照指定的方式对其进行编码

这基本上意味着只需在某些字符(
+
,或
\
)前面加上
\
)进行转义即可

问题是,我不知道如何正确编码一个属性为“O=Foo+Bar”的主题

输入(相关INF部分):

输出:

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")
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")
RFC1799不鼓励重复转义(使用
\
),但似乎可以解决LDAP查询(,f.i.)中的问题。 然而,我们也尝试不使用引用来指定主题,但得到了另一个不想要的结果

输入:

输出:

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")
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一起工作。

成功了!还有其他编码问题,如f.i.UTF-8字符、转义引号等。但在尝试其他X500NameFlags之后,我将开始另一个问题。有关X500NameFlags的文档,请参阅相关;DN中有逗号的位置: