使 OpenSSL 接受过期的证书

Ale*_*uer 2 c ssl openssl

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

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

jww*_*jww 6

使 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;
}
Run Code Online (Sandbox Code Playgroud)

老式移动设备和物联网设备的另一个问题是缺少时钟和/或辅助电源。您可能也需要允许X509_V_ERR_CERT_NOT_YET_VALID。您将在 1990 年代或 2000 年代开机并认为其存在的设备上观察到这一点。没有 SIM 卡的旧手机一直会遇到这种情况。我也在现代 [低端] Android 手机中观察到它。