我正在挖掘源代码,试图找到让OpenSSL始终接受过期证书的方法。我找不到过期错误/警报和实际检查代码之间的链接。谁能指出我正确的方向? (我的C不是很好,我依赖于可以从C ++继承的东西)
我想接受过期证书的原因是因为我们有一吨嵌入式系统,其证书将在几个月内到期(更新不是一个选项,因为它们要么已经关闭,要么已经过大容量存储)。这些连接的服务器知道只接受这些系统,因此允许过期的证书似乎是最直接的解决方案。
答案 0 :(得分:3)
让OpenSSL接受过期的证书......
在验证回调功能中,您应同时接受X509_V_OK
和X509_V_ERR_CERT_HAS_EXPIRED
。也许是这样的:
int verify_callback(int preverify, X509_STORE_CTX* x509_ctx)
{
/* For error codes, see http://www.openssl.org/docs/apps/verify.html */
int err = X509_STORE_CTX_get_error(x509_ctx);
if(preverify == 0)
{
if(err == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY)
fprintf(stdout, " Error = X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY\n");
else if(err == X509_V_ERR_CERT_UNTRUSTED)
fprintf(stdout, " Error = X509_V_ERR_CERT_UNTRUSTED\n");
else if(err == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN)
fprintf(stdout, " Error = X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN\n");
else if(err == X509_V_ERR_CERT_NOT_YET_VALID)
fprintf(stdout, " Error = X509_V_ERR_CERT_NOT_YET_VALID\n");
else if(err == X509_V_ERR_CERT_HAS_EXPIRED)
fprintf(stdout, " Error = X509_V_ERR_CERT_HAS_EXPIRED\n");
else if(err == X509_V_OK)
fprintf(stdout, " Error = X509_V_OK\n");
else
fprintf(stdout, " Error = %d\n", err);
}
if (err == X509_V_OK || err == X509_V_ERR_CERT_HAS_EXPIRED)
return 1;
return preverify;
}
旧手机和物联网小工具的另一个问题是缺少时钟和/或辅助电源。您可能还需要允许X509_V_ERR_CERT_NOT_YET_VALID
。您将在20世纪90年代或20世纪90年代开始观察这种设备并启动并思考它。没有SIM卡的老款手机一直都是这样。我也在现代[低端] Android手机中观察过它。
答案 1 :(得分:1)
我是如何解决的:
证书的时间检查在ssl/x509_vfy.c
:
static int check_cert_time(X509_STORE_CTX *ctx, X509 *x)
{
time_t *ptime;
int i;
.
.
.
i = X509_cmp_time(X509_get_notAfter(x), ptime);
.
.
.
if (i < 0) {
return 1;
/* Allow expired certificates!
*
* ctx->error = X509_V_ERR_CERT_HAS_EXPIRED;
* ctx->current_cert = x;
* if (!ctx->verify_cb(0, ctx))
* return 0;
*/
}
return 1;
}
我刚评论了设置过期错误的部分。不是最好的方法,我建议改用jww's answer。我只是想我应该记录我使用的解决方案。
此解决方案意味着openssl 无法检测任何过期的证书,即使set_verify_cb
更改了回调。