ECDHE_RSA验证

本文介绍了ECDHE_RSA验证的过程,通过Wireshark捕获TLS1.2握手数据包,详细解析了Server Key Exchange阶段,展示了如何验证ECDHE_RSA密钥交换的安全性,包括公钥、签名、摘要信息的计算和对比,强调了官方文档在深入理解技术中的重要性。
摘要由CSDN通过智能技术生成

ECDHE_RSA验证

上一篇博客中对TLS1.2中对ECDHE_RSA再握手阶段的密钥协商进行了解释,但是考虑到没有实际验证,无法100%的保证理解的正确性,后来几天一直在想办法验证,今天终于验证成功,把验证过程在这里简单说一下。
首先使用wireshark对TLS1.2握手的数据包了抓取,如下图所示:
TLS1.2握手
从图中可以看到Client Hello,Server Hello,Server Key Exchange等交互过程,ECDHE_RSA主要应用在Server Key Exchange的过程中,所以我们先看下这个包的内容:
Server Key Exchange
从图中可看出,EC Diffie- Hellman 参数在这里出现,其中Pubkey就是DH密钥交换用到的参数,而Signature就是对这个Pubkey的保护,确认其来源的正确性,防止中间人攻击。

为了验证这个猜想,需要进行如下计算:

  1. 对Signature进行RSA加密(验签)得到摘要信息d1
  2. 计算Pubkey的SHA512摘要信息d2
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于mbed TLS的示例代码,实现了支持TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256的cipher suite name: ```c #include "mbedtls/config.h" #include "mbedtls/ssl.h" #include "mbedtls/entropy.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/error.h" #include "mbedtls/net.h" int main(void) { mbedtls_entropy_context entropy; mbedtls_ctr_drbg_context ctr_drbg; mbedtls_ssl_context ssl; mbedtls_ssl_config conf; mbedtls_x509_crt cacert; mbedtls_x509_crt clicert; mbedtls_pk_context pkey; const char *pers = "mbedtls_ssl_client"; mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_ssl_init(&ssl); mbedtls_ssl_config_init(&conf); mbedtls_x509_crt_init(&cacert); mbedtls_x509_crt_init(&clicert); mbedtls_pk_init(&pkey); int ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)pers, strlen(pers)); if (ret != 0) { mbedtls_printf("mbedtls_ctr_drbg_seed returned %d\n", ret); goto exit; } ret = mbedtls_x509_crt_parse_file(&cacert, "ca.crt"); if (ret != 0) { mbedtls_printf("mbedtls_x509_crt_parse_file returned %d\n", ret); goto exit; } ret = mbedtls_x509_crt_parse_file(&clicert, "client.crt"); if (ret != 0) { mbedtls_printf("mbedtls_x509_crt_parse_file returned %d\n", ret); goto exit; } ret = mbedtls_pk_parse_keyfile(&pkey, "client.key", NULL); if (ret != 0) { mbedtls_printf("mbedtls_pk_parse_keyfile returned %d\n", ret); goto exit; } ret = mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); if (ret != 0) { mbedtls_printf("mbedtls_ssl_config_defaults returned %d\n", ret); goto exit; } mbedtls_ssl_conf_cipher_suites(&conf, MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, NULL); mbedtls_ssl_conf_ca_chain(&conf, &cacert, NULL); mbedtls_ssl_conf_own_cert(&conf, &clicert, &pkey); mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg); ret = mbedtls_ssl_setup(&ssl, &conf); if (ret != 0) { mbedtls_printf("mbedtls_ssl_setup returned %d\n", ret); goto exit; } mbedtls_net_context server_fd; mbedtls_net_init(&server_fd); ret = mbedtls_net_connect(&server_fd, "localhost", "4433", MBEDTLS_NET_PROTO_TCP); if (ret != 0) { mbedtls_printf("mbedtls_net_connect returned %d\n", ret); goto exit; } mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL); ret = mbedtls_ssl_handshake(&ssl); if (ret != 0) { mbedtls_printf("mbedtls_ssl_handshake returned %d\n", ret); goto exit; } mbedtls_ssl_close_notify(&ssl); exit: mbedtls_x509_crt_free(&cacert); mbedtls_x509_crt_free(&clicert); mbedtls_pk_free(&pkey); mbedtls_ssl_free(&ssl); mbedtls_ssl_config_free(&conf); mbedtls_ctr_drbg_free(&ctr_drbg); mbedtls_entropy_free(&entropy); mbedtls_net_free(&server_fd); return ret; } ``` 在这个示例代码中,我们使用了`mbedtls_ssl_conf_cipher_suites`函数来指定了使用TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256这个cipher suite name。同时,我们还需要使用相应的证书和密钥来进行TLS连接。在示例代码中,我们假设ca.crt、client.crt和client.key文件都已经准备好了,可以通过`mbedtls_x509_crt_parse_file`和`mbedtls_pk_parse_keyfile`函数来解析这些文件。 值得注意的是,在实际使用过程中,我们需要根据具体的需求和场景来选择合适的cipher suite name,并且需要保证相应的证书和密钥的安全性。此外,我们还需要注意使用mbed TLS时的安全最佳实践,例如启用合适的加密套件、密钥长度和证书验证等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值