Is it possible to destroy a persistent connection that has been created with NSURLConnection? I need to be able to destroy the persistent connection and do another SSL handshake.
As it is now, calling [conn cancel] leaves a persistent connection behind that gets used with the next connection request to that host, which I don’t want to happen.
As it turns out, I believe the Secure Transport TLS session cache is to blame.
I also asked the question on the apple developer forums, and got a response from an Apple person. He pointed me to this Apple sample code readme where it says:
So, based on that, a user would have to either kill their app and restart it or wait more than 10 minutes before sending another request.
I did another google search with this new information and found this Apple technical Q&A article that matches this problem exactly. Near the bottom, it mentions adding a trailing ‘.’ to domain names (and hopefully IP addresses) for requests in order to force a TLS session cache miss (if you can’t modify the server in some way, which I can’t), so I am going to try this and hopefully it will work. I will post my findings after I test it.
### EDIT ###
I tested adding a ‘.’ to the end of the ip address, and the request was still completed successfully.
But I was thinking about the problem in general, and there’s really no reason to force another SSL handshake. In my case, the solution to this problem is to keep a copy of the last known SecCertificateRef that was returned from the server. When making another request to the server, if a cached TLS session is used (
connection:didReceiveAuthenticationChallenge:was not called), we know that the savedSecCertificateRefis still valid. Ifconnection:didReceiveAuthenticationChallenge:is called, we can get the newSecCertificateRefat that time.