我正在尝试使用 c++ 代码中的 subjectAltName 创建自签名请求(尝试将这样的动态自签名证书实现到 OpenResty 的实际版本,但没有针对 subjectAltName 的解决方案)。
请提供一些从 C++/OpenSSL 代码设置 SAN 的示例。我尝试这样的一些:
X509_EXTENSION *ext;
STACK_OF (X509_EXTENSION) * extlist;
char *ext_name = "subjectAltName";
char *ext_value = "DNS:lohsport.com";
extlist = sk_X509_EXTENSION_new_null ();
ext = X509V3_EXT_conf (NULL, NULL, ext_name, ext_value);
if(ext == NULL)
{
*err = "Error creating subjectAltName extension";
goto failed;
}
sk_X509_EXTENSION_push (extlist, ext);
if (!X509_REQ_add_extensions (x509_req, extlist)){
*err = "Error adding subjectAltName to the request";
goto failed;
}
sk_X509_EXTENSION_pop_free (extlist, X509_EXTENSION_free);
它编译成功但不起作用。如果有任何帮助,我将不胜感激。
更新 现在我尝试在 OpenSSL 库的 selfsing.c 演示中工作:
1) 我定义了一个向 CSR 添加扩展的函数:
int add_ext(STACK_OF(X509_EXTENSION) *sk, int nid, char *value)
{
X509_EXTENSION *ex;
ex = X509V3_EXT_conf_nid(NULL, NULL, nid, value);
if (!ex)
return 0;
sk_X509_EXTENSION_push(sk, ex);
return 1;
}
2) 将此块添加到生成 CSR 的函数中:
char Buffer[512];
// Format the value
sprintf (Buffer, "DNS:%s", info->common_name);
xts = sk_X509_EXTENSION_new_null();
add_ext(exts, NID_subject_alt_name, Buffer);
if(X509_REQ_add_extensions(x509_req, exts) != 1) {
*err = "X509_REQ_add_extensions() failed";
goto failed;
}
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
代码再次正确编译,即时生成证书,但替代名称仍然不起作用,并且在浏览器中出现错误:
NET :: ERR_CERT_COMMON_NAME_INVALID
而且我在证书详细信息中看不到替代名称信息。
SAN 问题还有哪些其他解决方案?如果有帮助,我可以在 githab 上提供所有代码。