Introducción:
Los certificados SSL brindan dos funciones:
1. Autenticación
2. Cifrado
El cifrado se puede lograr sin autenticación pero, por alguna razón, alguien decidió unirlos en un solo certificado. Parece tener sentido para los bancos y los sitios de comercio electrónico serios que deben autenticarse correctamente. Por lo tanto, cuando se desarrolló el protocolo HTTPS, no era posible cifrar, solo el flujo de HTTP. Esta situación nos hizo depender de las Autoridades de Autenticación de Certificados para obtener un certificado, incluso si solo queríamos el cifrado. Ahora, un grupo de personas geniales en https://letsencrypt.org/ finalmente creó la posibilidad de obtener certificados que realizan una verificación de autenticación simple, llamando a la URL y esperando una respuesta específica, y si tiene éxito, emite una validez gratuita de 90 días y una CA firmada. certificado SSL. Para los administradores de sistemas, este proceso de solicitud e instalación de dicho certificado gratuito se ha vuelto bastante simple. Este es un método para hacer esto en un servidor web Debian/Ubuntu.
Referencias:http://www.admin-magazine.com/Articles/Getting-a-free-TLS-certificate-from-Let- s-Encrypt?utm_source=ADMIN+Newsletter&utm_campaign=ADMIN_Update_Free_Certificates_with_Let%27s_Encrypt_2016-20-07&utm_medium=correo electrónico
PASOS:
Instalación de LetsEncrypt
apt-get update && apt-get install git
cd /usr/local/lib/
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --email [email protected] --agree-tos --help
echo "export PATH=$PATH:/usr/local/lib/letsencrypt" >> /root/.bashrc
. /root/.bashrc
NOTA: Asegúrese de que su sitio web al que desea agregar HTTPS ya esté configurado y vivo en su servidor web.
La razón es que durante el proceso de solicitud de un certificado, LetsEncrypt creará un subdirectorio adicional ({htdocs}/ .well-known/acme-challenge/) y un archivo temporal especial en los htdocs del sitio (señalado por la directiva DocumentRoot en Apache) luego llame a ese archivo en el sitio desde el servidor LetsEncrypt para autenticar la URL. Si la URL llamada no es válida, no emitirá el certificado. Por esta razón, su sitio debe estar activo y debe proporcionar la ruta de los htdocs. Después del proceso de autenticación, el archivo temporal se borrará pero no los subdirectorios. Permanecerán vacíos.
Resolución de problemas:
Advertencia de plataforma insegura
Si recibe el siguiente mensaje de error, en Debian Wheezy puede resolverlo importando SSl a Python. Consulte a continuación.InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
InsecurePlatformWarning
Importación de la compatibilidad con Python SSL: python
>>> import ssl
>>> (CTRL-D)
Actualización del programa cliente LetsEncrypt
rm -rf /root/.local/share/letsencrypt
rm -rf /usr/local/lib/letsencrypt.old &>/dev/null
mv /usr/local/lib/letsencrypt /usr/local/lib/letsencrypt.old
cd /usr/local/lib/
git clone https://github.com/letsencrypt/letsencrypt
Solicitud del certificado
P.ej. para el dominio blog.mydomain.com
NOTA:en la primera solicitud, el script le pedirá que proporcione una dirección de correo electrónico para fines de contacto, así como para aceptar los términos y condiciones de uso de esta herramienta. Luego no le hará estas preguntas.letsencrypt-auto certonly --webroot -w /www/clients/blog.mydomain.com/htdocs -d blog.mydomain.com
Los certificados y la clave se almacenarán en /etc/letsencrypt/live/blog.mydomain.com/ como:cert.pem : Certificate
chain.pem : CA Certificate
privkey.pem : Private key
fullchain.pem : Combination of the certificate and the CA Certificate
En lugar de mover el certificado, simplemente configure Apache u otro servidor web para señalar los archivos de certificados donde se encuentran.
De esta manera, se puede crear un trabajo cron para renovar periódicamente el certificado automáticamente sin intervención manual.
El certificado será válido solo por 90 días; sin excepciones.
Esto significa que el mismo comando anterior deberá ejecutarse cada 3 meses o antes con la adición de la opción –renew-by-default .
El límite de certificados que puede solicitar para un determinado dominio es:actualmente 5 certificados / 7 días.
Renovación de certificado único:
Para renovar el certificado automáticamente, se sugiere usar un trabajo cron y agregar la opción –renew-by-default en el comando ej. de la siguiente manera:letsencrypt-auto certonly --renew-by-default --webroot -w /www/clients/blog.mydomain.com/htdocs -d blog.mydomain.com
Renovando todo certificados Letsencrypt instalados:
/usr/local/lib/letsencrypt/letsencrypt-auto renew
Nota: Se recomienda enviar la salida del comando por correo electrónico para verificar si el proceso fue exitoso.
Información adicional
Los certificados de LetsEncrypt se almacenan en los directorios /etc/letsencrypt/ de diferentes formas. Simplemente NO se recomienda eliminar ninguno de los certificados, archivos o enlaces simbólicos en estos directorios porque los archivos en los directorios 'keys' y 'csr' no están identificados para hacer referencia a un certificado específico. Entonces, simplemente eliminar algunos archivos pero no otros relacionados con el mismo certificado puede confundir el comando del cliente y luego no puede solicitar más certificados. El mensaje de error del programa cliente es algo así como:letsencrypt TypeError: coercing to Unicode: need string or buffer, NoneType found
Si alguna vez llega a ese punto de no retorno, simplemente elimine todos los directorios:archivo , rsc , teclas , en vivo y renovación PERO no cuentas . Luego, vuelva a emitir solicitudes de certificados para sitios ya existentes. A continuación, se renovarán los certificados y podrá solicitar otros nuevos.
Para obtener más información sobre el tema, consulte:
https://letsencrypt.readthedocs.org/en/latest/using.html
Guión cómodo
Si desea poder emitir un certificado y desea que se renueve automáticamente después de 80 días, este script podría resultarle útil.#!/bin/bash
# Purpose: Issue or renew a certificate from LetsEncrypt
# It will also issue an 'at'command which will be responsible to automatically renew the certificate automatically
# This script also issues a new at comand which will do the same in around 3 Months days depending on the settings here
# Syntax: cert_request.sh -s SITE_NAME -d SITE_HTDOCS
# Changes: 30.12.2015 First implementation of the script
# 10.01.2016 Took out the read of wpinstall.cfg config file. Added checks for the letsencrypt and at programs
#--------------------------------------------------------------
. /root/.bashrc
RENEW_DAYS="80"
# Absolute path to this script.
SCRIPT=$(readlink -f $0)
CERTS_DIR="/etc/letsencrypt/live"
# Absolute path this script is in.
scriptdir=$(dirname $SCRIPT)
encryptprgm="/usr/local/lib/letsencrypt/letsencrypt-auto"
atprgm="/usr/bin/at"
EMAIL="[email protected]"
#
# Check the syntax
function usage () {
echo "Usage: cert_request.sh -s SITE_NAME -d SITE_HTDOCS"
echo "-s SITE_NAME Full web site address WITHOUT the 'http://' eg.: www.myblog.com"
echo "-d SITE_HTDOCS The absolute path where WordPress will be installed. eg. /www/sites/www.mysite.com/htdocs"
exit 1
}
#
if [ $# -ne 4 ]; then
echo "ERROR: Wrong number of given argunents."
usage
fi
# Make sure the letsencrypt client prgm is installed
if ! [ -e $encryptprgm ] ; then
echo "ERROR: the letsencrypt program isn not installed. Install it and retry."
echo "See instructions at: //tipstricks.itmatrix.eu/install-new-and-signed-ssl-certificate-for-web-servers"
exit 1
fi
# Make sure the at is installed
if ! [ -e $atprgm ] ; then
echo "ERROR: the 'AT' program isn not installed. Install it and retry."
echo "apt-get install at"
exit 1
fi
# Everything look good so far. Lets start.
# get the command options
while getopts "s:d:" OPTION
do
case $OPTION in
s) SITE_NAME=$OPTARG
;;
d) SITE_HTDOCS=$OPTARG
;;
h|?|*)
echo "ERROR: argument(s) unknown."
usage
;;
esac
done
echo "Requesting certificate at LetsEncrypt"
# Does it exist already, then renew only, otherwise request renewing the cert
if [ -d $CERTS_DIR/${SITE_NAME} ] ; then
echo "The certificate already exists. Requesting a renewal"
RENEW="--renew-by-default"
else
RENEW=""
fi
#
if ($encryptprgm certonly $RENEW --webroot -w $SITE_HTDOCS -d ${SITE_NAME} &>/dev/null); then
# Enable the Apache SSL configuration and restart Apache
(echo "Certificate request successful."
echo "Issuing a renewal of the certificate in 80 days using 'at' command"
service apache2 restart
echo "$SCRIPT -s $SITE_NAME -d $SITE_HTDOCS" | $atprgm now + $RENEW_DAYS days)| tee /tmp/cert_request.sh.log \
| mail -s "Request/Renewal of Certificate for $SITE_NAME" [email protected]
echo -e "------- SITES LIST --------\n$(ls -1 /etc/apache2/sites-enabled/ | egrep -v '^00|^wptest1')\n\n--------- CERTIFICATES LIST ---------$(ls -l /etc/letsencrypt/live/ | cut -c29-)\n\n------- AT Jobs LIST -------\n$(/root/bin/atlist.sh)" | mail -s "Request/Renewal of Certificate request LIST" $EMAIL
cat /tmp/cert_request.sh.log
exit 0
else
(echo "ERROR: The certificate request/renewal FAILED.")| tee /tmp/cert_request.sh.log \
| mail -s "Request/Renewal of Certificate for $SITE_NAME" $EMAIL
cat /tmp/cert_request.sh.log
exit 2
fi
#
Estado de los certificados
Aquí hay una secuencia de comandos útil que mostrará la siguiente información:
– Lista de trabajos AT listos para comenzar en el momento requerido
– Lista de certificados presentes y sus marcas de tiempo de archivo
Desde cada vamos a encriptar solo es válido por 90 días, esto le dará una visión general de la antigüedad de los certificados actuales y cuándo será la próxima vez que se realicen las solicitudes de certificados.#!/bin/bash
# Description: Displays all 'at' jobs and their respective commands
# Systax: atlist.sh
# Changes: 05.11.2016 First inplementation
########################################################################
# Get the short jobs list and expand from there
echo "================ AT Jobs ready to start at the required times ==============="
atq | while read line ; do
jobnr=$(echo $line | awk '{print $1}')
echo $line
# Pickup all the command lines after first line matching '}'.
# This excludes all the environment variables and the at exit line.
# Exclude the matching '}' line and empty lines
# Add an offset of 8 chars to each command line.
# at -c $jobnr | grep -A100 -m1 -e '^\}' | grep -v '^\}' | sed -e '/^$/d' -e 's/^/ /'
at -c $jobnr | at -c $jobnr | sed -e '1,/^\}/d' -e '/^$/d' -e 's/^/ /'
done
echo ; echo
echo "=============== Age of present certificates ====================="
ls -l /etc/letsencrypt/live/*/cert.pem | awk '{print $6" "$7" "$8" "$9}' | sed -e 's|/etc/letsencrypt/live/||' -e 's|/cert.pem||'
Instalación y uso de CERBOT
Introducción:
La herramienta Cerbot simplemente agrega más funciones fáciles de usar al Lestencrypt original que se ve arriba.
Consulte este sitio para obtener más información:
https://certbot.eff.org/docs/install.html
Uso:
Puede realizar una solicitud de certificado al servidor Letsencryp y también crear un servidor web temporal para permitir verificar la conexión HTTP de un sitio para el que se solicita el certificado. Estas funciones se pueden llamar simplemente agregando una opción en la línea de comando.
Por ejemplo:si quiero que un sitio web sea solo SSL, generalmente el host virtual HTTP redirigirá a HTTPS automáticamente para cualquier solicitud HTTP. En este caso bloquea la verificación del sitio web del servidor Letsencrypt. Hay 2 formas que conozco para evitar esta dificultad.
1) Crear una condición en la directiva de redirección en Apache que no redirija a HTTPS si el URI es /.bien conocido/…..
Pro:No hay tiempo de inactividad del servidor web
Contra:Se debe realizar una condición adicional en la directiva de redirección para cada sitio SSL.
2) Detenga el servidor web. Ejecute cerbot con la opción independiente. Reinicie el servidor web.
Esta solución solo sería buena para un entorno de clúster de servidor web si no desea tener tiempo de inactividad en su sitio.
Pro:no se necesita una condición de redirección adicional para los sitios. Realmente bueno para los servidores Nginx donde las condiciones de redireccionamiento son difíciles de crear
Desventaja:el sitio sufre un tiempo de inactividad durante este procedimiento que puede durar mucho si tiene muchos sitios que necesitan creación/renovación de certificados.
Instalación: wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
O si tiene Ubuntu 16.04 o posterior, los siguientes comandos también serán preferibles para la instalación:apt-get install certbot python-certbot-apache
Luego, para obtener ayuda sobre 'certbot'certbot --help
Un ejemplo de un 'certbot ' utilizando su propio servidor web para la autenticación, evitando así las dificultades de tener que interferir con Apache/NginX para el proceso de autenticación.
El siguiente ejemplo solicitará un único certificado que será válido para estos 4 subdominios utilizando el (SAN).certbot certonly --standalone -d www.mydomain.com -d www.mydomain2.com -d mailman.mydomain.com -d mail.mydomain.com
En este ejemplo anterior, debe asegurarse de que Apache/NginX no esté usando el puerto 80. Si lo hace, apague el servidor web antes de este comando y reinícielo inmediatamente después. Dará como resultado un breve tiempo de inactividad del acceso a la web. Este tiempo de inactividad puede ser aceptable dependiendo de si tiene el servidor web detrás de un balanceador de carga o si el servicio web puede permitir dicho tiempo de inactividad.
Ejemplo: service apache2 stop
certbot certonly --standalone -d www.mydomain.com -d www.mydomain2.com -d mailman.mydomain.com -d mail.mydomain.com
service apache2 start