asio ssl 笔记

Asio 包含了一个类以及类模板用于基本的SSL支持。这个类使得加密通信成为可能。在已经存在的流上层做了一层加密,比如加密一个TCP套接字。在创建一个加密流之前,必须要构造一个SSL context 对象,这个对象用于设置SSL选项(认证模式,认证文件等),下面用一个客户端的初始化作为说明:

ssl::context ctx(ssl::context::sslv23);
ctx.set_verify_mode(ssl::verify_peer);
ctx.load_verify_file("ca.pem");

// 如果要使用一个TCP套接字,如下操作:
ssl::stream ssl_sock(my_io_service, ctx);

// 如果要使用一个指定的套接字操作。
// 例如创建一个对外的链接或者接收一个进入的链接。
// 必须首先使用ssl::stream 模板的lowest_layer()成员函数来获得一个底层套接字:

ip::tcp::socket::lowest_layer_type& sock = ssl_sock.lowest_layer();
sock.connect(my_endpoint);

// 在有些例子中,底层流对象可能需要一个比ssl流更长的生存周期,在这种情况下,模板参数应该是一个流的引用:

ip::tcp::socket sock(my_io_service);
ssl::stream ssl_sock(sock, ctx);

// 在通过加密链接收发数据之前,SSL的握手动作应该首先完成。通过使用ssl::stream 模板提供的 handshake() / async_handshake()成员函数。
// 一旦链接建立了,SSL流对象可以使用同步或异步的read/write进行流的读写操作,可以使用read(),async_read(),write(),async_write(),read_until(),async_read_until()等函数。

// 证书认证:
// Boost.Asio 提供了多种方法设置SSL证书认证的加密方式:

ssl::context::set_default_verify_paths()
ssl::context::set_verify_mode()
ssl::context::set_verify_callback()
ssl::context::load_verify_file()
ssl::stream::set_verify_mode()
ssl::stream::set_verify_callback()

// 按照RFC2818(HTTPS 证书认证) 规则,Boost.Asio提供了一个复用认证回调函数作为一个函数对象(ssl::rfc2818_verification),下面的例子演示了一个远程主机使用HTTPS按照这个规则的证书认证过程:

using boost::asio::ip::tcp;
namespace ssl = boost::asio::ssl;
typedef ssl::stream ssl_socket;

// Create a context that uses the default paths for
// finding CA certificates.
ssl::context ctx(ssl::context::sslv23);
ctx.set_default_verify_paths();

// Open a socket and connect it to the remote host.
boost::asio::io_service io_service;
ssl_socket sock(io_service, ctx);
tcp::resolver resolver(io_service);
tcp::resolver::query query("host.name", "https");
boost::asio::connect(sock.lowest_layer(), resolver.resolve(query));
sock.lowest_layer().set_option(tcp::no_delay(true));

// Perform SSL handshake and verify the remote host's
// certificate.
sock.set_verify_mode(ssl::verify_peer);
sock.set_verify_callback(ssl::rfc2818_verification("host.name"));
sock.handshake(ssl_socket::client);

// ... read and write as normal ...

// SSL和线程
// SSL流对象不会自己对自己进行锁定,因此,所有的异步SSL操作需要在一个线程中强制顺序执行,这也就意味着在单线程程序中不需要考虑同步操作的问题。

// 特别注意:
// 如果要使用Boost.Asio中的SSL的支持,OpenSSL也是必须要支持的。当一个程序需要使用底层OpenSSL提供的接口,而并不是要使用Boost.Asio封装后的SSL接口时,可以通过调用 ssl::context::native_handle() 或者 ssl::stream::native_handle()取得底层OpenSSL。
### 使用 ASIOSSL 构建服务端 为了构建支持SSL的服务端程序,需要引入`asio::ssl`命名空间下的类来处理加密传输。下面是一个简单的例子展示如何设置一个HTTPS服务器[^1]。 ```cpp #include <iostream> #include <boost/asio.hpp> #include <boost/asio/ssl.hpp> using boost::asio::ip::tcp; namespace ssl = boost::asio::ssl; int main() { try { // 创建io_context对象和context对象用于管理SSL协议版本以及加载证书文件. boost::asio::io_context io_context; ssl::context ctx(ssl::context::sslv23); // 加载本地私钥和认证书到ctx中以便验证身份给客户端. ctx.set_options( ssl::context::default_workarounds | ssl::context::no_sslv2 | ssl::context::single_dh_use); ctx.use_certificate_chain_file("server.pem"); ctx.use_private_key_file("server.key", ssl::context::pem); tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 3333)); while (true) { std::cout << "Waiting for new connection..." << std::endl; // 接受新的连接并将其封装成ssl socket. tcp::socket socket(io_context); acceptor.accept(socket); std::cout << "Connection accepted." << std::endl; ssl::stream<tcp::socket> ssl_socket(std::move(socket), ctx); ssl_socket.handshake(ssl::stream_base::server); char data[1024]; boost::system::error_code error; size_t length = ssl_socket.read_some(boost::asio::buffer(data), error); if (!error) { std::string message(data, length); std::cout << "Received: " << message << std::endl; // 发送响应消息回客户端. const std::string reply = "Message received."; boost::asio::write(ssl_socket, boost::asio::buffer(reply.c_str(), reply.size())); } else { std::cerr << "Error during handshake or read operation!" << std::endl; } ssl_socket.shutdown(); } } catch (std::exception& e) { std::cerr << "Exception occurred! Error Message: " << e.what() << '\n'; } return 0; } ``` 此代码片段展示了基本的ASIO SSL服务器实现方式,其中包含了创建安全套接字、执行握手过程、读取来自客户的输入以及发送回复等功能。 编译上述源码时需链接必要的库: ```bash g++ -o secure_server server.cpp -lboost_system -lboost_thread -lpthread -lssl -lcrypto ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值