Openssl编程获取X509证书的DNS

本文介绍如何通过OpenSSL工具及C语言编程解析X509证书中的DNS信息,利用命令行工具和示例代码展示了如何获取X509v3SubjectAlternativeName扩展中的DNS记录。

证书中的DNS指的是X509v3扩展里面的X509v3 Subject Alternative Name;

可以使用命令查看

openssl x509 -text -noout -in 1.crt

输出如下:

X509v3 extensions:
    X509v3 Subject Alternative Name: 
        DNS: test.com

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <openssl/bio.h>
#include <openssl/x509v3.h>

int main(int argc, char **argv)
{
    BIO *bio = NULL;

    bio = BIO_new_file(argv[1], "r");
    assert(bio);

    X509 *x = NULL;
    x = PEM_read_bio_X509(bio, NULL, NULL, NULL);
    assert(x);

    GENERAL_NAMES* subjectAltNames = (GENERAL_NAMES*)X509_get_ext_d2i(x, NID_subject_alt_name, NULL, NULL);

    int cnt = sk_GENERAL_NAME_num(subjectAltNames);
    int i;

    for (i = 0; i < cnt; i++) {
        GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);

        printf("%s\n", ASN1_STRING_data(GENERAL_NAME_get0_value(generalName, NULL)));

    }
}
gcc -lssl a.c
./a.out 1.crt

DNS有可能有多个的。

<think>我们正在讨论OpenSSL的OBJ功能。根据用户问题,他想了解如何在编程中使用OpenSSL的OBJ功能。OBJ功能主要涉及对象标识符(ObjectIdentifier,OID)的操作。在OpenSSL中,OID用于标识算法、扩展类型、属性类型等。OpenSSL提供了一组函数来操作OID。根据引用[3]中提到的X.509证书结构,其中包含了一些OID相关的字段(如sig_alg),但用户问题聚焦在OBJ功能上,因此我们需要介绍OpenSSL中OBJ相关的API。主要步骤:1.查找OID:通过名称、别名或数字标识符查找OID对象。2.获取OID信息:获取OID的NID(数字标识符)、名称、长名称等。3.添加OID:如果需要自定义OID,可以将其添加到OpenSSL的内部表中。注意:引用[1]和[2]提供了OpenSSL的安装和PEM文件结构的信息,但用户问题集中在OBJ编程,因此我们将重点放在OBJ API上。下面我们将详细介绍如何在编程中使用OpenSSL的OBJ功能。</think>### OpenSSL OBJ 编程使用详解 OpenSSL 的 OBJ 库用于操作**对象标识符(Object Identifier, OID)**,OID 是 ASN.1 标准中用于唯一标识算法、协议扩展或证书属性的数字序列(如 `2.5.4.3` 表示通用名称)。以下是核心功能的编程方法: --- #### 1. **OID 基础操作** - **查找 OID 信息** 通过名称或数字标识符获取 OID 详情: ```c #include <openssl/objects.h> // 通过名称查找 NID(数字标识符) int nid = OBJ_sn2nid("commonName"); // 返回 NID_commonName (默认为 13) // 通过 NID 获取 OID 名称 const char *name = OBJ_nid2sn(nid); // 短名称:"CN" const char *long_name = OBJ_nid2ln(nid); // 长名称:"commonName" // 获取 OID 的 ASN.1 对象 ASN1_OBJECT *obj = OBJ_nid2obj(nid); ``` - **解析 OID 字符串** 将文本格式的 OID 转换为内部对象: ```c ASN1_OBJECT *obj = OBJ_txt2obj("2.5.4.3", 1); // 1 表示解析数字格式 ``` --- #### 2. **自定义 OID** 需将新 OID 注册到全局表: ```c int custom_nid = OBJ_create("1.3.6.1.4.1.99999", "myCustomOID", "My Custom Object"); if (custom_nid == NID_undef) { // 处理错误 } ``` --- #### 3. **OID 在 X.509 证书中的应用 结合引用[3]的证书结构,OID 用于标识扩展项(如主题备用名称): ```c X509_EXTENSION *ex = X509V3_EXT_conf(NULL, NULL, "subjectAltName", "DNS:example.com"); // 获取扩展项的 OID ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex); int nid = OBJ_obj2nid(obj); // 返回 NID_subject_alt_name ``` --- #### 4. **遍历所有 OID** 列出 OpenSSL 内置的 OID: ```c void print_all_objs() { ASN1_OBJECT *obj; int last_nid = 0; while ((last_nid = OBJ_get_next_nid(last_nid)) != NID_undef) { obj = OBJ_nid2obj(last_nid); printf("NID=%d, Name=%s\n", last_nid, OBJ_nid2sn(last_nid)); } } ``` --- #### 5. **注意事项** - **内存管理**: 使用 `ASN1_OBJECT_free(obj)` 释放 `OBJ_txt2obj` 或 `OBJ_nid2obj` 返回的对象。 - **OID 冲突**: 自定义 OID 需确保唯一性,避免与[标准 OID](https://www.openssl.org/docs/man1.1.1/man3/OBJ_nid2obj.html) 冲突。 - **兼容性**: 不同 OpenSSL 版本的 OID 集合可能不同(参考引用[2]的版本信息)。 --- ### 示例代码:获取 OID 详细信息 ```c #include <openssl/objects.h> #include <stdio.h> int main() { ASN1_OBJECT *obj = OBJ_txt2obj("2.5.4.3", 1); // "commonName" 的数字形式 char buf[256]; OBJ_obj2txt(buf, sizeof(buf), obj, 1); // 将 OID 转为可读字符串 printf("OID: %s\nName: %s\nNID: %d\n", buf, OBJ_nid2sn(OBJ_obj2nid(obj)), OBJ_obj2nid(obj)); ASN1_OBJECT_free(obj); return 0; } ``` **输出**: ``` OID: 2.5.4.3 Name: CN NID: 13 ``` --- ### 关键 API 参考 | 函数 | 作用 | |------|------| | `OBJ_nid2obj(nid)` | 通过 NID 获取 OID 对象 | | `OBJ_obj2nid(obj)` | 通过 OID 对象获取 NID | | `OBJ_txt2nid("name")` | 通过文本名称获取 NID | | `OBJ_create(oid, sn, ln)` | 注册新 OID | | `OBJ_obj2txt(buf, len, obj, 1)` | 将 OID 转为字符串 | > 详细 API 见 [OpenSSL OBJ 文档](https://www.openssl.org/docs/man1.1.1/man3/OBJ_nid2obj.html)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值