0

我正在尝试从我的客户端证书中检索主题备用名称。通过运行此命令,我可以看到 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。任何指导将不胜感激。谢谢!

4

2 回答 2

0

OpenSSL 命令本身将 SAN 设为 Null

X509v3 Subject Alternative Name: **<BLANK>**
IP Address:10.10.10.10

您可以打开证书并查看它是否包含 SAN。如果不是,您将不得不要求团队添加 SAN 并再次创建新证书。

在此处输入图像描述

于 2019-09-26T03:17:59.577 回答
0

你在滥用X509_get_ext_d2i(). 根据OpenSSL 文档X509_get_ext_d2i()(加粗我的):

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

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

由于您通过NULLas idx,如果证书上有多个 SAN,您NULL将从X509_get_ext_d2i().

您可以使用ERR_get_error().

于 2019-09-26T09:40:00.450 回答