尝试了 TLSv1_2_client_method() 方法,但它给出了以下链接错误:
架构 x86_64 的未定义符号:“_TLSv1_2_client_method”,引用自:sslconnect-7aa462.o 中的 _main
好的,听起来您正在链接到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 后安装它的地方。苹果不提供。
如果您没有四种 iOS 架构,那么您有两种选择。首先,您可以根据OpenSSL FIPS 对象模块用户指南,附录 E.2,第 122 页中的 iOS 程序进行构建。
其次是从 GitHub 下载预构建版本。这是noloader的 GitHub,它使用 OpenSSL 的程序构建了 OpenSSL 1.0.1h。这是Stefan Arentz的另一个似乎很受欢迎的,但它的 OpenSSL 1.0.1g。
然后从目标 C 调用
C 与 Objective C 配合得很好。调用它并没有什么特别之处。
...支持 iPhone 应用程序的 SNI
在客户端上,您需要将服务器名称设置为SSL_set_tlsext_host_name
.
在服务器上,它涉及更多,因为您处理回调。例如,请参阅使用 SNI 在一个框中为多个域提供服务。
对此的快速评论:
方法 = SSLv23_client_method();
...尝试了 TLSv1_2_client_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 即将推出,因此您无需更改源代码即可获得它)。您将获得服务器支持的最高协议(例如,TLS 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 等旧设备不会阻塞。ClientHello
较旧的设备使用固定大小的缓冲区,该缓冲区对于80 多个密码套件来说太小了。ClientHello
如果有 16 或 20 个密码套件,则通行证。
最后一条评论....
1.1.0 之前的 OpenSSL不执行主机名匹配。但是,它会执行其他常规检查。因此,如果您使用的是 1.0.2 或更低版本,则必须执行主机名匹配。有关检查的信息,请参阅OpenSSL wiki 上的SSL/TLS 客户端。