使OpenSSL接受过期的证书

时间:2017-02-16 11:06:18

标签: c ssl openssl

我正在挖掘源代码,试图找到让OpenSSL始终接受过期证书的方法。我找不到过期错误/警报和实际检查代码之间的链接。谁能指出我正确的方向? (我的C不是很好,我依赖于可以从C ++继承的东西)

我想接受过期证书的原因是因为我们有一吨嵌入式系统,其证书将在几个月内到期(更新不是一个选项,因为它们要么已经关闭,要么已经过大容量存储)。这些连接的服务器知道只接受这些系统,因此允许过期的证书似乎是最直接的解决方案。

2 个答案:

答案 0 :(得分:3)

  

让OpenSSL接受过期的证书......

在验证回调功能中,您应同时接受X509_V_OKX509_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更改了回调。