c++ - 升级到 openSSL 1.1.1 时出现指针问题

标签 c++ openssl

我使用的是 openSSL 1.0.2,并决定升级到版本 1.1.1k。但是,我对一些指针有一些问题:

    X509_STORE_CTX *vrfy_ctx = X509_STORE_CTX_new();
    X509_STORE_CTX_init(vrfy_ctx, store, cert_x509, NULL);

    if(X509_verify_cert(vrfy_ctx) != 1)
    {
        if(ignore_date)
        {
            //X509_V_FLAG_NO_CHECK_TIME is not available here so check
            // if the error is related to datetime, if it is, just ignore it
            switch(vrfy_ctx->error) //error here
            {
                case X509_V_ERR_CERT_NOT_YET_VALID:
                case X509_V_ERR_CERT_HAS_EXPIRED:
                    X509_STORE_CTX_free(vrfy_ctx);
                    X509_STORE_free(store);
                    return true;
            }
        }

        error_message = X509_verify_cert_error_string(vrfy_ctx->error); //error here
        X509 *error_cert  = X509_STORE_CTX_get_current_cert(vrfy_ctx);
        X509_NAME *certsubject = X509_get_subject_name(error_cert);
        error_message += X509_NAME_oneline(certsubject, 0, 0);
        X509_free(error_cert);
        X509_STORE_CTX_free(vrfy_ctx);
        X509_STORE_free(store);
        return false;
    }

这里也是:

std::string ssl_tools::public_key_type(X509 *x509)
{
    EVP_PKEY *pkey=X509_get_pubkey(x509);
    int key_type = EVP_PKEY_type(pkey->type); //error here
    EVP_PKEY_free(pkey);
    if (key_type==EVP_PKEY_RSA) return "RSA";
    if (key_type==EVP_PKEY_DSA) return "DSA";
    if (key_type==EVP_PKEY_DH)  return "DH";
    if (key_type==EVP_PKEY_EC)  return "ECC";
    return "";
}

int ssl_tools::public_key_size(X509 *x509)
{
    EVP_PKEY *pkey=X509_get_pubkey(x509);
    int key_type = EVP_PKEY_type(pkey->type); //error here
    int keysize = -1; //or in bytes, RSA_size() DSA_size(), DH_size(), ECDSA_size();
    keysize = key_type==EVP_PKEY_RSA && pkey->pkey.rsa->n ? BN_num_bits(pkey->pkey.rsa->n) : keysize; //error here
    keysize = key_type==EVP_PKEY_DSA && pkey->pkey.dsa->p ? BN_num_bits(pkey->pkey.dsa->p) : keysize; //error here
    keysize = key_type==EVP_PKEY_DH  && pkey->pkey.dh->p  ? BN_num_bits(pkey->pkey.dh->p) : keysize; //error here
    keysize = key_type==EVP_PKEY_EC  ? EC_GROUP_get_degree(EC_KEY_get0_group(pkey->pkey.ec)) : keysize; //error here
    EVP_PKEY_free(pkey);
    return keysize;
}

上述错误是:“不允许指向不完整类类型“evp_pkey_st”的指针”和“不允许指向不完整类类型“x509_store_ctx_st”的指针”

不明白如何解决这些错误,有什么想法吗?

最佳答案

许多结构在 OpenSSL 1.1.1 中是不透明的,这意味着您无法深入结构内部来访问值。相反,您需要使用访问器函数:

  • vrfy_ctx->error 的所有实例替换为 X509_STORE_CTX_get_error(vrfy_ctx)
  • pkey->type 的任何实例替换为 EVP_PKEY_id(pkey)
  • pkey->pkey.rsa->n 的任何实例替换为 RSA_get0_n(EVP_PKEY_get0_RSA(pkey))
  • pkey->pkey.dsa->p 的任何实例替换为 DSA_get0_p(EVP_PKEY_get0_DSA(pkey))
  • pkey->pkey.dh->p 的任何实例替换为 DH_get0_p(EVP_PKEY_get0_DH(pkey))
  • pkey->pkey.ec 的任何实例替换为 EVP_PKEY_get0_EC_KEY(pkey)

关于c++ - 升级到 openSSL 1.1.1 时出现指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69225287/

相关文章:

用于 SSL 证书验证的 PHP 程序

SSL 证书已更新但更改不可见

c++ - 如何让 Qt 5.8 在 Windows 上使用 OpenSSL

C++函数的继承,传入参数

c++ - 非类型模板参数中的C++类类型:推导指南失败

c++ - 从第二个(或第 n 个)项开始循环 C++ 迭代器

c++ - 如何将 unsigned char * 的内容转换为 const char *?

c - 如何使用 OpenSSL 为 DNSSEC 生成 ECDSA 私钥和公钥?

c - c 中的 OpenSSL 命令获取 RSA 中公钥的模数

c++ - 如何调整椭圆的大小,使其始终触及左右边界?