如何在OpenSSL

时间:2015-12-09 19:01:02

标签: openssl x509 asn.1

我一直在为测试目的创建一些证书。一切顺利,直到我需要在证书主题中包含x500UniqueIdentifier。它很容易在配置文件中指定字段x500UniqueIdentifier,但是,生成的证书与我可用的示例证书不一致,因为底层ASN.1类型是错误的。即不是BITSTRING。

考虑openssl配置文件(名为leaf.conf):

[req]
default_bits            = 256
default_md              = sha256
distinguished_name      = req_dn
prompt                  = no
encrypt_key             = no

[req_dn]
OU                      = 00
x500UniqueIdentifier    = SomeText

以及以下命令:

openssl genrsa -out testkey.pem
openssl req -x509 -new -config leaf.conf -key testkey.pem -outform pem -out test.pem
openssl x509 -in test.pem -noout -subject

它打印出主题:

subject= /OU=00/x500UniqueIdentifier=SomeText

一切都好!

但是,检查生成的ASN.1代码后,我们看到x500UniqueIdentifier已编码为PrintableString。我想做的是将其编码为BITSTRING。此外,我不想要ASCII文本我想指定一个字节序列为十六进制。也就是说,我想做这样的事情:

[req_dn]
OU                      = 00
x500UniqueIdentifier    = ASN1:BITSTRING:HEX:0123456789

但是,OpenSSL似乎总是将其编码为字符串(包括ASN1:part)。查看OpenSSL的手册页提供了对上述内容的见解,特别是与编码任意x509v3扩展相关的部分。

我知道这是可能的,因为我有一些样本证书(不是用OpenSSL创建的),我相信这可以直接与C中的OpenSSL API接口,但我希望有一种更简单的方法。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

解决自己的问题后,胜利的甜蜜味道。

在坚果shell中,openssl命令行应用程序不支持我尝试做的事情。仅v3扩展支持ASN.1表示法。如果我更好地阅读手册页,我会看到以下内容:

  

任何其他字段都将被视为DirectoryString。

查看更多信息:https://www.openssl.org/docs/manmaster/apps/req.html

然而,相关的问题:Certificate subject X.509提供了足够的暗示,表明我想做的事情并不愚蠢。主要是,X.520的规范将唯一标识符定义为BITSTRINGS,而不是DirectoryStrings。

所以最后我为OpenSSL添加了一个小补丁,正确处理x500UniqueIdentifier,配置文件可以写成:

[req_dn]
OU                      = 00
x500UniqueIdentifier    = 0x0123456789

如果有其他人尝试此操作,可以在此处找到该修补程序:http://pastebin.com/ua1uebTD