我正在开发客户端/服务器软件,并试图弄清楚如何使用openssl设置TLS 1.3 PSK连接。显然,与TLS 1.2(及更低版本)相比,回调有所不同,但是openssl文档令人恐惧,我无法真正理解全部流程。

有人可以提供有关如何在这些回调中返回信息的示例代码吗?

int SSL_psk_use_session_cb_func(SSL *ssl, const EVP_MD *md,const unsigned char **id,size_t *idlen,SSL_SESSION **sess);

int (*SSL_psk_find_session_cb_func)(SSL *ssl,const unsigned char *identity,size_t identity_len,SSL_SESSION **sess);



我的理解是,在TLS1.3中,Identity Hint为NULL,那么为什么这些TLS1.3特定回调在其中包含标识字段?
在某处阅读到TLS 1.3具有一组不同的密码套件,PSK AES256和PSK CHACHA20的名称分别是什么?
就我而言,服务器将仅接受一个连接,即P2P数据链路。我是否还必须让一方充当服务器,即使用find_session_cb而不是use_session_cb?

最佳答案

有人可以提供有关如何在这些回调中返回信息的示例代码吗?


您可以在这里查看s_client的执行方式:

https://github.com/openssl/openssl/blob/6af1b11848f000c900877f1289a42948d415f21c/apps/s_client.c#L183-L243

这是s_server的工作方式:

https://github.com/openssl/openssl/blob/6af1b11848f000c900877f1289a42948d415f21c/apps/s_server.c#L185-L232


  我的理解是,在TLS1.3中,Identity Hint为NULL,那么为什么这些TLS1.3特定回调在其中包含标识字段?


身份提示和身份是两回事。在TLSv1.2中,服务器可以向客户端提供提示,以允许客户端为该服务器选择正确的身份。在TLSv1.3中,PSK的工作方式完全不同。客户端在第一条消息中将身份发送给服务器,因此没有机会收到提示。实际上,无论如何提示通常不是那么有用。

在PSK的上下文中,您可以将身份视为类似于用户名(实际上有点过分简化-但足以满足我们的目的)


  在某处阅读到TLS 1.3具有一组不同的密码套件,PSK AES256和PSK CHACHA20的名称分别是什么?


在TLSv1.2中,您需要使用特殊的PSK密码套件。在TLSv1.3中,情况不再如此。密码套件的工作方式大不相同,没有特殊的PSK密码套件的概念。您只需要使用普通密码套件即可。需要警惕的主要事情是,在TLSv1.3中,PSK始终与哈希关联(例如SHA256)。您使用的任何密码套件都必须与该哈希兼容,例如对于SHA256,您可以使用TLS_CHACHA20_POLY1305_SHA256或TLS_AES_128_GCM_SHA256。


  就我而言,服务器将仅接受一个连接,即P2P数据链路。我是否还必须让一方充当服务器,即使用find_session_cb而不是use_session_cb?


在TLS中,将客户端定义为发起通信的对等方,而将服务器定义为接收传入连接的对等方。因此,总是有一个客户端和一个服务器角色。因此,是的,一侧必须使用find_session_cb,而另一侧必须使用use_session_cb

10-02 22:35