如何在OpenSSL中指定x509配置属性的数据类型

如何在OpenSSL中指定x509配置属性的数据类型,openssl,x509,asn.1,Openssl,X509,Asn.1,我一直在为测试目的创建一些证书。在我需要在证书主题中包含X500唯一标识符之前,一切都进展顺利。在配置文件中指定字段x500UniqueIdentifier很容易,但是,生成的证书与我提供的示例证书不一致,因为基础ASN.1类型错误。即,不是位字符串 考虑openssl配置文件(称为leaf.conf): 和以下命令: openssl genrsa -out testkey.pem openssl req -x509 -new -config leaf.conf -key testkey.pem

我一直在为测试目的创建一些证书。在我需要在证书主题中包含X500唯一标识符之前,一切都进展顺利。在配置文件中指定字段x500UniqueIdentifier很容易,但是,生成的证书与我提供的示例证书不一致,因为基础ASN.1类型错误。即,不是位字符串

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

和以下命令:

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已编码为可打印字符串。我想做的是将其编码为位字符串。此外,我不想要ASCII文本,我想要将字节序列指定为十六进制。也就是说,我想这样做:

[req_dn]
OU                      = 00
x500UniqueIdentifier    = ASN1:BITSTRING:HEX:0123456789
然而,OpenSSL似乎总是将其编码为字符串(包括ASN1:part)。通过查看OpenSSL的手册页,可以深入了解上述内容,特别是与编码任意x509v3扩展相关的部分

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


如果您有任何建议,我们将不胜感激。

在解决了我自己的问题之后,我尝到了胜利的甜味

简而言之,openssl命令行应用程序不支持我试图做的事情。ASN.1符号仅支持v3扩展。如果我能更好地阅读手册,我会看到以下内容:

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

有关更多信息,请参阅:

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

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

[req_dn]
OU                      = 00
x500UniqueIdentifier    = 0x0123456789
如果其他人尝试此操作,可在此处找到修补程序:

[req_dn]
OU                      = 00
x500UniqueIdentifier    = 0x0123456789