Instalación y Configuración de ModSSL, OpenSSL y PHP en Apache

Iniciado por Adastra, Noviembre 24, 2012, 01:08:41 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Noviembre 24, 2012, 01:08:41 PM Ultima modificación: Junio 09, 2015, 12:55:26 AM por EPSILON

Tomado de: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Publicación original: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Cuando se instala un servidor Apache que se expondrá en entornos no seguros como internet, implementar medidas de seguridad básicas como el cifrado de las comunicaciones es una actividad que es altamente recomendable. En esta publicación se hablará de como utilizar Apache con soporte a SSL.

En primer lugar, se explicará como habilitar el soporte de SSL en el servidor web, por lo tanto es necesario instalarlo como se ha indicado en la publicación anterior a esta, los pasos son simples y se pueden resumir así:

Instalar el servidor web
Instalar OpenSSL
Generar un certificado para el servidor utilizando OpenSSL.
Habilitar el soporte que tiene Apache para SSL
Establecer las directivas para SSL en el fichero de configuración del servidor.

Para instalar OpenSSL, se puede descargar el código fuente e instalar desde él o bien, ejecutar el comando apt-get install openssl ssl-cert en este caso concreto se explicará como realizar la instalación desde código fuente.

Uso de OpenSSL para generación de Certificados digitales.
Instalando OpenSSL

En primer lugar, OpenSSL es un Toolkit open source muy robusto que implementa protocolos como SSL v2/v3 y TLS v1 además puede ser utilizada como una potente librería para realizar operaciones criptográficas de propósito general.
Para instalar este toolkit en sistemas basados en Unix es necesario tener cumplidas algunas dependencias entre las que se destacan:

Código: php
Make.
GCC
Perl 5 o superior.


Ahora bien, para instalar OpenSSL es necesario descargarlo desde aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (elegir la ultima versión estable) y posteriormente proceder a ejecutar el script config. Existen algunas opciones en este script que pueden ser útiles en casos puntuales, entre las que se incluyen algunas tales como excluir determinados tipos de cifrados como SHA, DSA, MD5, RC2,RC3,RC4 etc. Construir el toolkit con o sin soporte a aplicaciones multi-threading, soporte para la compresión y decompresión con zlib, etc. Para entender con mayor detalle todas estas opciones se recomienda leer el fichero INSTALL que viene incluido en el paquete descargado. El comando con las opciones que se utilizarán en este caso es el siguiente.

Código: php
./config --prefix=/opt/openssl --openssldir=/opt/openssl


Una vez ejecutado el comando anterior, se procede a construir e instalar con make y make install respectivamente. Con esto es suficiente para tener instalado OpenSSL.
Ahora que se tiene OpenSSL instalado, es el momento de crear un certificado auto-firmado en el servidor web. Aquí es importante señalar que un certificado de este estilo no es confiable en un entorno como internet y la mayoría de navegadores modernos enseñarán un mensaje de alerta indicando al usuario que el certificado expuesto por el servidor no se encuentra soportado por ninguna entidad certificadora de confianza (CA) con lo cual cabe la posibilidad que se trate de un ataque MITM sobre SSL tal y como se ha explicado anteriormente este blog (ver aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)

Ahora, para crear un certificado auto-firmado puede ejecutarse el siguiente comando:

Código: php
>./openssl req -new -x509 -days 365 -sha1 -newkey rsa:2048 -nodes -keyout /opt/WebServerApacheFull/httpd-2.2.22/webserver.key -out /opt/WebServerApacheFull/httpd-2.2.22/webserver.crt -subj '/O=Compania de Servidor web seguro/OU=Departamento de Sistemas/CN=www.server-test.com' 
Generating a 2048 bit RSA private key
..........................................................................................................+++

...............................................+++

writing new private key to '/opt/WebServerApacheFull/httpd-2.4.2/webserver.key'

—–


Con esto será suficiente para crear el certificado auto-firmado y su correspondiente clave privada. No obstante como se ha mencionado anteriormente, el problema que tienen este tipo de certificados es que navegador que se conecte al sitio no reconocerá una entidad certificadora e interrumpirá la conexión esperando que el usuario confirme una excepción de seguridad para el sitio web una vez verifiqué el certificado emitido por el servidor. Obviamente no es una situación cómoda ni óptima, por ese motivo, cualquier servidor web que tenga un certificado digital para sus clientes, debe de ir acompañado por un certificado externo de una CA de confianza. Sin embargo, para un entorno de pruebas como este, no se hace necesario (aunque se verá más adelante).

El comando ejecutado anteriormente, tiene una serie de opciones que son aceptadas por openssl, sin embargo entender por que y para que se han incluido es importante, por este motivo se explica su funcionamiento y como ha afectado a la generación final del certificado y la clave privada.

req Se trata de uno de los comandos incluidos en OpenSSL que permite crear un certificado X.509 (Certificate Signing Request) CSR.

-new Opción para solicitar la creación de un nuevo certificado digital

-x509 El nuevo certificado generado será un certificado siguiendo el estándar X.509, sin embargo esta opción no solamente sirve para esto, también indica a OpenSSL que un nuevo certificado debe de ser generado, en el caso de que no se incluya esta opción solamente se generará una petición de certificado (CRS)

-days Número de días de vigencia del certificado antes de que este caduque, en este caso concreto tiene una vigencia de 1 año.

-sha1 Indica que el cifrado utilizado será SHA1

-newkey rsa:2048 Genera una clave privada nueva con RSA de 2048 bits

-nodes Indica que no se solicitará passphrase para el certificado.

-keyout Directorio de salida de la clave privada.

-out Directorio de salida para el certificado.

-subj
Datos sobre el certificado que se esta generando, en el caso de que esta opción no se indique, toda esta información es solicitada por OpenSSL de forma interactiva.

Ahora que se ha creado un certificado auto-firmado, este puede ser incluido en Apache, para ello es necesario incluir el modulo de SSL para Apache y activar algunas directivas adicionales, sin embargo antes de hacer esto, resulta conveniente explicar como hacer el proceso anterior pero utilizando una CA valida, por ejemplo Versign, por que razón? Porque en un entorno serio, no deberían lanzarse advertencias de seguridad al usuario final obligándole a aceptar excepciones, ese es un escenario perfecto para aplicar un ataque MITM con cierta facilidad, por este motivo existen los certificados digitales firmados por entidades certificadoras que garantizan que el sitio es seguro. Para esto se siguen los siguientes pasos:

Generar la petición de certificado que deberá enviarse a la CA:

Código: php
>openssl req -new -sha1 -newkey rsa:2048 -nodes -keyout /opt/WebServerApacheFull/httpd-2.2.22/webserver.key -out /opt/WebServerApacheFull/httpd-2.2.22/www.server-test.com.csr -subj '/O=Compania de Servidor web seguro/OU=Departamento de Sistemas/CN=www.server-test.com'


Como puede apreciarse, el comando anterior no es muy diferente del que se ha ejecutado unas lineas arriba, prácticamente la única diferencia es el uso de la opción -x509, que en este caso esta ausente, esto es principalmente para generar una petición de certificado (sin generar uno) dicha petición se almacenará en el directorio /opt/WebServerApacheFull/httpd-2.2.22/ con el nombre www.server-test.com.csr que es la petición propiamente dicha. No es obligatorio que se guarde con el mismo nombre de dominio, sin embargo hacerlo así facilita las cosas a la CA a la hora de procesar la petición.

NOTA: No debe especificarse ni dirección de correo ni password para generar la CRS.

El siguiente paso es enviar la petición (el fichero www.server-test.com.csr) a la CA con el correspondiente pago. Cuando la CA responda, lo hará con un fichero con extensión PEM que posteriormente puede cambiarse su extensión por CRT para seguir con las convenciones definidas de Apache. Posteriormente es necesario verificarlo con OpenSSL de la siguiente forma:

Código: php
>./openssl verify -CAfile /path/cadir/webserver_ca.crt -purpose sslserver /opt/WebServerApacheFull/httpd-2.2.22/webserver.crt/opt/WebServerApacheFull/httpd-2.4.2/webserver.crt

: OK

En este caso webserver_ca.crt es el certificado que ha devuelto la CA.

Ahora es necesario chequear que el certificado retornado por la CA corresponde con la clave privada.

Código: php
>openssl x509 -noout -modulus -in /path/cadir/webserver_ca.crt | openssl sha1 399ef8a520b5154c9a63345b8285c4cd8aa921d0
>openssl rsa -noout -modulus -in /opt/WebServerApacheFull/httpd-2.2.22/webserver.key | openssl sha1

399ef8a520b5154c9a63345b8285c4cd8aa921d0

Como puede apreciarse, la salida de los dos comandos ejecutados anteriormente es idéntica, lo que significa que el certificado que ha devuelto la CA es valido y corresponde a la clave privada que se genero desde el principio, por lo tanto ahora es posible estar seguros de que se puede utilizar en el servidor web.

Configurando Apache para utilizar SSL
Apache puede ser configurado que utilice los certificados generados anteriormente con OpenSSL, se trata de una tarea sencilla que consiste simplemente de cargar el modulo SSL incluido en el Apache y utilizar las directivas disponibles para interactuar con dicho modulo.

Resulta muy sencillo, sin embargo lo más frecuente es encontrar un servidor web con Apache ejecutándose en el puerto 80 con HTTP y por el puerto 443 con HTTPS (SSL) este tipo de configuración solamente es posible conseguirla utilizando VirtualServers, tal y como se ha explicado en una publicación anterior.

Ahora bien, para habilitar SSL en Apache se pueden seguir dos caminos, utilizando la utilidad a2enmod (que se incluye cuando se instala Apache desde apt-get) o simplemente recompilando el código fuente en el caso de que se hayan seguido los pasos de instalación de la publicación anterior a esta. En el caso de utilizar a2enmod solamente es necesario ejecutar
Código: php

>a2enmod ssl

Con esto, el modulo SSL quedará habilitado en el servidor web. Si se esta trabajando con el código fuente de Apache, es necesario recompilar utilizando la opción --enable-ssl

Código: php
>./configure --prefix=/opt/WebServerApacheFull/httpd-2.2.22 --enable-ssl


Posteriormente es necesario ejecutar nuevamente el comando make && make install

NOTA1:

En el caso de utilizar Apache 2.2.22 la forma de habilitar SSL en Apache es un poco diferente, ya que se carga directamente utilizando LoadModule en el fichero de configuración del servidor de la siguiente forma:
Código: php

LoadModule ssl_module modules/mod_ssl.so


No obstante, la configuración de SSL en dicho servidor, a la fecha de escribir este articulo tiene problemas y aunque el servidor arranca correctamente, no permite a ningún cliente acceder al servicio arrojando un error HTTP 500 y registrando el siguiente mensaje de error en el fichero de logs.

Código: php
[Thu Jun 28 23:02:59.587759 2012] [core:error] [pid 8368:tid 139637927126784] [client 127.0.1.1:37573] AH00027: Buggy authn provider failed to set user for /favicon.ico


Este error se encuentra reportado y próximamente sin duda existirá alguna solución para este problema tal y como se indica aquí: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta por esta razón se recomienda utilizar la versión 2.2.22

Ahora que el servidor tiene SSL habilitado, se puede comenzar a configurar los VirtualHosts, el siguiente fichero de configuración puede ser valido para explicar como crear un host virtual que escuchará en el puerto 82 para peticiones HTTP regulares y otro host virtual en el puerto 444 para peticiones HTTPS utilizando SSL.

Código: php
ServerName Galileo:82Listen 82
Listen 444

User adastra

Group adastra

ServerAdmin [email protected]

<IfModule mpm_worker_module>

StartServers 2

MaxClients 150

MinSpareThreads 25

MaxSpareThreads 75

ThreadsPerChild 25

MaxRequestsPerChild 100

</IfModule>

ErrorLog "logs/error_log"

LogLevel warn

<VirtualHost *:444>

DocumentRoot "/opt/WebServerApacheFull/httpd-2.2.22/htdocs/webssl"

SSLEngine on

<Directory /opt/WebServerApacheFull/httpd-2.2.22/htdocs/webssl>

Options Indexes FollowSymLinks

SSLRequireSSL

</Directory>

SSLCertificateFile /opt/WebServerApacheFull/httpd-2.2.22/webserver.crt

SSLCertificateKeyFile /opt/WebServerApacheFull/httpd-2.2.22/webserver.key

<IfModule mime_module>

AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl .crl

</IfModule>

</VirtualHost>

<VirtualHost *:82>

DocumentRoot "/opt/WebServerApacheFull/httpd-2.2.22//htdocs/app"

<Directory /opt/WebServerApacheFull/httpd-2.2.22/htdocs/app>

Options Indexes FollowSymLinks

</Directory>

</VirtualHost>


NOTA: Nótese que se ha incluido la directiva Listen para el puerto 444 y 82, esto es obligatorio para que funcionen adecuadamente los dos host virtuales definidos posteriormente.

Ejecutando Apache con el fichero de configuración anterior, dará como resultado, que el servidor web creará dos hosts virtuales, uno para HTTP en el puerto 82 y otro para HTTPS en el puerto 444. Cuando el cliente intenté acceder a http://galileo:82 será atendido por algún fichero de bienvenida como index.* o default.* en el directorio /opt/WebServerApacheFull/httpd-2.2.22//htdocs/app

Si el usuario intenta acceder a https://galileo:444 comenzará una conexión segura con el servidor web y será atendido por algún fichero de bienvenida como index.* o default.* en el directorio /opt/WebServerApacheFull/httpd-2.2.22//htdocs/webssl

De momento, se trata de una configuración muy simple, pero que permite comprender el concepto de host virtuales seguros y no seguros utilizando algunas directivas del modulo SSL disponible en Apache. Las directivas que merece la pena mencionar del fichero de configuración anterior son las siguientes:

SSLEngine on Esta directiva permite activar el soporte de SSL para el host virtual que se encuentra en ejecución en el puerto 444

SSLRequireSSL Esta directiva, que se ha ubicado al interior de la directiva Directory, indica que el recurso en cuestión debe ser asegurado usando SSL en cada petición.

SSLCertificateFile /opt/WebServerApacheFull/httpd-2.2.22/webserver.crt Simplemente se indica la ubicación donde se encuentra el certificado del servidor web

SSLCertificateKeyFile /opt/WebServerApacheFull/httpd-2.2.22/webserver.key Simplemente se indica la ubicación donde se encuentra la clave privada correspondiente al certificado del servidor web

Aunque en el modulo SSL existen muchísimas más opciones de configuración, con estas será suficiente para comenzar a trabajar con SSL

Configurando Apache para ejecutar PHP
Probablemente una de las razones por las que PHP ha sido un lenguaje de programación web tan popular se deba a que se encuentra plenamente soportado en prácticamente todas las versiones del servidor web de Apache, sin embargo esta no es la única razón. Se trata de un lenguaje fácil de manejar, con una gran cantidad de librerías para realizar casi cualquier cosa y sobre todo: Se trata de una herramienta Open Source (esa sin lugar a dudas es otra de las razones por las que es tan popular). Aunque como en todos los lenguajes de programación y prácticamente cualquier herramienta informática que se ha escrito hasta el momento, siempre han existido detractores y benefactores, no se debe subestimar (y obviamente tampoco sobrestimar) el poder de PHP, la mejor forma de tomar una posición, es simplemente probandolo.

Ahora, sin más preámbulos, se explica como instalar PHP en el servidor web que se ha instalado y configurado en esta publicación y en la anterior. En primer lugar es necesario descargar PHP desde su sitio oficial aquí:No tienes permitido ver los links. Registrarse o Entrar a mi cuenta descomprimir el fichero y ejecutar el script configure de la siguiente forma:

Código: php
>./configure --with-apxs2=/opt/WebServerApacheFull/httpd-2.2.22/bin/apxs --prefix=/opt/WebServerApacheFull/php-5.4.4 --with-openssl-dir=/opt/WebServerApacheFull/openssl --enable-zip --with-curl --with-mysql


Ahora se procede a ejecutar el comando make y make install.

Después de ejecutar el comando anterior automáticamente genera el modulo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta en el directorio de módulos de Apache, que en este caso se encuentra en el directorio /opt/WebServerApacheFull/httpd-2.2.22/modules ya que al utilizar la opción –with-apx2 se ha indicado la ruta de instalación del servidor web.

Ahora es necesario editar el fichero de configuración de Apache y agregar las siguientes directivas

Código: php
LoadModule php5_module modules/libphp5.so
<FilesMatch \.php$>
SetHandler application/x-httpd-php

</FilesMatch>

Estas sencillas lineas, simplemente indican que se cargue el modulo php5_module que se ha generado anteriormente de forma automática cuando se inicio el proceso de instalación de PHP. La siguiente directiva indica que todas las peticiones a recursos que terminen con ".php" deberán de ser tratadas por el handler de PHP, que en este caso es application/x-httpd-php de esta forma, el fichero será ejecutado como código PHP.

Para comprobar esta configuración, basta con incluir un fragmento de código en PHP en un fichero con extensión *.php por ejemplo:

Código: php
<?php phpinfo();phpinfo(INFO_MODULES);
?>


Si todo ha quedado correctamente instalado, con las lineas de código anteriores, se enseñará en el navegador información sobre la versión de PHP y las opciones incluidas en el proceso de compilación e instalación así como también los módulos que se encuentran habilitados, variables de configuración del servidor web, entre otros muchísimos y valiosos detalles de configuración.

En próximas publicaciones se hablará aun más sobre configuraciones y seguridad en servidores web Apache.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

"Nunca discutas con un idiota, podria no notarse la diferencia"
Kant.


Lastima que salta un cartel de no confianza para eso hay que pagar para una empresa certificadora

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Lastima que salta un cartel de no confianza para eso hay que pagar para una empresa certificadora
Sip, pero eso es algo positivo, ya que informa al usuario que algo podría estar llendo mal, en muchos casos ese "cartel de no confianza" es un indicador para el usuario final de que posiblemente, se esta llevando a cabo un ataque MITM, el verdadero problema, es que la gente no tiene conciencia de que existe un riesgo de seguridad y casi siempre lo que hacen es simplemente omitir la advertencia.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

"Nunca discutas con un idiota, podria no notarse la diferencia"
Kant.

Exacto pero si estas haciendo una web sin nunguna intencion rara
esto asusta al cliente de nuestra web, no nos queda otra que pagar

saludossss

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Exacto pero si estas haciendo una web sin nunguna intencion rara
esto asusta al cliente de nuestra web, no nos queda otra que pagar

saludossss
Claro, es que hacer las cosas bien cuesta...  ;D
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

"Nunca discutas con un idiota, podria no notarse la diferencia"
Kant.