10

文件说

OpenSSL 保留一个摘要算法和密码的内部表。它使用此表通过诸如 EVP_get_cipher_byname() 之类的函数来查找密码。

OpenSSL_add_all_digests() 将所有摘要算法添加到表中。

我的问题是,这个表存储在哪里?我的代码怎么知道这个方法已经执行了?......它在内部是如何工作的,如果我想要更多的 SSL 连接,一个添加所有摘要而一个不添加,该怎么办?有谁知道这方面的任何好的文档?

谢谢

4

3 回答 3

11

手册页的注释部分几乎总结了它:

一个典型的应用程序最初会调用 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,但其中大部分内容仍然非常适用。

于 2013-01-23T22:45:00.843 回答
2

较新的 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的手册页

于 2020-05-01T19:14:52.250 回答
1

这是一个老问题。该 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

于 2020-09-22T16:06:54.587 回答