文档说
OpenSSL 保留一个摘要算法和密码的内部表。它使用此表通过 EVP_get_cipher_byname() 等函数查找密码。
OpenSSL_add_all_digests() 将所有摘要算法添加到表中。
我的问题是,这个表存储在哪里?我的代码如何知道该方法已执行?...它在内部如何工作?如果我想要更多 SSL 连接,其中一个连接添加了所有摘要,而另一个连接不添加,该怎么办? 有谁知道这方面有什么好的文档吗?
谢谢你
手册页的“注释”部分几乎总结了这一点:
典型的应用程序将首先调用 OpenSSL_add_all_algorithms() 并在退出前调用 EVP_cleanup()。
和
密码和摘要查找函数在库的许多部分中使用。如果表未初始化,一些函数将出现异常并抱怨找不到算法。这包括 PEM、PKCS#12、SSL 和 S/MIME 库。这是 OpenSSL 邮件列表中的常见查询。
因此,假设您正在编写一个典型的应用程序,您将把它添加到您的 OpenSSL 初始化代码中:
OpenSSL_add_all_algorithms();
这是 OpenSSL 清理代码:
EVP_cleanup();
你就完成了。 您始终有责任在使用 OpenSSL 的应用程序中自行调用这些。 如果您想了解 OpenSSL 如何在内部存储表,请使用源代码,Luke。
要控制哪些密码可用于特定 SSL 上下文,您可以使用 SSL_CTX_set_cipher_list。
要获得比手册页更好的文档,我可以推荐 John Viega、Matt Messier 和 Pravir Chandra 所著的 “Network Security with OpenSSL”。 这本书很旧,没有涵盖较新版本的 OpenSSL,但大部分内容仍然非常适用。
较新的 OpenSSL 版本不需要 OpenSSL_add_all_algorithms(),因此会被忽略。 为了向后和向前兼容,请使用这个:
# if OPENSSL_API_COMPAT < 0x10100000L
OpenSSL_add_all_algorithms();
# endif
还有
# if OPENSSL_API_COMPAT < 0x10100000L
EVP_cleanup();
# endif
这同样适用于 OpenSSL_add_all_ciphers() 和 OpenSSL_add_all_digests()。
有关更多详细信息,请参阅手册页: https://www.openssl.org/docs/man1.1.0/man3/OpenSSL_add_all_digests.html
这是一个老问题了。 该 API 几年前已被弃用:
OpenSSL_add_all_algorithms()、OpenSSL_add_all_ciphers()、OpenSSL_add_all_digests() 和 EVP_cleanup() 函数在 OpenSSL 1.1.0 中已被 OPENSSL_init_crypto() 弃用。