【发布时间】:2016-01-04 20:20:11
【问题描述】:
我想使用 OpenSSL 来处理我们所有的 SSL 通信(客户端和服务器端)。我们希望使用硬件加速卡来卸载繁重的加密计算。
我们注意到,在 OpenSSL“速度”测试中,直接调用了加密函数(例如 RSA_sign/decrypt 等)。为了充分利用硬件容量,需要多个线程(最多 128 个线程)来加载卡的请求并确保硬件卡永远不会空闲。
我们希望使用高级 OpenSSL API 来处理 SSL 连接(例如 SSL_connect/read/write/accept),但此 API 不会公开实际加密操作完成的点。例如,当调用SSL_connect 时,我们不知道 RSA 操作完成的时间点,并且我们事先不知道哪些调用会导致繁重的密码计算,并且只将这些调用提交给加速器。
问题:
- 如何在充分利用硬件加速器的同时使用高级 API?我应该使用多个线程吗?
- 是否有“标准”方式来执行此操作? (实现示例)
- (在更新中回答)您熟悉英特尔的asynchronous OpenSSL 吗?似乎他们试图解决这个确切的问题,但我们找不到实际的代码或使用示例。
更新
-
从Accelerating OpenSSL* Using Intel® QuickAssist Technology 你可以看到,英特尔还提到了多线程/进程的使用:
OpenSSL 的标准版本本质上是串行的,这意味着它 在一个上下文中处理一个连接。从的角度来看 加密操作,发布是基于同步/ 阻塞编程模型。一个主要的限制是吞吐量可以 仅通过添加更多线程(即进程)来扩大规模 核心并行化的优势,但这也会增加上下文 管理开销。
-
英特尔的 OpenSSL 分支终于找到了here。 更多信息可以在包含here的pdf中找到。
看起来英特尔改变了 OpenSSL ENGINE 的工作方式 - 它将工作发布到驱动程序并立即返回,而相应的结果应该被轮询。
如果您使用其他 SSL 加速器,则相应的 OpenSSL ENGINE 也应进行修改。
【问题讨论】:
-
部分重复(但您还有其他问题):EVP Interface with AES-NI support 和 How can I check if OpenSSL is support/use the Intel AES-NI?。它适用于所有硬件和加速,而不仅仅是 AES-NI。
-
@jww 感谢您的回答。只是为了澄清我的问题:我想使用高级 API(例如 SSL_read())。这段代码可以在没有我控制的情况下完成握手,我想避免这种情况。我想确切地知道何时将进行代价高昂的操作,以便我可以将其引用到单独的线程(这样我就不会阻塞它)
-
@jww 另外,您所说的加速类型是在 CPU 中完成的。在我的例子中,加速是通过将加密工作从 CPU 卸载到协处理器来实现的。这涉及将数据传递给适当的驱动程序(可能由
ioctl()),这涉及上下文切换。 -
第二个问题(安全协处理器),需要实现一个OpenSSL Engine;有关详细信息,请参阅
engine(3)。然后,EVP 将执行卸载。 -
AFAIK,恐怕你不能简单地将代价高昂的操作(假设这里的 RSA 计算)引用到一个单独的线程并继续而不阻塞。您需要等待握手完成,然后才能真正使用 SSL/TLS 通道(即 openssl BIO)。可能您所需要的只是使用引擎。如果您想测量 100% 的硬件利用率,请同时运行多个
openssl speed进程(如果可能)。
标签: multithreading performance ssl openssl hardware-acceleration