文件说
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_init_crypto() 在 OpenSSL 1.1.0 中弃用了 OpenSSL_add_all_algorithms()、OpenSSL_add_all_ciphers()、OpenSSL_add_all_digests() 和 EVP_cleanup() 函数。
参考: https ://www.openssl.org/docs/man1.1.0/man3/OpenSSL_add_all_algorithms.html