{"id":1362,"date":"2016-04-08T19:40:46","date_gmt":"2016-04-08T19:40:46","guid":{"rendered":"http:\/\/esferas.org\/msqlu\/?p=1362"},"modified":"2016-04-17T08:59:03","modified_gmt":"2016-04-17T08:59:03","slug":"usando-letsencrypt-sh-para-crear-y-renovar-certificados","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2016\/04\/08\/usando-letsencrypt-sh-para-crear-y-renovar-certificados\/","title":{"rendered":"Usando letsencrypt.sh para crear y renovar certificados"},"content":{"rendered":"<p class=\"vcard-names my-3\">La naturaleza abierta del proyecto <a href=\"http:\/\/letsencrypt.org\">Let&#8217;s Encrypt<\/a> permite que existan\u00a0 clientes alternativos al oficial. Yo me he decidido por uno escrito en Bash por <a href=\"https:\/\/github.com\/lukas2511\">Lukas Schauer<\/a>, muy ligero y f\u00e1cilmente trazable. Bueno, lo de f\u00e1cilmente es un decir porque cuando se llega a la parte de <em>openssl<\/em> las cosas se complican un poco con tanto par\u00e1metro y tanto condicionante; el resto se comprende de un vistazo r\u00e1pido.<\/p>\n<p class=\"vcard-names my-3\">El caso es que funciona muy bien y los resultados son f\u00e1cilmente aplicables a los servicios del sistema como detallar\u00e9 m\u00e1s abajo. De momento \u00e9stos son los pasos que he seguido:<\/p>\n<ol>\n<li>Descargar el programa<\/li>\n<li>Crear la configuraci\u00f3n<\/li>\n<li>Activar (y verificar) el protocolo <a href=\"http:\/\/esferas.org\/msqlu\/2016\/04\/07\/el-protocolo-acme-empleado-por-lets-encrypt\/\">ACME challenge. <\/a><\/li>\n<li>Acomodar el programa en el sistema.<\/li>\n<\/ol>\n<h4>Descarga del programa<\/h4>\n<p>Tan simple como clonar <a href=\"https:\/\/github.com\/lukas2511\/letsencrypt.sh.git\">el repositorio<\/a> en alg\u00fan lugar que no estorbe. En mi caso he empleado el directorio de trabajo de la cuenta que uso para configurar el servidor y luego lo he lanzado con privilegios de administraci\u00f3n cuando lo he necesitado (que es m\u00e1s bien siempre).<\/p>\n<h4>Crear la configuraci\u00f3n<\/h4>\n<p>El programa emplea como valor predeterminado para la configuraci\u00f3n y los certificados la ruta <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/letsencrypt.sh<\/pre>\n<p> y me ha parecido muy bien, aunque se puede cambiar utilizando el par\u00e1metro <\/p>\n<pre class=\"inline:true decode:1 \" >--config<\/pre>\n<p>. He creado el directorio y he situado all\u00ed dos archivos: uno para definir los dominios para los que quiero un certificado digital y otro para algunos ajustes en la configuraci\u00f3n que me faciliten la automatizaci\u00f3n de la renovaci\u00f3n.<\/p>\n<p>El archivo <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/letsencrypt.sh\/domains.txt<\/pre>\n<p> contiene en l\u00edneas aparte los dominios para los que queremos certificados separados por espacios en blanco. El primero es el dominio principal y los restantes son los nombres alternativos para el mismo.<\/p>\n<pre class=\"lang:default decode:true\">taquiones.net mail.taquiones.net db.taquiones.net\r\nastillas.net git.astillas.net \r\nvm69.net\r\n<\/pre>\n<p>Respecto a la configuraci\u00f3n he a\u00f1adido lo siguiente en <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/letsencrypt.sh\/config.sh<\/pre>\n<p> (es un archivo <em>shell<\/em>):<\/p>\n<pre class=\"lang:sh decode:true\"># Archivo de configuraci\u00f3n de openssl\r\nOPENSSL_CNF=\/usr\/lib\/ssl\/openssl.cnf\r\n\r\n# Ruta al directorio del protocolo ACME\r\nWELLKNOWN=\/var\/www\/letsencrypt\r\n\r\n# Direcci\u00f3n de contacto\r\nCONTACT_EMAIL=victor@example.net\r\n<\/pre>\n<p>Para crear los archivos CSR (Certificate Signing Request) con <em>openssl<\/em> es imprescindible que exista su archivo de configuraci\u00f3n. Al parecer el m\u00edo hab\u00eda desaparecido del sistema y me he limitado a copiar una versi\u00f3n ejemplo que he encontrado por ah\u00ed y la he situado en <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/ssl\/openssl.cnf<\/pre>\n<p> ya que Debian mantiene un enlace simb\u00f3lico desde <\/p>\n<pre class=\"inline:true decode:1 \" >\/usr\/lib\/ssl\/openssl.cnf<\/pre>\n<p> hac\u00eda all\u00ed; supongo que porque se trata de un archivo de configuraci\u00f3n y la normativa Debian indica que deben estar bajo <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc<\/pre>\n<p>.<\/p>\n<h4>Acomodar el programa en el sistema<\/h4>\n<p>Fase que incluye el probarlo por vez primera. Una vez que nos hemos asegurado de que respondemos correctamente al reto del protocolo ACME ejecutamos el programa con el par\u00e1metro <\/p>\n<pre class=\"inline:true decode:1 \" >--cron<\/pre>\n<p> para obtener nuestros certificados.<\/p>\n<p>Si todo ha ido bien los habr\u00e1 creado bajo su directorio de configuraci\u00f3n concretamente en bajo el subdirectorio <span style=\"text-decoration: underline;\"><em>certs<\/em>:<\/span><\/p>\n<pre class=\"lang:default decode:true\">.\r\n\u251c\u2500\u2500 certs\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 astillas.net\r\n|   .\r\n|   .\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 taquiones.net\r\n|   .\r\n|   .\r\n|   \u2514\u2500\u2500 vm69.net\r\n<\/pre>\n<p>En cada uno de ellos tendremos enlaces simb\u00f3licos apuntando a la \u00faltima versi\u00f3n de cada componente que necesitamos:<\/p>\n<ul>\n<li>cert.pem: es el certificado del servidor.<\/li>\n<li>chain.perm: son los certificados intermedios.<\/li>\n<li>fullchain.pem: el certificado del servidor y los intermedios.<\/li>\n<li>privkey.pem: es la clave privada de lo anterior.<\/li>\n<\/ul>\n<p>Despu\u00e9s s\u00f3lo resta instalar el programa y crear una tarea de renovaci\u00f3n en el sistema:<\/p>\n<pre class=\"lang:sh decode:true\">$ sudo install -o root -g root -m 0555 letsencrypt.sh \/usr\/local\/bin\r\n$ cat &lt;&lt;EOF &gt; renew.cron\r\n# Renovaci\u00f3n semanal en domingo\r\n0 23 * * 0 root \/usr\/local\/bin\/letsencrypt.sh --cron\r\nEOF\r\n$ sudo install renew.cron \/etc\/cron.d\/letsencrypt<\/pre>\n<h4>Renovando certificados<\/h4>\n<p>El programa <em>letsencrypt.sh<\/em>, al igual que los dem\u00e1s que he visto, comprueban que la validez del certificado sea superior a los treinta d\u00edas y si no es as\u00ed solicitan renovarlo. Tambi\u00e9n ocurre cuando la lista de dominios ha sufrido alguna alteraci\u00f3n como el a\u00f1adido o el borrado de alg\u00fan nombre.<\/p>\n<p>Luego est\u00e1 la cuesti\u00f3n de que tras la renovaci\u00f3n los certificados han cambiado y nos encontramos con el problema de reiniciar aquellos servicios que hacen uso de ellos.<\/p>\n<p>El programa <em>letsencrypt.sh<\/em> permite llamar a una funci\u00f3n con el nombre de <\/p>\n<pre class=\"inline:true decode:1 \" >deploy_cert()<\/pre>\n<p> que debe incluirse dentro del fuente principal en el archivo <\/p>\n<pre class=\"inline:true decode:1 \" >hook.sh<\/pre>\n<p> del directorio de configuraci\u00f3n.<\/p>\n<p>Un ejemplo:<\/p>\n<pre class=\"lang:sh decode:true\">function deploy_cert\r\n{\r\n        local DOMAIN=\"${1}\" KEYFILE=\"${2}\" CERTFILE=\"${3}\" FULLCHAINFILE=\"${4}\" CHAINFILE=\"${5}\"\r\n\r\n        # En cualquier caso reiniciar el servidor web\r\n        echo \"Reiniciando servidor web ...\" &gt;&amp;2\r\n        systemctl restart apache2\r\n\r\n        # y luego seg\u00fan el caso afinamos m\u00e1s\r\n        case $DOMAIN in\r\n        taquiones.net) \r\n                # Reiniciar servidores de correo, mensajer\u00eda \r\n                echo \"Reiniciando servidores de correo y mensajer\u00eda ...\" &gt;&amp;2\r\n                systemctl restart qpsmtpd\r\n                systemctl restart dovecot\r\n                systemctl restart prosody\r\n                ;;\r\n        esac\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La naturaleza abierta del proyecto Let&#8217;s Encrypt permite que existan\u00a0 clientes alternativos al oficial. Yo me he decidido por uno escrito en Bash por Lukas Schauer, muy ligero y f\u00e1cilmente trazable. Bueno, lo de f\u00e1cilmente es un decir porque cuando se llega a la parte de openssl las cosas se complican un poco con tanto [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[6],"tags":[18,554,556,557],"class_list":["post-1362","post","type-post","status-publish","format-standard","hentry","category-debian","tag-administracion-de-sistemas","tag-lets-encrypt","tag-letsencrypt-sh","tag-ssl"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1362","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=1362"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1362\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=1362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=1362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=1362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}