我一直在为测试目的创建一些证书。一切顺利,直到我需要在证书主题中包含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接口,但我希望有一种更简单的方法。
任何建议都将不胜感激。
答案 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