我试图编写一个c代码来使用openssl实现一个tls套接字。服务器有一个包含4个证书的证书链:叶证书- intermediate1证书、-intermediate2证书-根证书i,按顺序排列:
SSL_library_init()
SSL_load_error_strings()
OpenSSL_add_ssl_algorithms()当ctx配置为:
SSL_ctx_set_cipher_list()
SSL_ctx_use_certificate_chain("",pem)
SSL_ctx_use_certificate_file("",pem) (1)
SSL_ctx_use_PrivateKey(".key",pem)我得到错误“未知ca”,这是猜测,因为调用SSL_ctx_use_certificate_file放弃了SL_ctx_use_certificate_chain,因此,客户端无法验证服务器证书。当ctx配置为:
SSL_ctx_set_cipher_list()
SSL_ctx_use_certificate_chain("",pem) (2)
SSL_ctx_use_PrivateKey(".key",pem)我得到了一个证书-密钥错配错误。我用以下方法组成了链:
cat server.pem intermediate1.pem intermediate2.pem > chain.pem所以我没有将根证书包含在链中,因为客户机已经拥有它了。我希望(2)能够工作,因为私钥是与位于链顶端的server.pem证书对应的密钥。
-How应该在c代码中包含链,但不能获得密钥证书。错配错误?我找到了一个函数:
SSL_CTX_add_extra_chain_cert()但我不知道怎么用它。这个函数的第二个参数是X 509*,所以我应该如何加载并输入到这个函数中。-Is在openssl中有一个函数从内存中加载证书?请注意,我的证书都是pem格式的,这个X509使我感到困惑,因为我对证书并不十分熟悉。数据类型。我需要使用-Do
SSL_CTX_load_verify_locations()如果我不要求客户端提供它的证书,则在服务器端运行?
编辑:
SSL *ssl;
SSL_CTX *ctx;
void configure_context(SSL_CTX *ctx)
{
if(SSL_CTX_set_cipher_list(ctx,CIPHER_LIST) <= 0)
{
ERR_print_errors_fp(stderr);
}
if(SSL_CTX_use_certificate_chain_file(ctx,"/var/lib/certs/chain.pem") <= 0)
{
ERR_print_errors_fp(stderr);
}
if (SSL_CTX_use_PrivateKey_file(ctx, "/var/lib/certs/private.key", X509_FILETYPE_PEM) <= 0 ) {
ERR_print_errors_fp(stderr);
}
}
bool sslAcceptSocket()
{
SSL_library_init();
init_openssl();
ctx = create_context();
configure_context(ctx);
ssl = SSL_new(ctx);
SSL_set_fd(ssl, acceptedSocket);
static int err = 0;
err = SSL_accept(ssl);
if(err < 1)
{
DEBUG_PRINT("SSL Error: %d\n",err);
ERR_print_errors_fp(stderr);
return false;
}
return true;
}acceptedSocket是TCP套接字,工作正常。但是,我在tls部分中得到了键证书不匹配错误。顶替
SSL_CTX_use_certificate_chain_file(ctx,"/var/lib/certs/chain.pem")使用
SSL_CTX_use_certificate_file(ctx,"/var/lib/certs/leaf.pem")解决了钥匙证书。错配问题,但我得到“未知的ca”错误(如预期)。
发布于 2022-04-29 11:03:40
问题在于证书和密钥,所以问题的“编辑”部分中的代码实际上与正确的证书一起工作。
https://stackoverflow.com/questions/71984092
复制相似问题