C++ Boost asio (OpenSSL) 获取活动连接的密码和 TLS/SSL 版本

Posted

技术标签:

【中文标题】C++ Boost asio (OpenSSL) 获取活动连接的密码和 TLS/SSL 版本【英文标题】:C++ Boost asio (OpenSSL) get cipher and TLS/SSL version of active connection 【发布时间】:2016-12-31 17:25:46 【问题描述】:

我们使用Boost asio 进行了一些 SSL 通信。连接和通信工作正常,但现在我们想显示实际的TLS 版本和连接使用的密码。

我们用于SSL 连接的Boost asio 对象定义如下:

typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
boost::shared_ptr<ssl_socket>   m_psslsocket;
boost::asio::ssl::context* m_pcontext;

看起来 Boost asio 并没有真正的接口来在设置密码后查询连接。

我可以通过调用这个来获得 OpenSSL SSL_CTX* 指针:

SSL_CTX* ctx = pContext->impl(); 

或调用 OpenSSL SSL*:

m_psslsocket->native_handle()

但从 OpenSSL 文档中,我无法弄清楚如何从中获取使用的密码和 TLS 版本。

【问题讨论】:

密码在SSL* 上可用,而不是SSL_CTX*。见SSL_CIPHER_get_name 和朋友们。 是的,这似乎可行,谢谢。现在我只需要找出使用的 TLS/SSL 版本。 【参考方案1】:

OpenSSL 文档says:

SSL_client_version() 在发起连接时返回客户端在 ClientHello 的 legacy_version 字段中通告的数字协议版本。请注意,对于 TLS,即使随后协商了 TLSv1.3,此值也永远不会指示高于 TLSv1.2 的版本。 SSL_get_version() 返回用于连接的协议名称。 SSL_version() 返回用于连接的数字协议版本。仅应在初始握手完成后调用它们。在此之前,这些函数返回的结果可能不可靠。

所以答案是:

SSL_get_version(SSL*)

【讨论】:

以上是关于C++ Boost asio (OpenSSL) 获取活动连接的密码和 TLS/SSL 版本的主要内容,如果未能解决你的问题,请参考以下文章

提升 Asio 和 OpenSSL 1.1.0

C++ Boost ASIO:如何读取/写入超时?

是啥导致了 boost C++ asio 中的 asio.misc.3 错误

C++ 提升 asio 多线程

Boost.Asio c++ 网络编程翻译

C++ Boost.Asio - tcp 套接字异步写入