我正在使用 pion 网络库编写 HTTP(s) 服务器,pion 是 boost::asio 的包装器。我需要服务器支持 HTTP 和 HTTPS,HTTP 完成:
#include "pion/http/server.hpp"
#include "pion/http/response_writer.hpp"
using namespace pion;
using namespace pion::http;
struct fake_server {
void start() {
m_server = pion::http::server_ptr(new pion::http::server(80));
m_server->add_resource("/", boost::bind(&fake_server::handle_request, this, _1, _2));
m_server->start();
}
void handle_request(http::request_ptr& _httpRequest, tcp::connection_ptr& _tcpConn) {
http::response_writer_ptr writer(
http::response_writer::create(
_tcpConn,
*_httpRequest,
boost::bind(&tcp::connection::finish, _tcpConn)));
http::response& r = writer->get_response();
writer->write("hello world");
writer->send();
}
pion::http::server_ptr m_server;
};
int main() {
fake_server svr;
svr.start();
while(1) {
Sleep(0);
}
}
但我不知道如何处理 HTTPS,我尝试将端口设置为 443,并将 ssl 标志设置为:
void start() {
m_server = pion::http::server_ptr(new pion::http::server(443)); // 443
m_server->set_ssl_flag(true); // ssl flag
m_server->add_resource("/", boost::bind(&fake_server::handle_request, this, _1, _2));
m_server->start();
}
它不起作用,我得到一个错误“没有共享密码”,我用谷歌搜索了这个错误并找到了一些使用 openssl 生成证书对然后将这些证书对加载到服务器/客户端,但我的客户端应用程序是网络浏览器,浏览器不会使用这些生成的证书。
有什么想法吗?
谢谢。
最佳答案
您需要提供服务器将用于协商安全连接的 SSL 证书和 key 。这将通过以下方式完成:
m_server->set_ssl_key_file(pem_filename);
其中 pem_filename
是包含 SSL 证书和 key 的 PEM 格式文件的名称。 key 不得加密。有许多 Internet 教程可以告诉您如何创建自签名证书(如果您还没有来自受信任的证书颁发机构的证书)。如果您的 key 和证书位于不同的文件中,则只需将它们连接成一个文件即可。
客户端不需要预先配置证书/ key (在这种情况下),但请注意,使用自签名证书(或任何未经受信任的证书颁发机构签名的证书)将在大多数 Web 上生成安全警告浏览器。
关于c++ - 使用 boost::asio(pion 库)的 https 服务器提示 "no shared cipher",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343105/