{"id":1353,"date":"2016-04-07T11:36:33","date_gmt":"2016-04-07T10:36:33","guid":{"rendered":"http:\/\/esferas.org\/msqlu\/?p=1353"},"modified":"2020-01-30T12:34:29","modified_gmt":"2020-01-30T11:34:29","slug":"el-protocolo-acme-empleado-por-lets-encrypt","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2016\/04\/07\/el-protocolo-acme-empleado-por-lets-encrypt\/","title":{"rendered":"El protocolo ACME empleado por Let&#8217;s Encrypt &#8230;"},"content":{"rendered":"<p style=\"text-align: left;\">&#8230; que hay que implementar cuando se quiere utilizar el proyecto para obtener certificados digitales para nuestros servicios.<\/p>\n<p style=\"text-align: left;\"><!--more--><\/p>\n<p style=\"text-align: left;\">Hasta ahora estaba utilizando el cliente oficial del proyecto <a href=\"http:\/\/letsencrypt.org\">Let&#8217;s Encrypt <\/a>pero estoy cambiando hacia una versi\u00f3n m\u00e1s ligera, basada en Bash, llamada <a href=\"https:\/\/github.com\/lukas2511\/letsencrypt.sh\">letsencrypt.sh<\/a>. Hace menos cosas por ti que el cliente <em>oficial<\/em> pero tiene una s\u00edntaxis m\u00e1s sencilla, y aunque ahora tengo que ser consciente de cosas como el protocolo <a href=\"https:\/\/letsencrypt.github.io\/acme-spec\">ACME<\/a>, me proporciona mayor control en su instalaci\u00f3n.<\/p>\n<p style=\"text-align: left;\">El <a href=\"https:\/\/github.com\/lukas2511\/letsencrypt.sh\/blob\/master\/docs\/wellknown.md\">protocolo ACME<\/a> se utiliza cuando se solicita o se renueva un certificado digital y sirve para verificar que el dominio te pertenece. Existen dos mecanismos para ello, siendo el primero -y el m\u00e1s empleado por los clientes actuales- el que utiliza el protocolo HTTP. Consiste en solicitar a tu servidor un archivo concreto bajo la ruta <\/p>\n<pre class=\"inline:true decode:1 \">.well-known\/acme-challenge<\/pre>\n<p> del dominio para el que se crea o renueva el certificado. Parece que tambi\u00e9n es posible servir dicho archivo bajo conexiones seguras (SSL) pero se recomienda que el acceso v\u00eda HTTP exista y est\u00e9 disponible.<\/p>\n<p style=\"padding-left: 30px; text-align: left;\">La otra verificaci\u00f3n estriba en el DNS y a\u00fan no tengo informaci\u00f3n suficiente como para hacerla bien, pero es m\u00e1s c\u00f3moda porque no se debe tocar nada en el servido.<\/p>\n<p style=\"text-align: left;\">En el caso de tener varios dominios se puede definir en el servidor web de un acceso global a dicha localizaci\u00f3n y que \u00e9ste se configure en todos los servidores virtuales.<\/p>\n<p style=\"text-align: left;\">En mi caso estoy empleando la versi\u00f3n 2.4 de Apache bajo Debian por lo que creo un archivo en <\/p>\n<pre class=\"inline:true decode:1 \">\/etc\/apache2\/conf-available\/letsencrypt.conf<\/pre>\n<p> con el siguiente contenido:<\/p>\n<pre class=\"expand:true lang:apache decode:true\">Alias \/.well-known\/acme-challenge \/var\/www\/letsencrypt\r\n\r\n&lt;Directory \/var\/www\/letsencrypt&gt;\r\n        Options None\r\n        AllowOverride None\r\n        Require all granted\r\n&lt;\/Directory&gt;<\/pre>\n<p>Adem\u00e1s de crear el directorio <\/p>\n<pre class=\"inline:true decode:1 \">\/var\/www\/letsencrypt<\/pre>\n<p> con los permisos habituales del usuario <\/p>\n<pre class=\"inline:true decode:1 \">www-data <\/pre>\n<p>con<\/p>\n<pre class=\"lang:sh decode:true \">$ sudo install -d -o www-data -g www-data -m 0755 \/var\/www\/letsencrypt<\/pre>\n<p>Tras reiniciar el servidor Apache para que lea la nueva configuraci\u00f3n podemos efectuar una prueba sencilla para ver si funciona con todos los dominios empleando <\/p>\n<pre class=\"inline:true decode:1 \">curl <\/pre>\n<p>y creando un archivo simple de nombre arbitrario.<\/p>\n<pre class=\"lang:sh decode:true\" title=\"Activando la configuraci\u00f3n en Apache\">$ sudo a2enconf letsencrypt\r\nEnabling conf letsencrypt.\r\nTo activate the new configuration, you need to run:\r\n  service apache2 reload\r\n$ sudo service apache2 reload \r\n$ sudo date &gt; \/var\/www\/letsencrypt\/flag\r\n$ sudo curl --insecure https:\/\/astillas.net\/.well-known\/acme-challenge\/flag\r\njue abr  7 13:32:20 CEST 2016\r\n$ sudo rm \/var\/www\/letsencrypt\/flag<\/pre>\n<p>Una vez que \u00e9sto est\u00e1 funcionando podemos pasar a la siguiente fase de la que hablar\u00e9 en otro art\u00edculo.<\/p>\n<h4>Actualizaci\u00f3n<\/h4>\n<p>He comprobado que el mecanismo falla en varias situaciones. Casi todos mis servidores virtuales fuerzan una redirecci\u00f3n hacia la versi\u00f3n segura empleando la siguiente construcci\u00f3n<\/p>\n<pre class=\"lang:apache decode:true\">&lt;VirtualHost *:80&gt;\r\n        ServerName  git.astillas.net\r\n\r\n        # redirect to https when available (thanks omen@descolada.dartmouth.edu)\r\n        RewriteEngine on\r\n        RewriteCond %{HTTPS} !^on$ [NC]\r\n        RewriteRule . https:\/\/%{HTTP_HOST}%{REQUEST_URI}  [L]\r\n&lt;\/VirtualHost&gt;\r\n<\/pre>\n<p>Y suele funcionar correctamente una vez all\u00ed excepto en el caso de emplear el m\u00f3dulo mod_proxy como frontal para un servidor interno. La soluci\u00f3n encontrada en <a href=\"http:\/\/serverfault.com\/questions\/739125\/apache2-4-mod-rewrite-exclude-specific-alias-directroy-uri\">los foros de serverfault<\/a> era a\u00f1adir como condici\u00f3n para la redirecci\u00f3n que el URL no fuese el del protocolo ACME:<\/p>\n<pre class=\"lang:apache decode:true\"> RewriteEngine on\r\n RewriteCond %{HTTPS} !^on$ [NC]\r\n <strong>RewriteCond %{REQUEST_URI} !^\/\\.well\\-known\/acme\\-challenge\/<\/strong>\r\n RewriteRule . https:\/\/%{HTTP_HOST}%{REQUEST_URI}  [L]\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; que hay que implementar cuando se quiere utilizar el proyecto para obtener certificados digitales para nuestros servicios.<\/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":[2],"tags":[555,75,554,948],"class_list":["post-1353","post","type-post","status-publish","format-standard","hentry","category-software","tag-acme","tag-apache","tag-lets-encrypt","tag-well-known"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1353","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=1353"}],"version-history":[{"count":1,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1353\/revisions"}],"predecessor-version":[{"id":3324,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1353\/revisions\/3324"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=1353"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=1353"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=1353"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}