【问题标题】:How to verify a X509 certificate in C如何在 C 中验证 X509 证书
【发布时间】:2013-04-05 14:27:45
【问题描述】:

我有一张 X509 格式的证书。这是函数中的输入参数。 我想做的是验证证书的有效性。 怎么做到呢?

X509_verify_cert();

我找到了这个函数,但是它不接受 X509* 证书,它接受 X509_store 而我只有一个 X509。

谢谢 最好的问候。

【问题讨论】:

  • 您可以考虑缩小您尝试实现此目的的平台,尽管这样对于本问答论坛来说可能过于模糊。
  • 函数名有误导性——它不能完全验证证书的有效性,你还要检查主机名是否匹配,别忘了这样做。从 OpenSSL 1.0.2 开始有一个功能:openssl.org/docs/manmaster/crypto/X509_check_email.html

标签: c openssl certificate x509certificate x509


【解决方案1】:

要验证证书签名,您需要颁发者证书的公钥。此颁发者证书的签名使用另一个颁发者证书(或受信任的根证书)进行验证。因此,如果证书的签名在链上一直验证到受信任的根,则该证书被认为是受信任的。

自签名证书的签名使用自己的公钥进行验证,如下例所示:

int verify_cert(const char* pem_c_str)
{
    BIO *bio_mem = BIO_new(BIO_s_mem());
    BIO_puts(bio_mem, pem_c_str);
    X509 * x509 = PEM_read_bio_X509(bio_mem, NULL, NULL, NULL);

    EVP_PKEY *pkey=X509_get_pubkey(x509);
    int r= X509_verify(x509, pkey);
    EVP_PKEY_free(pkey);

    BIO_free(bio_mem);
    X509_free(x509);
    return r;
}

来自:http://www.zedwood.com/article/openssl-c-verify-self-signed-certificate-signature

【讨论】:

    【解决方案2】:

    我在这里只是为了发布我在上述 cmets 中找到的答案。

    我没有证书链,所以在我正在做的工作中,我只有一个由我以编程方式生成的证书。我想检查它的有效性,所以我创建了以下函数,该函数将证书与自身进行检查以验证它的有效性。

    void check_certificate_validaty(X509* certificate)
    {
        int status;
        X509_STORE_CTX *ctx;
        ctx = X509_STORE_CTX_new();
        X509_STORE *store = X509_STORE_new();
    
        X509_STORE_add_cert(store, certificate);
    
        X509_STORE_CTX_init(ctx, store, certificate, NULL);
    
        status = X509_verify_cert(ctx);
        if(status == 1)
        {
            printf("Certificate verified ok\n");
        }else
        {
            printf("%s\n", X509_verify_cert_error_string(ctx->error));
        }
    }
    

    希望这对某人有帮助:)

    【讨论】:

    • 简而言之,上述代码可用于验证自签名证书。
    【解决方案3】:

    请参阅文档here

    您需要使用 X509_STORE_CTX_new 创建证书存储。 然后使用 X509_STORE_CTX_set_chain 添加证书链。使用 X509_STORE_CTX_trusted_stack 添加受信任的根证书。 最后使用 X509_STORE_CTX_set_cert 添加要验证的证书。

    之后调用 X509_verify_cert。

    我希望这会帮助你开始做这件事。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 2011-04-06
      • 2011-11-11
      • 2020-05-23
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多