将C++搭建的简单HTTP服务器升级为 HTTPS 服务器

devtools/2024/11/14 18:55:31/

        HTTP 协议是不加密的,容易遭受中间人攻击(MITM)。为了提高安全性,你可以将服务器升级为 HTTPS 服务器,使用 SSL/TLS 加密流量。下面是如何将以下链接文章中的 HTTP 服务器修改为 HTTPS 服务器的步骤:

ps:使用C++构建一个简单的HTTP服务器,处理请求和响应_html请求 c++服务端-CSDN博客

使用 OpenSSL 生成自签名证书

首先,你需要生成自签名证书。以下是一个简单的命令:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

这个命令会生成一个有效期为 365 天的自签名证书 (cert.pem) 和私钥文件 (key.pem)。

修改服务器代码以支持 HTTPS

接下来,修改你的服务器代码以使用 QSslSocket 和 QSslConfiguration 来支持 HTTPS。

#include <QCoreApplication>
#include <QTcpServer>
#include <QSslSocket>
#include <QDebug>
#include <QTextStream>
#include <QSslConfiguration>
#include <QSslKey>
#include <QSslCertificate>class HttpsServer : public QTcpServer {Q_OBJECTpublic:HttpsServer(QObject *parent = nullptr) : QTcpServer(parent) {// 加载证书和私钥QFile certFile("cert.pem");QFile keyFile("key.pem");if (!certFile.open(QIODevice::ReadOnly) || !keyFile.open(QIODevice::ReadOnly)) {qCritical() << "Failed to open certificate or key file.";return;}QSslCertificate certificate(&certFile, QSsl::Pem);QSslKey privateKey(&keyFile, QSsl::Rsa, QSsl::Pem);certFile.close();keyFile.close();sslConfig.setLocalCertificate(certificate);sslConfig.setPrivateKey(privateKey);sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone); // 这里设置为 VerifyNone 仅用于测试}protected:void incomingConnection(qintptr socketDescriptor) override {QSslSocket *socket = new QSslSocket(this);if (socket->setSocketDescriptor(socketDescriptor)) {socket->setSslConfiguration(sslConfig);socket->startServerEncryption();connect(socket, &QSslSocket::encrypted, this, &HttpsServer::handleConnection);connect(socket, &QSslSocket::disconnected, socket, &QSslSocket::deleteLater);} else {qWarning() << "Failed to set socket descriptor.";delete socket;}}private slots:void handleConnection() {QSslSocket *socket = qobject_cast<QSslSocket *>(sender());if (!socket) return;connect(socket, &QSslSocket::readyRead, this, &HttpsServer::handleRequest);}void handleRequest() {QSslSocket *socket = qobject_cast<QSslSocket *>(sender());if (!socket) return;QTextStream in(socket);QString request = in.readAll();qDebug() << "Received encrypted request:\n" << request;// 构建 HTTP 响应QString response = "HTTP/1.1 200 OK\r\n";response += "Content-Type: text/html; charset=UTF-8\r\n";response += "\r\n";response += "<html><body><h1>Hello, World!</h1></body></html>";// 发送响应QTextStream out(socket);out << response;socket->flush();socket->close();}private:QSslConfiguration sslConfig;
};int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);HttpsServer server;if (!server.listen(QHostAddress::Any, 443)) { // 使用 443 端口qCritical() << "Unable to start the server:" << server.errorString();return 1;}qDebug() << "Listening on port 443...";return a.exec();
}#include "main.moc"

关键修改点

  1. 使用 QSslSocket 代替 QTcpSocket

    • QSslSocket 是 QTcpSocket 的扩展,支持加密通信。
    • 在 incomingConnection 方法中,使用 QSslSocket 设置 Socket 描述符,并启动 SSL 加密。
  2. 加载证书和私钥

    • 在构造函数中加载证书 (cert.pem) 和私钥 (key.pem) 文件,并设置 SSL 配置。
    • sslConfig.setLocalCertificate 和 sslConfig.setPrivateKey 用于设置证书和私钥。
  3. 修改监听端口

    • 将监听端口从 80 修改为 443,这是 HTTPS 的标准端口。
  4. 处理加密连接

    • 在 incomingConnection 中,调用 socket->startServerEncryption() 启动加密。
    • 连接 QSslSocket::encrypted 信号到 handleConnection 槽,确保数据在加密状态下读取。

运行服务器

        确保你的证书 (cert.pem) 和私钥文件 (key.pem) 在可执行文件的同一目录下,然后编译并运行服务器服务器现在将监听 443 端口,并使用 SSL/TLS 加密流量,从而提高安全性,防止中间人攻击。


http://www.ppmy.cn/devtools/133670.html

相关文章

Python自动化测试---Appium

常用adb命令 获取界面名&#xff1a;adb shell dumpsys window windows | grep mFocusedApp 获取包名界面名&#xff1a;adb shell dumpsys activity activities 查看已连接系统&#xff1a;adb devices 连接模拟器&#xff1a;adb connect IP:端口号 python-driver命令 前置…

Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App

Android Studio 的最新版本配置要求比较高&#xff0c;这时候需要降低插件的版本&#xff0c;才能正常启动项目 build.gradle 文件的 dependencies 部分中&#xff0c;使用 libs 作为一些常用库的别名。这些别名在项目的 gradle.properties 文件或者某个特定的 versions.prope…

2024 年 8 个最佳 API 设计工具图文介绍

8 个最佳 API 设计工具推荐&#xff0c;包括 Apifox、Postman、Swagger、Insomnia、Stoplight、Hoppscotch、RapidAPI和Paw。 详细介绍&#xff1a;2024 年 8 个最佳 API 设计工具推荐

《JavaEE进阶》----20.<基于Spring图书管理系统①(登录+添加图书)>

PS&#xff1a;关于接口定义 接口定义&#xff0c;通常由服务器提供方来定义。 1.路径&#xff1a;自己定义 2.参数&#xff1a;根据需求考虑&#xff0c;我们这个接口功能完成需要哪些信息。 3.返回结果&#xff1a;考虑我们能为对方提供什么。站在对方角度考虑。 我们使用到的…

DiskGenius工具扩容Mac OS X Apple APFS分区

DiskGenius是一款功能强大的磁盘分区工具&#xff0c;它支持Windows和Mac OS X系统&#xff0c;可以用于管理硬盘分区&#xff0c;包括扩容Mac OS X的Apple APFS分区。然而&#xff0c;直接使用DiskGenius来扩容Mac OS X的APFS分区可能存在一定的风险&#xff0c;因为不是专门为…

【Docker】Docker基础及docker-compose

一、Docker下载 更新yum包 yum update 安装需要的软件包&#xff08; yum-util 提供yum-config-manager功能&#xff0c;后两个是devicemapper驱动依赖&#xff09; yum install -y yum-utils device-mapper-persistent-data lvm2 设置stable镜像仓库&#xff08;使用阿里…

vue3+vite 前端打包不缓存配置

最近遇到前端部署后浏览器得清缓存才能出现最新页面效果得问题 所以…按以下方式配置完打包就没啥问题了&#xff0c;原理很简单就是加个时间戳 /* eslint-disable no-undef */ import {defineConfig, loadEnv} from vite import path from path import createVitePlugins from…

Docker部署Nginx服务器并实现HTTPS自动重定向

背景&#xff1a;近期有个互联网项目&#xff0c;因是面向C端用户&#xff0c;从安全考虑&#xff0c;请求应该是https&#xff0c;从用户体验角度&#xff0c;应让用户输入域名&#xff0c;而不是ip:port&#xff0c;但一般浏览器都是发起HTTP请求&#xff0c;例如&#xff0c…