OpenSSL 1.0.2手动校验TLS证书日期时出现段错误求助
解决OpenSSL 1.0.2手动校验TLS证书日期时的段错误问题
你的代码出现段错误的核心原因是使用了未初始化的指针以及错误的函数调用/声明,我来一步步拆解问题并给出修正方案:
问题分析
先看你代码里的几个关键错误点:
- 未初始化的指针变量:
time_t *tnow;这是一个野指针,没有指向任何有效的内存空间,直接传给ASN1_TIME_set会导致非法内存访问。int *bday, *bsec, *aday, *asec;同样是未初始化的指针,ASN1_TIME_diff需要写入这些指针指向的内存,但它们根本没有指向合法的int变量,必然触发段错误。
- 错误的函数声明:
你自己声明的ASN1_TIME *ASN1_TIME_set(ASN1_TIME *anow, time_t tnow);是错误的,OpenSSL 1.0.2中该函数的实际签名是ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s, time_t t);,错误的声明会导致参数传递混乱。 - ASN1_TIME变量使用错误:
ASN1_TIME anow;是栈上的结构体变量,你需要传递它的地址&anow给ASN1_TIME_set,而不是直接传变量本身(会被当成指针处理,指向非法地址)。
修正后的代码示例
下面是修复后的完整代码,包含正确的变量初始化和函数调用:
#include <openssl/x509.h> #include <openssl/asn1.h> #include <time.h> // 校验证书日期有效性的函数,cert为已加载的X509证书指针 int validate_cert_dates(X509 *cert) { // 改用栈上变量,避免野指针 time_t tnow; int bday, bsec, aday, asec; ASN1_TIME anow; ASN1_TIME *not_before = X509_get_notBefore(cert); ASN1_TIME *not_after = X509_get_notAfter(cert); // 获取当前系统时间 if (time(&tnow) == -1) { // 处理时间获取失败的情况 return -1; } // 将当前时间转换为ASN1_TIME格式 if (!ASN1_TIME_set(&anow, tnow)) { // 转换失败,返回错误 return -2; } // 计算not_before到当前时间的时间差:判断证书是否已生效 int before_diff = ASN1_TIME_diff(&bday, &bsec, not_before, &anow); if (before_diff < 0 || (bday < 0 || (bday == 0 && bsec < 0))) { // 证书未到生效时间 return -3; } // 计算当前时间到not_after的时间差:判断证书是否已过期 int after_diff = ASN1_TIME_diff(&aday, &asec, &anow, not_after); if (after_diff < 0 || (aday < 0 || (aday == 0 && asec < 0))) { // 证书已过期 return -4; } // 证书日期有效 return 0; }
关键修复点说明
- 把所有指针变量改成栈上的普通变量,传递它们的地址给相关函数,确保函数有合法的内存空间可以读写。
- 移除了错误的
ASN1_TIME_set声明,确保包含正确的OpenSSL头文件(<openssl/x509.h>和<openssl/asn1.h>),让编译器使用正确的函数签名。 - 正确调用
ASN1_TIME_set,传入&anow(栈结构体的地址)和有效的time_t值。 - 通过
ASN1_TIME_diff的返回值和时间差的正负,准确判断证书是否在有效期内:- 当
not_before到当前时间的差为正,说明证书已生效; - 当前时间到
not_after的差为正,说明证书未过期。
- 当
内容的提问来源于stack exchange,提问作者Gabriel Vega
相关产品推荐
相关产品推荐

