首页 > 解决方案 > 如何使用根公钥以编程方式验证中间证书签名?

问题描述

背景

我有以下链:

  1. 根证书,自签名
  2. 中级证书,由 Root 颁发
  3. 中间人签发的用户证书

我正在尝试使用颁发者(根)的公钥来验证中间证书的签名。我正在使用以下代码片段来实现此任务:

int verify_cert_sig(X509 *issuer, X509 *cert){

    EVP_PKEY *public_key = X509_get_pubkey(issuer);

    if(public_key == NULL){
        _log->error("unable to get public key");
        return ERROR;
    }

    int result = X509_verify(cert, public_key);

    EVP_PKEY_free(public_key);

    if(result <= 0){
        return ERROR;
    }

    return SUCCESS;
}

int verify_sig(const std::string &issuer, const std::string &cert){

    X509 *issuer_x509 = load_cert("root.pem", X509_FILETYPE_PEM);
    if(issuer_x509 == NULL){
        _log->error("unable to load x509 cert: {}", issuer);
        return ERROR;
    }

    X509 *cert_x509 = load_cert("intermediate.pem", X509_FILETYPE_PEM);
    if(cert_x509 == NULL){
        _log->error("unable to load x509 cert: {}", cert);
        return ERROR;
    }

    auto rv = verify_cert_sig(issuer_x509, cert_x509);

    X509_free(issuer_x509);
    X509_free(cert_x509);

    if(rv <= 0){
        return ERROR;
    }

    return SUCCESS;
}

问题

由于我不知道的原因,前面的代码段将返回错误。

但是,如果我使用 openssl cli,我可以使用 root 验证中间:

$:openssl verify -verbose -CAfile root.pem intermediate.pem
subroot.pem: OK

问题

标签: c++openssl

解决方案


推荐阅读