
然而,这条特定的线可能会导致这个问题.它使用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连接然后从目标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.axcrun -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,附录E.2,第122页中的iOS过程进行构建.
其次是从GitHub下载预建版本.这是使用OpenSSL程序构建的OpenSSL 1.0.1h的noloader GitHub.这是另一个从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即将到来,因此您无需更改源代码即可获得).您将获得服务器支持的最高协议(例如,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连接到@R_404_5561@服务器,则需要确保禁用压缩.否则,您将失败,因为谷歌有一个奇怪的要求,即在使用带有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或更低版本,则必须执行主机名匹配.有关检查的信息,请参阅OpenSSL wiki上的SSL/TLS Client.
总结以上是内存溢出为你收集整理的ios – 设置支持SNI的TLS1.2连接全部内容,希望文章能够帮你解决ios – 设置支持SNI的TLS1.2连接所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)