gpt4 book ai didi

C++ 和 OpenSSL 库 : How can I set subjectAltName (SAN) from code?

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:35 36 4
gpt4 key购买 nike

我正在尝试从 C++ 代码创建带有 subjectAltName 的自签名请求(尝试将 this 等动态自签名证书实现到实际版本的 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) 将此 block 添加到我生成 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);

代码再次正确编译,即时生成证书,但替代名称仍然不起作用,我在浏览器中收到错误消息:

网络::ERR_CERT_COMMON_NAME_INVALID

而且我在证书详细信息中没有看到备用名称信息。

SAN 问题还有哪些其他解决方案?如果有帮助,我可以在 githab 上提供所有代码。

最佳答案

你好,我做过类似的事情(但我正在使用 X509 对象而不是像你这样的 X509_REQ 对象:

static int cs_cert_set_subject_alt_name(X509 *x509_cert)
{
char *subject_alt_name = "IP: 192.168.1.1";
X509_EXTENSION *extension_san = NULL;
ASN1_OCTET_STRING *subject_alt_name_ASN1 = NULL;
int ret = -1;

subject_alt_name_ASN1 = ASN1_OCTET_STRING_new();
if (!subject_alt_name_ASN1) {
goto err;
}
ASN1_OCTET_STRING_set(subject_alt_name_ASN1, (unsigned char*) subject_alt_name, strlen(subject_alt_name));
if (!X509_EXTENSION_create_by_NID(&extension_san, NID_subject_alt_name, 0, subject_alt_name_ASN1)) {
goto err;
}
ASN1_OCTET_STRING_free(subject_alt_name_ASN1);
ret = X509_add_ext(x509_cert, extension_san, -1);
if (!ret) {
goto err;
}
X509_EXTENSION_free(extension_san);

err:
if (subject_alt_name_ASN1) ASN1_OCTET_STRING_free(subject_alt_name_ASN1);
if (extension_san) X509_EXTENSION_free(extension_san);
return -1;
}

目前它对我有用,当我想用​​新的主题替代名称(因为新的 ip 地址)更新现有证书时,我仍然遇到一些麻烦。

要查看结果并检查主题替代名称是否已生成:

$ openssl x509 -text -in cert.pem 

关于C++ 和 OpenSSL 库 : How can I set subjectAltName (SAN) from code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54359214/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com