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

时间:2015-05-20 03:18:51

标签: python c linux openssl

我正在使用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进行测试,在ubuntu中使用OpenSSL 1.0.1,都无法将challengePassword写入csr文件。

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

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

... 我正在使用SCEP tool中的64位openssl:

然后我搜索了openssl文件,发现了这句话:

  

属性

     

指定包含任何请求属性的部分:it   format与distinguished_name相同。通常这些可能包含   该    challengePassword 或非结构化名称类型。 OpenSSL的请求签名实用程序当前忽略了它们,但有些CA可能需要   它们

是的,有些CA可能需要它们。我正在使用NDES windows 2008 r2,它需要挑战密码,看起来它无法通过openssl req应用程序生成,我可以使用openssl C API或python / perl吗?或者我需要修复openssl代码?

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

1 个答案:

答案 0 :(得分:3)

让我自己回答我的问题。

要在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);