如何将质询密码编码到证书请求中

我正在使用Linux版本的openssl req生成挑战密码的CSR,一切都很好,除了它不能打印此属性:

# openssl req -new -key private.key -out server.csr # openssl req -in server.csr -noout -text Certificate Request: ... Attributes: challengePassword :unable to print attribute ... 

我在Fedora中使用OpenSSL 1.0.1j进行testing,在ubuntu中使用OpenSSL 1.0.1,都不能将challengePassword写入到csr文件中。

但是,如果我使用Windows版本,它可以工作:

 # openssl req -in test.csr -noout -text Certificate Request: ... Attributes: challengePassword :00F7FC7937B5366F2231AC891472998C 

…我使用SCEP工具中的64位openssl:

然后我search了openssl文件,发现这个句子:

属性

这指定了包含任何请求属性的部分:其格式与distinguished_name相同。 通常这些可能包含challengePassword或unstructuredNametypes。 它们目前被OpenSSL的请求签名实用程序忽略,但有些CA可能需要它们

是的,有些CA可能需要它们。 我使用NDES Windows 2008 R2,它需要挑战密码,它看起来不能由openssl req应用程序生成,我可以使用openssl C API或python / perl吗? 还是我需要修复openssl代码?

我也在sscep问题列表上提出了这个问题,他们告诉我需要将挑战密码编码到BMPString。 但是我不知道如何编码。 有人可以给我指导吗?

让我自己回答我的问题。

为了在CSR中启用挑战密码属性,我们需要编写ASN可打印字符串,但openssl req实用程序默认情况下会写入MBSTRING_ASC字符串,因此它总是返回“:无法打印属性…”

这是C代码示例:

将MBSTRING_ASC字符串转换为ASN1_PRINTABLESTRING:

 ASN1_STRING *tmp_os = M_ASN1_PRINTABLESTRING_new(); tmp_os->type = V_ASN1_PRINTABLESTRING; int password_length = strlen(challenge_password); ASN1_STRING_set(tmp_os, (const unsigned char *)challenge_password, password_length); 

给请求添加属性:

 X509_REQ_add1_attr_by_NID(req, NID_pkcs9_challengePassword, tmp_os->type, tmp_os->data, password_length);