1

我在 google 和 bing、openssl 常见问题解答、一些 API 手册页上进行了搜索,但没有找到任何提示。

这是一个历史问题,还是一个深思熟虑的设计?

4

2 回答 2

1

将 SSL_CTX 视为制作 SSL 对象的工厂。SSL 连接仅由 SSL 对象处理。但是,它们可以有许多设置。与其每次想要一个新的 SSL 对象时都复制它,不如先创建一个包含所有设置的 SSL_CTX,然后您可以使用已经存在的这些设置创建任意数量的 SSL 对象。当然,如果您愿意,您仍然可以选择在单个 SSL 对象级别进行设置。

于 2019-04-25T08:21:11.487 回答
-1

为了补充 Matt Caswell 的回答,“工厂”设计模型背后的原因还在于服务器 POSIX 套接字的实现方式。使用服务器实现,您首先创建一个套接字并将其“绑定”到您机器上的特定端口(例如端口 443,这是 TLS 连接的标准)。从那里,它可以“监听”客户端的传入连接。然后程序重复调用accept(),它会阻塞直到有新的连接进来,并返回一个新的文件描述符,表示与该单个客户端的连接。该程序可能会将该文件描述符传递给另一个线程或执行其他操作以同时处理多个连接。

现在,如果 OpenSSL 库只有 SSL 对象而没有 SSL_CTX,那么每次服务器接受新的客户端连接时,程序都必须重新配置它想要用于该 SSL 对象的所有设置。想想每个连接都会产生的开销——必须从文件中加载服务器证书和私钥,以及配置所有可能的设置(在 OpenSSL 中有很多设置)将花费相当多的时间. 为了解决这个问题,SSL_CTX 可以加载所有这些设置,并准备好在接受新连接时传输到 SSL 对象。从本质上讲,它简化了代码并大大减少了每个连接的开销。

有关更多信息,请参阅 OpenSSL Wiki 的服务器实现 - https://wiki.openssl.org/index.php/Simple_TLS_Server

该代码不是最新版本的 OpenSSL,但它很好地传达了 SSL_CTX 的有用性。

于 2020-03-14T16:24:45.367 回答