如何使用openssl进行TLS 1.3 PSK?

时间:2019-11-05 21:17:14

标签: ssl openssl

我正在开发客户端/服务器软件,并试图弄清楚如何使用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);
  1. 我的理解是,在TLS1.3中,Identity Hint为NULL,那么为什么这些TLS1.3特定的回调在其中包含标识字段?
  2. 在某处看到TLS 1.3具有不同的密码套件,PSK AES256和PSK CHACHA20的名称分别是什么
  3. 在我的情况下,服务器将仅接受一个连接,即P2P数据链路。我是否还必须让一方充当服务器,即使用find_session_cb而不是use_session_cb?

2 个答案:

答案 0 :(得分:2)

  

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

您可以在这里查看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

答案 1 :(得分:0)

我希望您的意思是使用TLSv1.3在外部建立的PSK(带外PSK密钥和ID)。为此,您可以直接使用旧的回调psk_client_callbackpsk_server_callback。通过这些回调,默认情况下将使用AES_128_GCM_WITH_SHA256密码套件。

client中的TLSv1.3 PSK serverrepo示例

ClientHello消息在此处发送带有PSK_ID的pre_shared_key扩展名。 ServerHello的扩展名是pre_shared_key,选择的PSK_ID索引为0。

enter image description here

enter image description here

如果需要使用其他密码套件,则需要使用psk_use_session_cbpsk_find_session_cb