Este tutorial lo guiará a través de su primera configuración de un sitio web SSL con la certificación Let's Encrypt. Let's Encrypt es una nueva autoridad SSL que proporciona certificados SSL gratuitos. Vamos a utilizar dos tutoriales existentes ("Cómo configurar un sitio web SSL intermedio compatible con el certificado Let's Encrypt" y "El servidor perfecto - Ubuntu 15.10 (Wily Werewolf) con Apache, PHP, MySQL, PureFTPD, BIND, Postfix, Dovecot y ISPConfig 3").
La configuración que se describe aquí es compatible con cualquier servidor LAMP de Ubuntu, por lo que también puede usar esta como configuración básica.
Este tutorial le mostrará cómo configurar Let's Encrypt en servidores sin ISPConfig 3, ya que pronto habrá una implementación directa del servicio Let's Encrypt en la próxima versión de ISPConfig 3 (versión 3.1). Entonces, si planea usar ISPConfig, espere la versión 3.1 y también un nuevo tutorial.
Creando el sitio web
El primer paso es crear la configuración y el directorio del sitio web y habilitar SSL (Apache mod_ssl) para ello. Depende de usted si usa la configuración predeterminada para un sitio web en un servidor o si planea usar varios hosts virtuales para alojar más de un dominio. Para un uso más confiable y escalable, crearé una configuración de host virtual para mi dominio de "laboratorio" isp1.cloudapp.net desde Azure.
Todos los vhosts se almacenan en el directorio /etc/apache2/sites-available de forma predeterminada en Ubuntu y Debian. Ejecute el siguiente comando para recuperar una lista de archivos de configuración de vhost existentes.
ls -l /etc/apache2/sites-available/
Mi salida se ve así:
[email protected]:/home/falco# ls -l /etc/apache2/sites-available/
-rw-r--r-- 1 root root 1332 May 20 2015 000-default.conf
-rw-r--r-- 1 root root 6437 May 20 2015 default-ssl.conf
Ahora podemos usar el archivo de configuración "predeterminado" para clonarlo y editarlo o podemos usar nuestra propia configuración. Prefiero usar mi propia configuración, ya que lo hago durante muchos años, así que creemos un nuevo host virtual creando el archivo:
vi /etc/apache2/sites-available/isp1.cloudapp.net.conf
En este archivo, pegue el siguiente contenido:
<VirtualHost *:80>
ServerName isp1.cloudapp.net
ServerAlias www.isp1.cloudapp.net
DocumentRoot /home/web/isp1.cloudapp.net/public_html
ErrorLog /home/web/isp1.cloudapp.net/log/habdak.eu_error_log
CustomLog /home/web/isp1.cloudapp.net/log/habdak.eu_access_log combinedScriptAlias /cgi-bin/ /home/web/isp1.cloudapp.net/cgi-bin/
DirectoryIndex index.html index.htm index.php index.php4 index.php5
<Directory /home/web/isp1.cloudapp.net/public_html>
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
AddType application/x-httpd-php .php
AddType application/json .json
</Directory>
<Directory /home/web/isp1.cloudapp.net/cgi-bin>
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
</Directory>
RemoveHandler .php
RemoveHandler .php5
php_admin_value engine Off
IPCCommTimeout 301
FcgidMaxRequestLen 1073741824
php_value memory_limit 128M
php_value suhosin.session.encrypt Off
</VirtualHost>
<VirtualHost *:443>
ServerName isp1.cloudapp.net
ServerAlias www.isp1.cloudapp.net
DocumentRoot /home/web/isp1.cloudapp.net/public_html
ErrorLog /home/web/isp1.cloudapp.net/log/habdak.eu_error_log
CustomLog /home/web/isp1.cloudapp.net/log/habdak.eu_access_log combined
ScriptAlias /cgi-bin/ /home/web/isp1.cloudapp.net/cgi-bin/
DirectoryIndex index.html index.htm index.php index.php4 index.php5
<Directory /home/web/isp1.cloudapp.net/public_html >
Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
AddType application/x-httpd-php .php
AddType application/json .json
</Directory>
<Directory /home/web/isp1.cloudapp.net/cgi-bin >
allow from all
AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
Require all granted
</Directory>
RemoveHandler .php
RemoveHandler .php5
php_admin_value engine Off
IPCCommTimeout 301
FcgidMaxRequestLen 1073741824
php_value memory_limit 128M
php_value suhosin.session.encrypt Off
SSLEngine on
SSLCertificateFile /home/web/isp1.cloudapp.net /ssl.cert
SSLCertificateKeyFile /home/web/isp1.cloudapp.net /ssl.key
SSLCACertificateFile /home/web/isp1.cloudapp.net /ssl.ca
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLProtocol All -SSLv2 -SSLv3
SSLCompression off
SSLHonorCipherOrder On
</VirtualHost>
Reemplace el nombre de dominio con su dominio dondequiera que ocurra y guarde el archivo. Para activar la configuración, ejecute:
a2ensite isp1.cloudapp.net.conf
Ahora lea las carpetas para el sitio web:
mkdir /home/web
mkdir /home/web/isp1.cloudapp.net
mkdir /home/web/isp1.cloudapp.net/public_html
mkdir /home/web/isp1.cloudapp.net/cgi-bin
mkdir /home/web/isp1.cloudapp.net/logs
Reinicie apache para aplicar la nueva configuración:
sudo service apache2 restart
Ahora tenemos que generar los archivos de certificado.
Instala Let's Encrypt y genera tu primer certificado SSL
Prefiero usar el inicio de sesión de root para la administración en lugar de ejecutar sudo antes de cada comando, así que vamos a su al usuario root:
sudo su
Navegue a su directorio de inicio raíz:
cd ~root
Instale git para obtener los archivos del repositorio de Let's Encrypt git:
apt-get install git
Ahora clone el repositorio git de Let's Encrypt:
git clone https://github.com/letsencrypt/letsencrypt.git letsencrypt
Navega a tu nueva carpeta de letsencrypt:
cd letsencrypt
Y solicita tu certificado SSL:
./letsencrypt-auto certonly --webroot -w /home/web/isp1.cloudapp.net/public_html -d isp1.cloudapp.net
Si solicita un certificado para el dominio maestro (dominio de 1 nivel, también conocido como cloudapp.net), use el parámetro -d dos veces. Con y sin prefijo www así:
./letsencrypt-auto certonly --webroot -w /home/web/cloudapp.net/public_html -d cloudapp.net -d www.cloudapp.net
Si no lo hace, el certificado no será válido para los visitantes que abran su sitio con el prefijo www.
También puede agregar otros subdominios a un certificado. Por ejemplo, si su subdominio admin.cloudapp.net coincide con el mismo sitio (la misma carpeta en el servidor), también debe agregarlo a este certificado. Desafortunadamente, no puede usar un comodín como (*.cloudapp.net) con let's encrypt.
Let's Encrypt actualizará automáticamente todas las dependencias y lo guiará a través de su configuración. Todo lo que necesita hacer es esperar a que aparezca la ventana que le pide su dirección de correo electrónico. Esta dirección se usa solo para recuperar datos perdidos.
Sus nuevas claves ahora se almacenan en /etc/letsencrypt/ de forma predeterminada. Vamos a vincularlos al directorio de nuestro sitio web para que podamos administrar las claves más tarde.
ln -s /etc/letsencrypt/archive/isp1.cloudapp.net/cert1.pem /home/web/isp1.cloudapp.net/ssl.cert
ln -s /etc/letsencrypt/archive/isp1.cloudapp.net/chain1.pem /home/web/isp1.cloudapp.net/ssl.ca
ln -s /etc/letsencrypt/archive/isp1.cloudapp.net/privkey1.pem /home/web/isp1.cloudapp.net/ssl.key
Ahora debería poder acceder a su sitio web con SSL. Let's Encrypt le informará automáticamente sobre la caducidad de los certificados a tiempo enviándole un correo electrónico a la dirección que proporcionó durante la instalación de Let's Encrypt.