C++和OpenSSL库:如何从代码中设置subjectAltName(SAN)
C++ and OpenSSL Library: How can I set subjectAltName (SAN) from code?
我正试图从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上,如果它可以帮助的话。
你好,我已经做了类似的事情(但我使用的是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;
}
这对我来说暂时有效,但当我想用新的使用者alt名称更新现有证书时(因为有了新的ip地址),我仍然会遇到一些麻烦。
查看结果并检查是否使用了主题替代名称:
$ openssl x509 -text -in cert.pem
不要使用X509V3_EXT_conf
函数,尝试使用X509V3_EXT_conf_nid
函数,在该函数中传递NID而不是名称。
ext = X509V3_EXT_conf (NULL, NULL, ext_name, ext_value);
可以是
ext = X509V3_EXT_conf_nid(NULL, NULL, NID_subject_alt_name, ext_value);
您的代码可能无法工作,因为扩展名可能与OpenSSL代码中的扩展名不完全匹配。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?