c++ 使用TLS实现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*)"证书验证失败");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话