asio ssl 笔记

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

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。
































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222485.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:41
下一篇 2026年3月17日 下午3:42


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号