{"id":2186,"date":"2017-04-07T11:04:10","date_gmt":"2017-04-07T10:04:10","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2186"},"modified":"2020-01-30T12:34:16","modified_gmt":"2020-01-30T11:34:16","slug":"el-nuevo-cliente-oficial-para-lets-encrypt","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2017\/04\/07\/el-nuevo-cliente-oficial-para-lets-encrypt\/","title":{"rendered":"El nuevo cliente \u00aboficial\u00bb para Let&#8217;s Encrypt"},"content":{"rendered":"<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:42,&quot;href&quot;:&quot;https:\\\/\\\/certbot.eff.org&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415091935\\\/https:\\\/\\\/certbot.eff.org\\\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-22 09:01:08&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 09:01:08&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:139,&quot;href&quot;:&quot;https:\\\/\\\/letsencrypt.org&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415104123\\\/https:\\\/\\\/letsencrypt.org\\\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-22 09:01:09&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 09:01:09&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:776,&quot;href&quot;:&quot;https:\\\/\\\/certbot.eff.org\\\/about&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20230127141527\\\/https:\\\/\\\/certbot.eff.org\\\/about\\\/&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-15 15:28:04&quot;,&quot;http_code&quot;:404},{&quot;date&quot;:&quot;2026-04-22 09:01:08&quot;,&quot;http_code&quot;:404}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 09:01:08&quot;,&quot;http_code&quot;:404},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:777,&quot;href&quot;:&quot;https:\\\/\\\/certbot.eff.org\\\/docs&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20210908022725\\\/https:\\\/\\\/certbot.eff.org\\\/docs\\\/&quot;,&quot;redirect_href&quot;:&quot;https:\\\/\\\/eff-certbot.readthedocs.io\\\/&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-22 09:01:09&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 09:01:09&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:778,&quot;href&quot;:&quot;https:\\\/\\\/certbot.eff.org\\\/docs\\\/using.html#standalone&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20211106014139\\\/https:\\\/\\\/certbot.eff.org\\\/docs\\\/using.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-15 15:28:17&quot;,&quot;http_code&quot;:200},{&quot;date&quot;:&quot;2026-04-22 09:01:09&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-22 09:01:09&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:779,&quot;href&quot;:&quot;http:\\\/\\\/httpd.apache.org\\\/docs\\\/current\\\/rewrite\\\/flags.html#flag_pt&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415153058\\\/https:\\\/\\\/httpd.apache.org\\\/docs\\\/current\\\/rewrite\\\/flags.html&quot;,&quot;redirect_href&quot;:&quot;https:\\\/\\\/httpd.apache.org\\\/docs\\\/current\\\/rewrite\\\/flags.html&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:780,&quot;href&quot;:&quot;http:\\\/\\\/httpd.apache.org\\\/docs\\\/current\\\/mod\\\/mod_rewrite.html#logging&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260410231047\\\/https:\\\/\\\/httpd.apache.org\\\/docs\\\/current\\\/mod\\\/mod_rewrite.html&quot;,&quot;redirect_href&quot;:&quot;https:\\\/\\\/httpd.apache.org\\\/docs\\\/current\\\/mod\\\/mod_rewrite.html&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]'><\/div>\n<p>Est\u00e1 muy bien pero tiene alguna que otra <em>particularidad<\/em> que lo hace un poco pu\u00f1etero.<\/p>\n<p><!--more--><\/p>\n<p>La <a href=\"https:\/\/certbot.eff.org\/\">EFF<\/a> ha publicado un cliente para obtener y renovar certificados con el proyecto <a href=\"https:\/\/letsencrypt.org\">Let&#8217;s Encrypt<\/a> que simplifica mucho la tarea, especialmente para instalaciones sencillas. Se llama <a href=\"https:\/\/certbot.eff.org\/about\/\">certbot<\/a> y est\u00e1 empaquetado y disponible para un buen pu\u00f1ado de versiones de servidor web y sistema operativo. Adem\u00e1s se dispone de una buena <a href=\"https:\/\/certbot.eff.org\/docs\/\">p\u00e1gina de documentaci\u00f3n<\/a> donde se cubren casos simples y complejos; con servidores web conocidos o configuraciones extra\u00f1as.<\/p>\n<p>El programa <em>certbot<\/em> puede utilizar varios mecanismos para responder al reto del servidor cuando se crean certificados. El que tengo que emplear, por limitaciones de los otros, es el <a href=\"https:\/\/certbot.eff.org\/docs\/using.html#standalone\">standalone<\/a> y tiene algunas peculiaridades algo molestas cuando se encuentra un escenario como el siguiente:<\/p>\n<ol>\n<li>Un servidor funcionando bajo Apache.<\/li>\n<li>M\u00faltiples dominios con servidores virtuales con:\n<ol>\n<li>Directorios ra\u00edz bajo <code>\/var\/www<\/code> o bajo <code>\/usr\/share<\/code> dado que pueden ser aplicaciones web instaladas mediante paquete del sistema.<\/li>\n<li>Conexi\u00f3n SSL forzada en todos ellos.<\/li>\n<\/ol>\n<\/li>\n<li>Un \u00fanico certificado para todos.<\/li>\n<\/ol>\n<p>Dado lo anterior no puedo dejar que las peticiones a <code>\/.well-known\/acme-challenge<\/code> se sirvan de cada uno de los directorios ra\u00edz de los servidores virtuales. El programa <em>certbot<\/em> con el mecanismo <em>standalone<\/em> crear\u00e1 esa ruta f\u00edsicamente (quieras o no) y guardar\u00e1 all\u00ed el token correspondiente al desaf\u00edo. En algunos casos puede que s\u00ed pueda y en otros, al ser directorios de sistema como <code>\/usr\/share<\/code>, pues no.<\/p>\n<p>Como quiero forzar las conexiones seguras en todos los casos (o en su inmensa mayor\u00eda) he creado una configuraci\u00f3n que se incluye en cada servidor virtual de esta manera:<\/p>\n<pre class=\"lang:apache decode:true\">RewriteEngine on\r\nRewriteCond %{HTTPS} !^on$ [NC]\r\nRewriteRule . https:\/\/%{HTTP_HOST}%{REQUEST_URI}  [L]\r\n<\/pre>\n<p>Pero esto supone que cuando <em>certbot<\/em> funcione se encontrar\u00e1 con conexiones SSL quiera o no; y, seg\u00fan el estado de los certificados (pueden haber caducado) podr\u00e1 hacerlo autom\u00e1ticamente o la liar\u00e1 parda y pedir\u00e1 ayuda al administrador de turno para hacerlo a mano.<\/p>\n<p>As\u00ed que a lo anterior tiene que contemplar ese escenario. Primero empleamos un <em>alias<\/em> para el directorio com\u00fan de trabajo y le damos permisos concretos. Esto yo lo incluyo en un archivo de configuraci\u00f3n en <code>\/etc\/apache2\/conf-available\/letsencrypt.conf<\/code> tal que as\u00ed:<\/p>\n<pre class=\"lang:apache decode:true \">Alias \/letsencrypt \/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>Y en la parte de reescritura le a\u00f1ado antes la siguiente regla:<\/p>\n<pre class=\"lang:apache decode:true \">RewriteEngine on\r\n\r\nAlias \/letsencrypt      \/var\/www\/letsencrypt\r\nRewriteCond %{REQUEST_URI} ^\/\\.well\\-known\/acme\\-challenge\/\r\nRewriteRule . \/letsencrypt%{REQUEST_URI} [PT] [L]\r\n\r\nRewriteCond %{HTTPS} !^on$ [NC]\r\nRewriteCond %{REQUEST_URI} !^\/\\.well\\-known\/acme\\-challenge\/\r\nRewriteRule . https:\/\/%{HTTP_HOST}%{REQUEST_URI}  [L]\r\n<\/pre>\n<p>De manera que todas las peticiones que realiza <em>certbot<\/em> son reconstru\u00eddas a <em>\/letsencrypt\/.well-known\/acme-challenge\/XXXXXX<\/em><code><\/code> y entran de nuevo en el motor de URL gracias al par\u00e1metro <code>[PT]<\/code> de la reescritura.<\/p>\n<p>Y una vez completado \u00e9sto, conseguidos los certificados, s\u00f3lo queda asegurarse de que tienen los permisos necesarios para que el grupo correspondiente <em>ssl-cert<\/em> tenga acceso a ellos (el servidor XMPP Prosody, por ejemplo, no funciona como <em>root<\/em> y necesita poder leerlos), y reiniciar los servicios.<\/p>\n<p>El archivo de configuraci\u00f3n de <em>certbot<\/em> incluye la posibilidad de llamar a un programa despu\u00e9s de la renovaci\u00f3n con el par\u00e1metro <code>post-hook<\/code>.<\/p>\n<pre class=\"lang:sh decode:true \">#!\/bin\/bash\r\n\r\n# Variables\r\nTARGET=\/etc\/letsencrypt\/archive\/\r\nSERVICES=\"prosody apache2 exim4 dovecot\" \r\nGROUP=ssl-cert\r\n\r\n# Ajustamos permisos\r\nchown -R ${GROUP} ${TARGET}\r\n\r\n# y reiniciamos servicios\r\nsystemctl restart ${SERVICES}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Enlaces y referencias<\/h3>\n<ul>\n<li><a href=\"http:\/\/httpd.apache.org\/docs\/current\/rewrite\/flags.html#flag_pt\">Par\u00e1metro PT en RewriteRule<\/a>.<\/li>\n<li><a href=\"http:\/\/httpd.apache.org\/docs\/current\/mod\/mod_rewrite.html#logging\">Depurando el funcionamiento de mod_rewrite<\/a>.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Est\u00e1 muy bien pero tiene alguna que otra particularidad que lo hace un poco pu\u00f1etero.<\/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":[75,699,198,41,554,948],"class_list":["post-2186","post","type-post","status-publish","format-standard","hentry","category-software","tag-apache","tag-certbot","tag-certificados","tag-debian","tag-lets-encrypt","tag-well-known"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2186","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=2186"}],"version-history":[{"count":1,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2186\/revisions"}],"predecessor-version":[{"id":3323,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2186\/revisions\/3323"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}