我正在使用以下配置文件通过 OpenSSL 生成 CSR:
[ req ]
default_bits = 2048
default_keyfile = usercert.key
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
[ req_distinguished_name ]
C = FR
L = Paris
OU = IT
CN = FirstName LastName
[ req_attributes ]
1.3.6.1.4.1.311.13.2.1 = CertificateTemplate=CustomUserOffline
我的目标是将模板名称包含在 CSR 中,以便 Windows CA 能够处理它。
我使用以下命令行来生成 CSR:
openssl req -new -key usercert.key -out usercert.csr -config usercert.cnf
运行它时没有出现任何错误,并且我可以使用以下命令验证 CSR:
openssl req -text -noout -verify -in usercert.csr
verify OK
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = FR, L = Paris, OU = IT, CN = FirstName LastName
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:af:85:28:40:84:d8:8a:58:35:86:b8:f5:25:b2:
...
05:8d:57:cc:a0:4c:8f:da:f3:f4:a7:57:76:51:e2:
56:25
Exponent: 65537 (0x10001)
Attributes:
1.3.6.1.4.1.311.13.2.1 :CertificateTemplate=CustomUserOffline
Signature Algorithm: sha256WithRSAEncryption
1e:4e:9b:6d:24:75:81:5f:be:52:58:ba:79:a1:ac:c8:d6:c9:
...
40:2d:b6:fc
但是当我尝试在 Windows 上验证 CSR 时certutil usercert.csr
出现以下错误:
PKCS10 Certificate Request:
Version: 1
Subject:
CN=FirstName LastName
OU=IT
L=Paris
C=FR
Name Hash(sha1): ab6adbd772e0ca2a0fce4a32abfdd1645686c0b9
Name Hash(md5): 21d7edb09130201e880133c245617304
Public Key Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA (RSA_SIGN)
Algorithm Parameters:
05 00
Public Key Length: 2048 bits
Public Key: UnusedBits = 0
0000 30 82 01 0a 02 82 01 01 00 af 85 28 40 84 d8 8a
...
0100 f3 f4 a7 57 76 51 e2 56 25 02 03 01 00 01
Request Attributes: 1
1 attributes:
Attribute[0]: 1.3.6.1.4.1.311.13.2.1 (Enrollment Name Value Pair)
Value[0][0], Length = 27
Cannot decode object: The data is invalid. 0x8007000d (WIN32: 13 ERROR_INVALID_DATA)
CertUtil: -dump command FAILED: 0x8007000d (WIN32: 13 ERROR_INVALID_DATA)
CertUtil: The data is invalid.
似乎自定义属性被识别为1.3.6.1.4.1.311.13.2.1 (Enrollment Name Value Pair)
所显示,但我猜名称/值对的CertificateTemplate=CustomUserOffline
格式不正确。
我该如何修复?
几点说明:
我使用 OpenSSL 生成 CSR,因为最终将由 Linux 客户端生成 CSR
我知道该
certreq -attrib "CertificateTemplate:CustomUserOffline" -submit usercert.csr
命令,但请求将使用 certenroll API 通过 C# 代码提交,所以我想将证书模板信息直接包含在 CSR 中。
答案1
在输入的顶部openssl.conf
:
[ OIDs ]
certificateTemplateName = 1.3.6.1.4.1.311.20.2
在你的[req_attributes]
:
certificateTemplateName = ASN1:PRINTABLESTRING:CustomUserOffline
当然,您可以跳过 OID 的定义,就像您在问题中所做的那样,直接使用 OID。
使用以下 openssl 配置文件:
oid_section = OIDs
[ OIDs ]
# This uses the short name of the template:
certificateTemplateName = 1.3.6.1.4.1.311.20.2
# Use this instead if you need to refer to the template by OID:
# certificateTemplateOID = 1.3.6.1.4.1.311.21.7
[ req ]
prompt = no
string_mask = default
# The size of the keys in bits:
default_bits = 2048
distinguished_name = req_dn
req_extensions = req_ext
[ req_dn ]
# Note that the following are in 'reverse order' to what you'd expect to see in
# Windows and the numbering is irrelevant as long as each line's number differs.
# Domain Components style:
# Server name:
# 2.DC = com
# 1.DC = example
# commonName = Acme Web Server
# Locality style:
# countryName = GB
# stateOrProvinceName = London
# localityName = Letsby Avenue
# organizationName = Acme
# organizationalUnitName = IT Dept
# organizationalUnitName = Web Services
# commonName = Acme Web Server
# Or traditional org style:
countryName = GB
organizationName = Acme
organizationalUnitName = IT Dept
2.organizationalUnitName = Web Services
commonName = Acme Web Server
[ req_ext ]
#basicConstraints=critical,CA:TRUE
# This requests a certificate using the 'CustomUserOffline' template. Check with the CA for the correct name to use,
# or alternatively comment it out and let the CA apply it:
certificateTemplateName = ASN1:PRINTABLESTRING:CustomUserOffline
subjectAltName = @alt_names
[alt_names]
# To copy the CN (in the case of a DNS name in the CN) use:
# DNS = ${req_dn::commonName}
DNS.1 = www.example.com
DNS.2 = example.com
使用以下方式查看时,可得到以下摘录openssl req -in usercert.csr -noout -text
:
Attributes:
Requested Extensions:
1.3.6.1.4.1.311.20.2:
..CustomUserOffline
并使用以下方式查看摘录certutil usercert.csr
:
Attribute[0]: 1.2.840.113549.1.9.14 (Certificate Extensions)
Value[0][0], Length = 4d
Certificate Extensions: 2
1.3.6.1.4.1.311.20.2: Flags = 0, Length = 13
Certificate Template Name (Certificate Type)
CustomUserOffline