gpt4 book ai didi

ios - 设置支持 SNI 的 TLS1.2 连接

转载 作者:可可西里 更新时间:2023-11-01 05:44:19 30 4
gpt4 key购买 nike

我们正在尝试设置 TLS1.2 连接。在 Macbook 中下载了最新的 OpenSSL。使用这个 code创建 TLS1.2 连接。
但是,此特定行可能会导致问题。它使用 TLSv1。

  /* ---------------------------------------------------------- *
* Set SSLv2 client hello, also announce SSLv3 and TLSv1 *
* ---------------------------------------------------------- */
method = SSLv23_client_method();

尝试了 TLSv1_2_client_method() 方法,但它给出了以下链接错误:

Undefined symbols for architecture x86_64: "_TLSv1_2_client_method", referenced from: _main in sslconnect-7aa462.o

如果有人可以协助创建 TLS1.2 连接然后从 objective-c 调用(如果套接字编程需要一些特殊处理),这将是一个很大的帮助。

[请注意,我不是 iOS 用户。我正在帮助团队解决问题。我自己也是套接字编程的新手,尽管团队有一些经验。]

最佳答案

Tried TLSv1_2_client_method() method, but it gives below linking error:

Undefined symbols for architecture x86_64: "_TLSv1_2_client_method", referenced from: _main in sslconnect-7aa462.o

好的,听起来您正在针对 x86_64 进行链接,但您需要 iOS。您可以使用以下两个命令验证架构:

xcrun -sdk iphoneos lipo -info libcrypto.a
xcrun -sdk iphoneos lipo -info libssl.a

例如:

$ xcrun -sdk iphoneos lipo -info /usr/local/ssl/ios/lib/libcrypto.a 
Architectures in the fat file: /usr/local/ssl/ios/lib/libcrypto.a are: armv7 armv7s arm64 i386

前三个架构是不言自明的;而 i386 用于 iOS 调试器。

注意:/usr/local/ssl/ios/ 是我在构建 OpenSSL for iOS 后安装它的地方。 Apple 不提供。

如果您没有这四种 iOS 架构,那么您有两个选择。首先,您可以构建基于User Guide for the OpenSSL FIPS Object Module 中的iOS 程序。 ,附录 E.2,第 122 页。

其次是从 GitHub 下载预构建版本。这是 noloader 的 GitHub with OpenSSL 1.0.1h 内置使用OpenSSL的程序。这是来自 Stefan Arentz 的另一个这似乎很流行,但它的 OpenSSL 1.0.1g。


and then calling from the objective C

C 与 Objective C 一起工作得很好。调用它没有什么特别的。


...supports SNI for an iPhone application

在客户端上,您需要使用 SSL_set_tlsext_host_name 设置服务器名称。

在服务器上,它更复杂,因为您要处理回调。有关示例,请参阅 Serving multiple domains in one box with SNI .


对此的快速评论:

method = SSLv23_client_method();

... Tried TLSv1_2_client_method() method

理想情况下,您执行如下操作:

SSL_library_init();
SSL_load_error_strings();

const SSL_METHOD* method = SSLv23_method();
if(NULL == method) handleFailure();

SSL_CTX* 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);

...

SSLv23_method 为您提供 SSLv2 及更高版本。然后删除不需要的内容,例如 SSLv2、SSLv3 和压缩。剩下的就是 TLS 1.0 及更高版本(TLS 1.3 即将推出,因此您无需更改源代码即可获得它)。您将获得服务器支持的最高协议(protocol)(例如,TL​​S 1.2)。

另一方面,这只会为您提供 TLS 1.2:

SSL_library_init();
SSL_load_error_strings();

const SSL_METHOD* method = TLSv1_2_client_method();
if(NULL == method) handleFailure();

这意味着您将无法连接到运行 TLS 1.0 的服务器(与许多 IIS 服务器一样)。 如果您使用 ECC 连接到 Google 服务器,则需要确保禁用压缩。否则,您将失败,因为 Google 有一个奇怪的要求,即在使用带 ECC 的 TLS 1.2 时必须禁用压缩。

对于您的评论:

/* ---------------------------------------------------------- *
* Set SSLv2 client hello, also announce SSLv3 and TLSv1 *
* ---------------------------------------------------------- */

您可以使用以下内容,但我不推荐:

long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_TLS1_1 | SSL_OP_NO_TLS1_2;

我不推荐它,因为它会禁用 TLS 1.2 和 TLS 1.1;并启用 SSLv3。没有理由在 2014 年推出 SSLv3。


还有一条评论....

请务必使用 SSL_CTX_set_cipher_list 设置您的密码套件。选择 16 个左右你最喜欢的,忽略其余的。有关它的文档(以及密码套件的名称,如 DHE-RSA-AES256-SHA),请参阅 SSL_CTX_set_cipher_list(3)ciphers(1) .

选择 16 个左右的密码套件可实现两个目标。首先,它确保你得到你想要的。其次,它确保 F5 或 IronPort 等旧设备不会阻塞。较旧的设备使用固定大小的缓冲区,该缓冲区对于具有 80 多个密码套件的 ClientHello 来说太小了。如果有 16 或 20 个密码套件,则 ClientHello 通过。


还有最后一条评论....

1.1.0 之前的 OpenSSL 执行主机名匹配。但是,它确实执行其他常规检查。所以如果你使用的是 1.0.2 或以下版本,你将不得不执行主机名匹配。有关检查的信息,请参阅 SSL/TLS Client在 OpenSSL wiki 上。

关于ios - 设置支持 SNI 的 TLS1.2 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24412922/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com