Para Mac OS X Yosemite
- Actualiza openssl by brew a la versión > = 1.0.2d
- TLS 1.2 funciona solo con apache 2.4 y, de hecho, MAMP todavía se administra con apache 2.2. SOLUCIÓN: descargue e instale la última versión de AMPPS que ejecuta una versión de apache 2.4.x
-
cree un certificado autofirmado con sha256 (según lo solicitado por iOS 9) con
openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
y guarde server.key
y server.crt
en /Applications/AMPPS/apache/conf
- Asegúrese de que los módulos ssl se carguen dentro del archivo httpd.conf de AMPPS
- Editar archivo
/Applications/AMPPS/apache/conf/extra/httpd-ssl.conf
agregando:
<VirtualHost localhost:443>
DocumentRoot "/Applications/AMPPS/www"
ServerName localhost
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCertificateFile "/Applications/AMPPS/apache/conf/server.crt"
SSLCertificateKeyFile "/Applications/AMPPS/apache/conf/server.key"
</VirtualHost>
dentro
<IfModule ssl_module> ... </IfModule>
- El simulador de iOS 9 lo molestará cada vez que use NSURLSession, lo que generará un error 9813 que indicará que el certificado no es válido (porque está autofirmado). Por lo tanto, en cada clase en la que vaya a utilizar NSURLSession, haga lo siguiente:
class LoginService: NSObject, NSURLSessionDelegate {
func URLSession(session: NSURLSession,
task: NSURLSessionTask,
didReceiveChallenge challenge: NSURLAuthenticationChallenge,
completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?)
-> Void) {
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!))
}
...
func requestLoginWithURL (requestURL: NSURL, completionHandler: (success: Bool?) -> Void) {
let configuration =
NSURLSessionConfiguration.defaultSessionConfiguration()
let urlRequest: NSURLRequest = NSURLRequest(URL: requestURL)
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue:NSOperationQueue.mainQueue())
/*
dataTaskWithRequest: creates an HTTP request for the specified URL request object, and calls a handler upon completion.
*/
let task = session.dataTaskWithRequest(urlRequest, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
...
}
donde la función URLSession
es un delegado que evitará que la aplicación se bloquee debido al certificado autofirmado y aceptará de todos modos.