Per Mac OS X Yosemite
- Aggiornamento openssl da brew alla versione > = 1.0.2d
- TLS 1.2 funziona solo con apache 2.4 e attualmente MAMP viene ancora fornito con apache 2.2. SOLUZIONE: scarica e installa l'ultima versione di AMPPS che esegue una versione di apache 2.4.x
-
crea un certificato autofirmato con sha256 (come richiesto da iOS 9) con
openssl req -x509 -nodes -sha256 -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
e salva server.key
e server.crt
in /Applications/AMPPS/apache/conf
- Assicurati che i moduli ssl siano caricati nel file httpd.conf di AMPPS
- Modifica file
/Applications/AMPPS/apache/conf/extra/httpd-ssl.conf
aggiungendo:
<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>
inside
<IfModule ssl_module> ... </IfModule>
- Il simulatore di iOS 9 ti infastidisce ogni volta che usi NSURLSession generando un errore 9813 che dice che il certificato non è valido (perché è autofirmato). Pertanto, in ogni classe in cui utilizzerai NSURLSession, ad esempio, segui la seguente procedura:
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
...
}
in cui la funzione URLSession
è un delegato che impedirà l'arresto anomalo dell'app a causa del certificato autofirmato e accetterà comunque.