证书认证方式 SSL_CTX_set_verify

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);

你可能感兴趣的:(证书认证方式 SSL_CTX_set_verify)