- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在将应用程序中的 OpenSSL 库更新到版本 1.0.2c。
此版本支持 TLS 1.0、TLS 1.1 和 TLS 1.2 以及 SSL 3.0。我想将我的应用程序配置为自动协商可能的最高版本。
我已阅读 https://www.openssl.org/docs/ssl/SSL_CTX_new.html 中提供的文档其中表示 TLS_method
、TLS_client_method
和 TLS_server_method
方法可以执行此操作。
但在 Windows 发行版中(在 https://www.openssl.org/related/binaries.html 中可用)ssleay32.dll
不导出方法 TLS_method
、TLS_client_method
和 TLS_服务器_方法
。导出了其他方法,例如 TLSv1_method
、TLSv1_1_method
和 TLSv1_2_method
。然而,那些只接受特定版本。
我应该使用什么方法来自动进行版本协商?还是应该在运行时选择版本?
最佳答案
I would like to configure my application to automatic negotiate the highest version possible.
使用 SSL/TLS Client 中的以下代码在 OpenSSL wiki 上:
const SSL_METHOD* method = SSLv23_method();
if(method == NULL) handleFailure();
ctx = SSL_CTX_new(method);
if(ctx == NULL) handleFailure();
/* Cannot fail ??? */
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
SSL_CTX_set_options(ctx, flags);
它为您提供“TLS 1.0 及更高版本”。
请注意,下界确实提供了 TLS 1.0 的 TLS 记录层版本。上限是 TLS 1.2 的 TLS 客户端版本。记录层携带加密的有效载荷。 SSLv23_method
为您提供特定格式的 ClientHello
(适用于 SSLv3 及更高版本)。
暗示记录层版本的下限是大多数人使用它的方式,而不是标准的编写方式。而 TLS 工作组似乎拒绝以这种方式提供。给出的有效论据是“假设客户端想要使用 TLS 1.0、1.2 和 1.3,而不是 1.1”。我不知道有谁会放弃这样的协议(protocol)版本,所以它对我来说只是一个稻草人。
您可以在 Check Server security protocol using openssl 的其中一个答案中阅读更多相关信息.
相关的,你应该使用这个密码套件列表:
const char* const PREFERRED_CIPHERS = "HIGH:!aNULL:!MD5:!RC4";
res = SSL_set_cipher_list(ssl, PREFERRED_CIPHERS);
if(res != 1) handleFailure();
事实上,RSA key 传输已不再受到安全社区的青睐,因此在使用带有 RSA key 的证书时,以下甚至可能是更好的选择:
"HIGH:!aNULL:!MD5:!RC4:!kRSA";
密码字符串将主要提供现代安全性,并将避免 obsolete cryptography warning .
关于ssleay32.dll 不导出 TLS_method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894057/
我正在将应用程序中的 OpenSSL 库更新到版本 1.0.2c。 此版本支持 TLS 1.0、TLS 1.1 和 TLS 1.2 以及 SSL 3.0。我想将我的应用程序配置为自动协商可能的最高版本
我是一名优秀的程序员,十分优秀!