Con MAMP 3.4, ¿cómo actualizo a Apache 2.4 y OpenSSL 1.0.2 para cumplir con los requisitos de ATS iOS 9?

Acabo de instalar MAMP 3.4 en Yosemite, pero la versión de Apache interna sigue siendo 2.2. ¿Hay alguna forma de actualizar a Apache 2.4? Además, lo instalé a través de brew openssl 1.0.2 pero MAMP Apache aún comienza con la versión OpenSSL/0.9.8zg. ¿Por qué? Necesito estas actualizaciones para cumplir con los nuevos requisitos de ATS iOS 9.

Interesante: tendría que preguntarme si esto sería más fácil con una VM: ¿usar Vagrant o algo para ayudar en lugar de usar MAMP por completo? De cualquier manera, le sugiero que responda su propia pregunta moviendo su solución editada a una respuesta. Esto lo dejará más claro para otros usuarios que buscan una solución similar.
Gracias por tu comentario. Me temo que no sé qué es Vagrant, pero la idea de una VM tal vez sea bastante buena. De todos modos, recuerde que MAMP no se puede usar porque en realidad solo ejecuta Apache 2.2, mientras que Apache 2.4.x es estrictamente necesario para TLS 1.2.
Ah, me perdí esa nota tan importante en tu respuesta. Vagrant solo lo ayuda a administrar máquinas virtuales. Escribiría algunos scripts de aprovisionamiento que construirían su máquina con las herramientas que necesitaría, y luego vagrant upejecutarlos todos y arrancar la VM.
Entiendo, gracias por tu explicación. Desafortunadamente, no sé nada sobre máquinas virtuales y, en general, programación de bajo nivel :(

Respuestas (2)

A partir del 21 de julio de 2016, hay una versión preliminar disponible de MAMP PRO 4 que incluye OpenSSL 1.0.2, obtenga la versión preliminar aquí:

https://www.mamp.info/en/pre-lanzamiento.html

¡¡Por fin!! Esta es una muy buena noticia! ¡Gracias compañero!
De nada, yo estaba en la misma posición que tú, así que tuve que compartir esta información :)

Para Mac OS X Yosemite

  1. Actualice openssl por brew a la versión> = 1.0.2d
  2. TLS 1.2 solo funciona con apache 2.4 y, de hecho, MAMP todavía se proporciona 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
  3. 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 guardar server.keyy server.crtentrar/Applications/AMPPS/apache/conf

  1. Asegúrese de que los módulos ssl estén cargados dentro del archivo httpd.conf de AMPPS
  2. Editar archivo /Applications/AMPPS/apache/conf/extra/httpd-ssl.confagregando:


<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>

adentro

<IfModule ssl_module> ... </IfModule> 
  1. El simulador de iOS 9 lo molestará cada vez que use NSURLSession generando un error 9813 que dice que el certificado no es válido (porque está autofirmado). Entonces, en cada clase en la que vaya a usar NSURLSession, haga, por ejemplo, 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 URLSessiones un delegado que evitará que la aplicación se bloquee debido al certificado autofirmado y aceptará de todos modos.