1.客户端
/* 客户端不验证服务器证书, 但是服务器必须提供证书*/
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
/* 客户端验证服务器证书 */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|, NULL);
2.服务器
/* 服务器不验证客户端证书, 客户端可以不提供证书*/
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
/* 服务器验证客户端证书 */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|, NULL);
/* SSL_VERIFY_FAIL_IF_NO_PEER_CERT只能用于服务端,且必须搭配SSL_VERIFY_PEER使用 */
/* 客户端必须提供证书 */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
对于三级证书链,tls双向认证
1.服务器
#define SERVER_CERT "third_cert/server.crt"
#define SERVER_KEY "third_cert/ca.key"
#define SERVER_CA_CERT "third_cert/ca.crt"
/* 加载服务器证书 */
ret_err = SSL_CTX_use_certificate_file(ctx, SERVER_CA_CERT, SSL_FILETYPE_PEM);
if (ret_err <= 0)
{
ERR_print_errors_fp(stderr);
fprintf(stderr, "SSL_CTX_use_certificate_file failed!\n");
return NULL;
}
/* 加载证书链 */
ret_err = SSL_CTX_use_certificate_chain_file(ctx, SERVER_CA_CERT);
if (ret_err <= 0)
{
ERR_print_errors_fp(stderr);
fprintf(stderr, "SSL_CTX_use_certificate_chain_file failed!\n");
return NULL;
}
/* 加载服务器密钥 */
ret_err = SSL_CTX_use_PrivateKey_file(ctx, SERVER_KEY, SSL_FILETYPE_PEM);
if (ret_err <= 0)
{
ERR_print_errors_fp(stderr);
fprintf(stderr, "SSL_CTX_use_PrivateKey_file failed!\n");
return NULL;
}
/* 检查私钥与证书是否匹配 */
if (!SSL_CTX_check_private_key(ctx))
{
ERR_print_errors_fp(stderr);
fprintf(stderr, "SSL_CTX_check_private_key failed!\n");
return NULL;
}
if(1 == verify_client) /* 双向认证 */
{
/* 加载根证书 */
ret_err = SSL_CTX_load_verify_locations(ctx, SERVER_CA_CERT, NULL);
if (ret_err <= 0)
{
ERR_print_errors_fp(stderr);
fprintf(stderr, "SSL_CTX_load_verify_locations failed!\n");
return NULL;
}
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback);
SSL_CTX_set_verify_depth(ctx, 2);
}
else /* 单向认证 */
{
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
}
2.客户端
#define CLIENT_S_CERT "third_cert/client.crt"
#define CLIENT_S_KEY "third_cert/ca.key"
#define CLIENT_CA_CERT "third_cert/ca.crt"
#if 1
if(SSL_CTX_use_certificate_chain_file(ctx, CLIENT_CA_CERT) <= 0)
{
ERR_print_errors_fp(stderr);
goto err_proc;
}
#endif
/* 加载服务端证书 */
if(SSL_CTX_use_certificate_file(ctx, CLIENT_CA_CERT, SSL_FILETYPE_PEM) <= 0)
{
ERR_print_errors_fp(stderr);
goto err_proc;
}
/* 加载服务端密钥 */
if(SSL_CTX_use_PrivateKey_file(ctx, CLIENT_S_KEY, SSL_FILETYPE_PEM) <= 0)
{
ERR_print_errors_fp(stderr);
goto err_proc;
}
#if 1
/* 加载根证书 */
if(!SSL_CTX_load_verify_locations(ctx, CLIENT_CA_CERT, NULL))
{
ERR_print_errors_fp(stderr);
goto err_proc;
}
#endif
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);