c++ 使用TLS实现https

参考博客

c++https 双向认证以及证书生成
证书生成注意事项

注意

  • 由于在项目中客户端为了实现跨平台使用 libcurl 进行 http 数据包的发送和接收,再实现 https 进行测试时使用自己生成 CA 证书的方式进行验证服务端和客户端的合法性,在生成服务端证书时需要将 CN 选项改为自己服务器的域名或者是 ip 否则 curl 在进行证书的验证时将会报服务器的 ip 与证书中的不一致;

  • libcurl 当 POST的数据大于1024字节的时候,http默认添加请求头Expect: 100-continue,客户端要先验证服务端是否愿意接收数据,如果服务器返回的响应头信息中包含Expect: 100-continue,则表示 Server 愿意接受数据,这时才 POST 真正数据给 Server;解决办法可以是将 Expect 的值设为空, headers = curl_slist_append(headers, "Expect:")

  • 建立 ssl 连接时如果将文件描述符设为非阻塞的使用 SSL_do_handshake(m_ssl) 代替 SSL_accept() 和 SSL_connect(); 在服务端在调用SSL_do_handshake() 前要先调用 SSL_set_accept_state(), 客户端要先调用 SSL_set_connect_state();

服务端连接代码示例
        m_ssl = SSL_new(*ctx);
	if (m_ssl == nullptr)
	{
		std::cout << "m_ssl new fail" << std::endl;
	}
	SSL_set_fd(m_ssl, m_socketFd);
	SSL_set_accept_state(m_ssl);
	int ret = 0;
	do {
		ret = SSL_do_handshake(m_ssl);	//由于使用了非阻塞io所以使用这个接口
		std::cout << "ret:" << ret << std::endl;
	} while (ret != 1);
	
	
	// SSL_get_verify_result()是重点,SSL_CTX_set_verify()只是配置启不启用并没有执行认证,调用该函数才会真证进行证书认证
	// 如果验证不通过,那么程序抛出异常中止连接
	if (SSL_get_verify_result(m_ssl) == X509_V_OK) {
		m_logger->WriteLog(LOG_LEVEL_INFO, __FILE__, __FUNCTION__, __LINE__, (char *)"证书验证通过");
	}
	else
	{
		m_logger->WriteLog(LOG_LEVEL_INFO, __FILE__, __FUNCTION__, __LINE__, (char*)"证书验证失败");
	}
posted @   wangzqzero  阅读(989)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示