如何验证中间 CA
How to verify intermediate CA
我有与服务器的SSL连接。我有根 CA,它也是服务器证书。我没有客户端证书,当连接启动时,客户端会验证服务器证书,如果它有效,则连接。现在我已经从我的根 CA 创建了中间 CA,并将其替换为服务器证书,现在我希望客户端验证服务器证书是否受根 CA 信任,我使用 openSSL API C++执行此操作。我该怎么做?这是我尝试过的,但它需要更多的东西。
const Char *caCert = "/home/omar/CA/host/host_rsa_key.crt";
X509_LOOKUP *lookup = X509_STORE_add_lookup(ctx_ -> cert_store,X509_LOOKUP_file());
result=X509_LOOKUP_load_file(lookup,caCert,X509_FILETYPE_PEM);
if(result != 1)
{
log()<<ERROR! Cannot load file to lookup structuren";
return;
}
SSL_CTX_sess_set_new_cb(ctx_, handshakeCallback);
SSL_CTX_set_verify(ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
verifyCallback);
SSL_CTX_set_verify_depth(ctx_, 8);
这是我将所有证书加载到ssl_ctx的地方。
我有验证回调函数,它调用验证证书()方法,这里是
Int verifyCertificate(Int preverify, X509_STORE_CTX *store)
{
X509 *cert = NULL;
// X509_NAME *name = NULL;
SSL *ssl = NULL;
Int certDepth = -1;
Int certErr = 0;
Char *certHost = NULL;
Char *certHash = NULL;
Char *certData = NULL;
cert = X509_STORE_CTX_get_current_cert(store);
if (cert == NULL)
log() << " ERROR! Failed to get certificate.n";
goto VerifyCertificateError;
}
certDepth = X509_STORE_CTX_get_error_depth(store);
certErr = X509_STORE_CTX_get_error(store);
ssl = (SSL *) X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx());
if (ssl == NULL)
{
log() << ERROR! Failed to get SSL context from store context.n";
goto VerifyCertificateError;
}
if (preverify == 0)
{
//
// Self signed certificate allowed, SSH host auth style.
//
if (certErr == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT)
{
log() << " Certificate preverify failed on self";
return 1;
}
else if (certErr == X509_V_ERR_CERT_NOT_YET_VALID)
{
log() << Allowing not yet valid certificate.n";
return 1;
}
else if (certErr == X509_V_ERR_CERT_HAS_EXPIRED)
{
log() << " Allowing expired certificate.n";
return 1;
}
else if(certErr == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT)
{
log()<<" Unable to get issuer cert.n"
return 1;
}
if (certDepth == 0)
{
if (parseCertificate(store, certHost, certHash, certData) == 0)
{
log() << "Encryptable: ERROR! Failed to parse certificate.n";
goto VerifyCertificateError;
}
goto VerifyCertificateError;
}
if (authCallback_(certHost, certHash, certData, certCallback_,
callbackParameter_) == 0)
{
log() << " ERROR! Failed to authorize "
<< "the server certificate.n";
goto VerifyCertificateError;
if (certData != NULL)
{
delete [] certData;
}
return 0;
}
中间证书由OpenSSL检查,您无需执行任何特殊操作。答案是肯定的
- 您
- 仍然必须指定您的信任锚(您确实这样做了)
- 对等方必须在握手中提供中间证书
您不需要verify_callback因为默认回调已经执行了验证,即它检查整个信任链,包括中间证书。如果您仍然使用一个,preverify
包含 OpenSSL 已经执行的检查的结果,您的验证回调应该只返回此值,除非您有需要验证行为不同的特定情况。
相关文章:
- 2D数组来自文本输入,中间有空格
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 递归形成字符串中所有数字字符的中间和?
- 链表错误的中间
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- 如何输入数组的元素,每次获得新元素时,我们将其放在数组的中间?
- 查找中间两个数字的正则表达式的匹配项
- 我可以擦除 std::queue 中间的节点吗?
- 如何在标准c ++中流式传输/读取二进制文件的中间部分并写入另一个文件?
- 如何在 FOR 语句中间阻止 Visual Studio 2017 c++ 自动完成)?
- 给定类型的模板化中间数组
- 如何在文本文件中间插入字符
- 如何组合一个宽字符字符串,中间插入一些空字符
- 如何以编程方式从PKCS7中提取CA、多个CA和公共证书/密钥
- C++:我可以重用/移动 std::list 元素从中间到结尾吗?
- 尝试删除链表的头部或中间节点时出错
- 无法使用 Openvino 中间表示文件转发() 网络,但可以使用我正在制作 IR 的 ONNX 文件
- 如何让正则表达式匹配句子中间?
- 如何验证中间 CA