3

我曾经使用Botan::TLS::Callbacks并且也是Botan::TLS::Client Botan::TLS::Server为了在客户端和服务器之间获得安全通道。此外,为了加密-解密我使用过的数据<botan/pubkeys.h> <botan/pk_keys.h>以及 Botan 库中的其他包含头文件。

我的问题是:

  1. 为什么对象没有在 Server_Hello_Message 中将Botan::PK_Encryptor_EME双方协商的加密算法作为密码套件获得。他们只需将公钥、随机数生成器和最佳加密填充算法作为输入。提到该算法没有被明显和真实的密钥所采用(通过该算法,我的意思是批量加密算法,如AES-128)。

  2. 如何保护 tls 通道?正如我通过源代码发现的那样,有一个函数Botan::TLS::Callbacks tls_emit_data(const uint8_t[], size_t)将通过安全通道发送数据!即使客户端和服务器之前已经协商和交换了非对称密钥,也应该使用双方同意的对称密钥对数据进行加密。

4

1 回答 1

2

/类实现 TLS 协议操作Botan::TLS::ClientBotan::TLS::Server具体来说,他们为您处理加密操作。但是,他们对传输层一无所知,例如从套接字读取/写入。这部分必须由您实施。

在一个典型的实现中,在建立连接之后,你会调用client.send(buf, len)一些你想发送到服务器的数据。客户端在内部构建 TLS 记录并调用您的tls_emit_data回调以将它们发送到传输层,因此您可以将其写入某个套接字。在服务器端,您将侦听套接字并读取此 TLS 记录。然后,您会将其传递给server.received_data(buf, len). tls_record_received服务器在内部从 TLS 记录中提取实际数据,并通过回调将其提供给您。

更多细节可以在Botan API 文档中找到。

关于你的问题:

  1. 我不确定你的意思是代码的哪一部分。PK_Encryptor_EME我可以在 Botan tls 模块中找到的唯一用法是客户端密钥交换期间。密钥交换不涉及使用用于传输数据的分组密码进行加密。这发生在例如这里

  2. tls_emit_data将由客户端/服务器在构建 TLS 记录时调用。加密已在内部处理,您只需将 TLS 记录传递给传输层。

示例实现

Botan 包含一个基本 TLS 客户端/服务器的示例实现:tls_servertls_client

这可以通过 Botan 命令行界面进行测试:

  • 生成 CA 证书:
$ mkdir certdir
$ botan keygen > ca_key.pem
$ botan gen_self_signed --ca ca_key.pem my_root_authority > certdir/ca_cert.pem
  • 生成服务器证书:
$ botan keygen > server_key.pem
$ botan gen_pkcs10 server_key.pem localhost > server_csr.pem
$ botan sign_cert certdir/ca_cert.pem ca_key.pem server_csr.pem > server_cert.pem
  • 启动 TLS 服务器(可能需要特权用户):
# botan tls_server server_cert.pem server_key.pem
  • 启动 TLS 客户端:
$ botan tls_client localhost --trusted-cas=certdir
Certificate validation status: Verified
Handshake complete, TLS v1.2 using CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256
Session ID ...

示例代码中的一些兴趣点:

  • 这里Botan::TLS::Client创建,在这里创建。Botan::TLS::Server
  • Botan::TLS::Policy可用于限制例如可以使用哪些 TLS 版本和密码模式:链接
  • 客户端从这里的标准输入获取数据。它在内部构造 TLS 记录并将它们传递给tls_emit_data回调,此处定义用于将 TLS 记录写入套接字。
  • TLS 记录是从套接字中读取的,并在此处传递给服务器。
  • 服务器在内部从 TLS 记录中提取数据并将其传递到tls_record_received 此处
于 2019-08-20T15:24:13.227 回答