C 获取主题替代名称OpenSSL

C 获取主题替代名称OpenSSL,c,openssl,x509certificate,tls1.2,subject-alternative-name,C,Openssl,X509certificate,Tls1.2,Subject Alternative Name,我正在尝试从我的客户端证书中检索主题替代名称。通过运行此命令,我可以看到SAN: openssl x509 -noout -text -in certname.cert.pem ... X509v3 Subject Alternative Name: IP Address:10.10.10.10 在C文件中,我尝试检索客户机SAN,以便使用服务器IP验证它。以下是我的尝试: cert = X509_STORE_CTX_get_current_cert(x509Ctx); int i; int

我正在尝试从我的客户端证书中检索主题替代名称。通过运行此命令,我可以看到SAN:

openssl x509 -noout -text -in certname.cert.pem
...
X509v3 Subject Alternative Name: 
IP Address:10.10.10.10
在C文件中,我尝试检索客户机SAN,以便使用服务器IP验证它。以下是我的尝试:

cert = X509_STORE_CTX_get_current_cert(x509Ctx);
int i;
int san_names_nb = -1;
STACK_OF(GENERAL_NAME) *san_names = NULL;

// Try to extract the names within the SAN extension from the certificate
san_names = (GENERAL_NAME*)X509_get_ext_d2i((X509 *) cert, NID_subject_alt_name, NULL, NULL);
if (san_names == NULL) 
{
   return Error;
}

现在,我的代码返回错误,因为san_names为NULL。任何指导都将不胜感激。谢谢大家!

OpenSSL命令本身将SAN设置为Null

X509v3 Subject Alternative Name: **<BLANK>**
IP Address:10.10.10.10
X509v3主题备选名称:****
IP地址:10.10.10.10
你能打开证书看看它是否包含SAN吗。如果没有,您必须要求团队添加SAN并再次创建新证书


您误用了
X509\u get\u ext\u d2i()
。Per(加粗矿):

如果
idx
NULL
,则只允许出现一次扩展否则返回索引
*idx
后的第一次扩展,并将
*idx
更新到扩展的位置

根据您使用的OpenSSL版本,行为可能略有不同。以上是OpenSSL 1.1.0的记录行为

由于您将
NULL
作为
idx
传递,如果证书上有多个SAN,您将从
X509\u get\u ext\u d2i()
获得
NULL


您可以使用获取OpenSSL错误代码。

问题已经说明“通过运行此命令,我可以看到SAN”。IP地址是可见的,而不是SAM,因此认为它是空的