mbedTLS中验证服务器证书

21 篇文章 1 订阅

验证服务器证书

 mbedtls_printf( "  . Verifying peer X.509 certificate..." );

    /* In real life, we probably want to bail out when ret != 0 */
    if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 )
    {
        char vrfy_buf[512];

        mbedtls_printf( " failed\n" );

        mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), "  ! ", flags );

        mbedtls_printf( "%s\n", vrfy_buf );
    }
    else
        mbedtls_printf( " ok\n" );

获取验证结果

uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )
{
    if( ssl->session != NULL )
        return( ssl->session->verify_result );

    if( ssl->session_negotiate != NULL )
        return( ssl->session_negotiate->verify_result );

    return( 0xFFFFFFFF );
}

证书信息验证

int mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix,
                          uint32_t flags )
{
    int ret;
    const struct x509_crt_verify_string *cur;
    char *p = buf;
    size_t n = size;

    for( cur = x509_crt_verify_strings; cur->string != NULL ; cur++ )
    {
        if( ( flags & cur->code ) == 0 )
            continue;

        ret = mbedtls_snprintf( p, n, "%s%s\n", prefix, cur->string );
        MBEDTLS_X509_SAFE_SNPRINTF;
        flags ^= cur->code;
    }

    if( flags != 0 )
    {
        ret = mbedtls_snprintf( p, n, "%sUnknown reason "
                                       "(this should not happen)\n", prefix );
        MBEDTLS_X509_SAFE_SNPRINTF;
    }

    return( (int) ( size - n ) );
}


要在mbedTLS进行数字证书交换,需要以下步骤: 1. 生成RSA密钥对 使用mbedtls_pk_context结构体可以生成RSA密钥对,以下是一个简单的示例: ``` mbedtls_pk_context pk; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_entropy_context entropy; const char* pers = "gen_key"; // 初始化随机数生成器 mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); if (mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char*)pers, strlen(pers)) != 0) { // 错误处理 } // 生成RSA密钥对 if (mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA)) != 0) { // 错误处理 } if (mbedtls_rsa_gen_key(mbedtls_pk_rsa(pk), mbedtls_ctr_drbg_random, &ctr_drbg, 2048, 65537) != 0) { // 错误处理 } ``` 2. 生成自签名数字证书 使用mbedtls_x509write_cert结构体可以生成自签名数字证书,以下是一个简单的示例: ``` mbedtls_x509write_cert crt; mbedtls_x509write_crt_init(&crt); // 设置证书版本号 mbedtls_x509write_crt_set_version(&crt, MBEDTLS_X509_CRT_VERSION_3); // 设置证书序列号 mbedtls_x509write_crt_set_serial(&crt, serial, sizeof(serial)); // 设置证书签名算法 mbedtls_x509write_crt_set_md_alg(&crt, MBEDTLS_MD_SHA256); // 设置证书有效期 mbedtls_x509write_crt_set_validity(&crt, "20210101000000", "20301231235959"); // 设置证书主题 mbedtls_x509write_crt_set_subject_name(&crt, "CN=MySelf"); // 设置证书颁发者 mbedtls_x509write_crt_set_issuer_name(&crt, "CN=MySelf"); // 设置证书公钥 mbedtls_x509write_crt_set_subject_key(&crt, &pk); // 生成证书 if (mbedtls_x509write_crt_der(&crt, buf, buf_size, mbedtls_ctr_drbg_random, &ctr_drbg) < 0) { // 错误处理 } mbedtls_x509write_crt_free(&crt); ``` 3. 导入数字证书 使用mbedtls_x509_crt结构体可以导入数字证书,以下是一个简单的示例: ``` mbedtls_x509_crt cert; mbedtls_x509_crt_init(&cert); // 导入数字证书 if (mbedtls_x509_crt_parse(&cert, cert_buf, cert_size) != 0) { // 错误处理 } ``` 4. 进行证书交换 使用mbedtls_ssl_context结构体可以进行SSL/TLS连接,以下是一个简单的示例: ``` mbedtls_ssl_context ssl; mbedtls_ssl_init(&ssl); // 设置SSL/TLS连接参数 if (mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT) != 0) { // 错误处理 } mbedtls_ssl_conf_ca_chain(&conf, &cert, NULL); if (mbedtls_ssl_conf_own_cert(&conf, &cert, &pk) != 0) { // 错误处理 } mbedtls_ssl_setup(&ssl, &conf); // 连接服务器 if (mbedtls_ssl_set_hostname(&ssl, hostname) != 0) { // 错误处理 } mbedtls_ssl_set_bio(&ssl, &net_ctx, mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout); while ((ret = mbedtls_ssl_handshake(&ssl)) != 0) { // 处理握手过程 } ``` 这个示例mbedtls_x509_crt_parse函数用于导入服务器端的数字证书mbedtls_ssl_conf_ca_chain函数用于设置服务器证书的链,mbedtls_ssl_conf_own_cert函数用于设置客户端证书mbedtls_ssl_handshake函数用于进行SSL/TLS握手过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值