如何在证书中添加使用者备用名称。使用wincrypt,我创建了证书并将其添加到“ MY”和“ root”路径,其中CN可以是机器的完全限定域名或主机名或IP。作为主题备用名称,我想添加以下内容:DNS名称=完全限定的域名,DNS名称=主机名和 DNS名称= IP 这该怎么做? 我不想使用openssl。
CertCreateSelfSignCertificate(NULL, &IssuerBlob, 0, &KeyProvInfo, &Alg, 0, &EndTime, &myExtns_list);
CERT_EXTENSION myExtn;
myExtn.fCritical = TRUE;
myExtn.pszObjId = szOID_SUBJECT_ALT_NAME;
myExtn.Value = myBlobdata;
CERT_EXTENSIONS myExtns_list;
myExtns_list.cExtension = 1;
myExtns_list.rgExtension = &myExtn;
char cb[20] = { "DNS Names=abc.com" };
BYTE *pbData = (BYTE*)cb;
CERT_NAME_BLOB myBlobdata;
myBlobdata.cbData = 20;
myBlobdata.pbData = pbData;
这将创建证书并将证书添加到没有证书中的SAN的商店中
我尝试通过扩展列表,如下所示:
int base_to_decimal(char * input_base, int base)
这样,我可以在左窗格中将SAN作为字节格式获取,并且右窗格中显示我的字符串“ DNS Names = abc.com”。
但是我的要求是仅在SAN中显示DNS名称。
答案 0 :(得分:0)
我假设扩展数据的构建实际上发生在调用CertCreateSelfSignedCertificate
之前(同样,myBlobdata
的构建发生在使用之前)。
主要问题是您使用了一个(或多个)SAN条目作为SAN扩展的整体。这意味着您丢失了一些编码包装器。第二个问题是您使用了szOID_SUBJECT_ALT_NAME
,这是主题替代名称的错误OID ...您实际上想要szOID_SUBJECT_ALT_NAME2
。
我要添加以下内容:DNS名称=完全限定的域名,DNS名称=主机名和DNS名称= IP
添加IP地址作为DNS名称是非标准的,并且应该导致匹配失败。您实际上想将IP地址添加为IP地址SAN条目。
CERT_ALT_NAME_ENTRY entries[3];
entries[0] = { CERT_ALT_NAME_DNS_NAME };
entries[0].pwszDNSName = L"example.org";
// IPv4 Address 10.12.1.130
BYTE ip4Bytes[] = { 10, 12, 1, 130 };
entries[1] = { CERT_ALT_NAME_IP_ADDRESS };
entries[1].IPAddress = { sizeof(ip4Bytes), ip4Bytes };
// ::1, big-endian
BYTE ip6Bytes[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
entries[2] = { CERT_ALT_NAME_IP_ADDRESS };
entries[2].IPAddress = { sizeof(ip6Bytes), ip6Bytes };
CERT_NAME_BLOB name = { cbEncoded, buf };
BYTE extBuf[1024] = { 0 };
cbEncoded = sizeof(extBuf);
CERT_ALT_NAME_INFO info = { sizeof(entries) / sizeof(CERT_ALT_NAME_ENTRY), entries };
if (!CryptEncodeObjectEx(
X509_ASN_ENCODING,
X509_ALTERNATE_NAME,
&info,
0,
nullptr,
extBuf,
&cbEncoded))
{
// Whatever your error handling story is.
//
// Note I didn't do a 0 buffer or CRYPT_ENCODE_ALLOC; I just knew
// that my buffer would be big enough.
}
CERT_EXTENSION extension = { 0 };
extension.fCritical = 0;
extension.pszObjId = szOID_SUBJECT_ALT_NAME2;
extension.Value = { cbEncoded, extBuf };
CERT_EXTENSIONS extensions = { 1, &extension };
...
PCCERT_CONTEXT cert = CertCreateSelfSignCertificate(
0,
&name,
0,
&keyProvInfo,
&sigAlg,
0,
&certExpirationDate,
&extensions);
在CertUI中,可以给我期望的使用者替代名称值:
DNS Name=example.org
IP Address=10.12.1.130
IP Address=0000:0000:0000:0000:0000:0000:0000:0001