我正在开发客户端/服务器软件,并试图弄清楚如何使用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);
答案 0 :(得分:2)
有人可以提供有关如何在这些回调中返回信息的示例代码吗?
您可以在这里查看s_client的工作方式:
这是s_server的工作方式:
我的理解是,在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_callback
和psk_server_callback
。通过这些回调,默认情况下将使用AES_128_GCM_WITH_SHA256
密码套件。
此client中的TLSv1.3 PSK server,repo示例
ClientHello
消息在此处发送带有PSK_ID的pre_shared_key
扩展名。 ServerHello
的扩展名是pre_shared_key
,选择的PSK_ID索引为0。
如果需要使用其他密码套件,则需要使用psk_use_session_cb
和psk_find_session_cb
。