NSURLSessionConfiguration TLSMinimumSupportedProtocol看起来像在iOS上不起作用

时间:2017-03-16 12:29:43

标签: ios objective-c macos ssl nsurlsession

从一开始,我如何配置NSURLSession

auto securityPolicy = self.securityPolicy;

NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
config.TLSMinimumSupportedProtocol = [CSHTTPSessionWrapper minimumTLSprotocolForSecurityPolicy: securityPolicy]; // this properly sets values kTLSProtocol1, kTLSProtocol11, kTLSProtocol12

self.session = [NSURLSession sessionWithConfiguration: config
                                             delegate: self
                                        delegateQueue: nil];

没什么特别的。

现在我写了一些自动化测试,它将安全策略设置为TLS 1.0,1.1,1.2并尝试连接到openssl服务器。 我编写了启动此服务器的python脚本:

def run_ssl_server(name, openSSLBinary, port, params):
    print "Starting {0} server on port {1}".format(name, port)

    proc = subprocess.Popen([openSSLBinary, "s_server", "-cert", "testres/server.cert.pem", "-key", "testres/server.key.pem", "-debug", "-www", "-accept"] + [port] + params)
    atexit.register(proc.terminate)

    print "Server started. Pid={0}".format(proc.pid)

def main() :
    … … …
    openSSLBinary = arguments.openSSLBinary # use custom build of openssl

    server_modes = {
        'normal':         ('4433', []),
        'ssl3_only':      ('4435', ['-ssl3'])
    }

    openSSLVersion = open_ssl_tool_version(openSSLBinary)
    if openSSLVersion >= LooseVersion("1.0.0") :
        print "Adding servers which can be configured for openssl 1.0.0"
        server_modes.update({
            'no_tls2' : ('4434', ['-no_tls1_2']),
            'tls1'    : ('4436', ['-tls1']),
            'tls1_1'  : ('4437', ['-tls1_1']),
            'tls1_2'  : ('4438', ['-tls1_2']),
        })
    … … …

由于预先安装的openssl已经过时OpenSSL 0.9.8zh 14 Jan 2016我已经构建了新版本并将其提供给我的python脚本。

现在测试正在检查客户端最小TLS版本和服务器TLS版本的所有组合。 在Mac OS上,所有测试都通过了!

当客户端具有比服务器支持更高的最小TLS版本时,在iOS模拟器上运行的完全相同的测试失败是多么奇怪。 NSURLSSession返回成功,没有报告错误(他们应该报告)!

我为套接字(NSInputStreamNSOutputStream执行的测试完全相同,并且在Mac和iOS模拟器上运行并且它们正在传递,因此问题不是模拟器上的端口转发。

看起来NSURLSessionConfiguration TLSMinimumSupportedProtocol在iOS上无效!

有没有人有任何建议,线索? 或者我应该向Apple提出错误报告(我讨厌Apple使用的bug跟踪器)?

1 个答案:

答案 0 :(得分:0)

好的问题在iOS 10上无法重现,所以显然Apple已经修复了这个错误(我已经用Xcode 8.2.1重新运行测试)。

最初我使用iOS 9(Xcode 7.2)进行了测试。