{"id":4315,"date":"2022-06-29T09:15:39","date_gmt":"2022-06-29T07:15:39","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=4315"},"modified":"2022-06-29T09:15:40","modified_gmt":"2022-06-29T07:15:40","slug":"certificados-lets-encrypt-en-redes-privadas-domesticas","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2022\/06\/29\/certificados-lets-encrypt-en-redes-privadas-domesticas\/","title":{"rendered":"Certificados Let&#8217;s Encrypt en redes privadas dom\u00e9sticas"},"content":{"rendered":"\n<p>Pues s\u00ed, al final lo he conseguido. A partir de ahora tengo servicios en la red casera que pueden cifrar sus conexiones sin tener que montar una autoridad de certificaci\u00f3n. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Son necesarias algunas disposiciones para que todo pueda funcionar correctamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>El certificado Let&#8217;s Encrypt deber\u00eda ser de tipo comod\u00edn (<em>wildcard<\/em>) aunque no es imprescindible.<\/li><li>La creaci\u00f3n y renovaci\u00f3n de certificados debe ser (ahora s\u00ed obligatoriamente) efectuada mediante DNS para su validaci\u00f3n. Dado que algunas de las m\u00e1quinas tienen IP interna no pueden atender peticiones HTTP procedentes del exterior.<\/li><li>Las m\u00e1quinas de la red dom\u00e9stica que sirven contenido (las \u00fanicas en las que merece la pena aplicar este mecanismo) deben tener una IP fija. <\/li><\/ul>\n\n\n\n<p>En el caso de ejemplo estoy utilizando mi dominio <em>taquiones.net<\/em> en el que he creado un certificado digital que cubre <em>taquiones.net<\/em> y <em>*.taquiones.net<\/em>. Es decir, el principal y cualquier cosa que cuelgue por debajo de \u00e9l. La zona DNS est\u00e1 definida con normalidad y apunta a m\u00e1quinas externas que tengo en alquiler con sus alias (CNAMES) y dem\u00e1s, a la que he a\u00f1adido registros con los nombres de las m\u00e1quinas internas apuntando a direcciones IP internas. S\u00ed, un DNS p\u00fablico puede responder con direcciones internas. No hay nada raro aqu\u00ed porque en realidad ninguno de los enrutadores de Internet va a transmitir nada con esas IP. <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>portico.taquiones.net responde a 192.168.100.1 y es el router OpenWRT que me da acceso a la red. <\/li><li>matraz.taquiones.net responde a 192.168.100.2 y es un servidor de medios y copias empleando Debian .<\/li><li>falcata.taquiones.net responde a 192.168.100.3 y es una m\u00e1quina de escritorio con algunos servicios a\u00f1adidos. <\/li><\/ul>\n\n\n\n<p>Y as\u00ed puedo seguir con todo aquello que me interese pero teniendo siempre en cuenta que esta disposici\u00f3n <strong>no es para que se pueda acceder desde fuera a estas m\u00e1quinas<\/strong>. El DNS responde con direcciones internas que \u00fanicamente tienen sentido si se accede desde dentro de la red. En caso de necesitar acceso desde fuera hay que hacerlo de otra forma (VPN, DNS din\u00e1mico, &#8230;) pero no es lo que yo pretendo. <\/p>\n\n\n\n<p>Despu\u00e9s transfiero los archivos de certificados (<em>fullchain.pem<\/em> y <em>privkey.pem<\/em>) a los servidores internos y los distintos programas que puedan aceptar conexiones cifradas de manera que cuando, desde dentro de la red, se solicite acceso a <em>matraz.taquiones.net<\/em>, el DNS externo responder\u00e1 con su IP interna y el servidor (pongamos que Apache) se presenta como una m\u00e1quina bajo el amparo de <em>*.taquiones.net<\/em>. Y ya est\u00e1. La conexi\u00f3n es segura porque el certificado ra\u00edz de Let&#8217;s Encrypt ya est\u00e1 instalado en el sistema y no hay queja por ninguna parte. Se pueden enviar contrase\u00f1as y datos sin temor a que alg\u00fan invitado de la red pueda inspeccionar los paquetes. <\/p>\n\n\n\n<p>Es cierto que direcciones como <em>matraz.home<\/em> me gustan m\u00e1s que <em>matraz.taquiones.net<\/em> pero es un precio peque\u00f1o a pagar por no tener que poner en marcha un certificado autofirmado y luego instalarlo en cada cliente. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El caso OpenWRT <\/h3>\n\n\n\n<p>El router que proporciona direcciones IP, servicio DNS y salida a la red tiene alguna peculiaridad. Para empezar a proteger el acceso a la aplicaci\u00f3n web de gesti\u00f3n (<em>luci<\/em>) es necesario hacer dos cosas: <\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Instalar el paquete <em>luci-app-uhttpd<\/em> que instala el servidor <em>uhttpd<\/em> y lo a\u00f1ade como servicio. <\/li><li>Convertir los dos archivos <em>.pem<\/em> del certificado a formato <em>.der<\/em> para que los pueda usar <em>uhttpd<\/em>. <\/li><\/ol>\n\n\n\n<p>Para convertir dichos archivos empleamos el programa <em>openssl<\/em> (para variar) con las siguientes combinaciones: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ # Para el certificado con la cadena completa\n$ openssl x509 -inform pem -in fullchain.pem -outform der -out fullchain.der\n$ # Para la clave privada\n$ openssl rsa -inform pem -in privkey.pem -outform der -out privkey.der<\/pre>\n\n\n\n<p>Ambos archivos se pueden copiar en el directorio <em>\/etc\/config<\/em> (por ejemplo) y luego configurar el servicio <em>uhttpd<\/em> para que los emplee en el men\u00fa correspondiente.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><a href=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image.png\" alt=\"\" class=\"wp-image-4318\" width=\"430\" height=\"135\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image.png 943w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-300x94.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-768x242.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-600x189.png 600w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/a><figcaption>Situaci\u00f3n de la configuraci\u00f3n de uHTTPd en el men\u00fa<\/figcaption><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><a href=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1-1024x435.png\" alt=\"\" class=\"wp-image-4319\" width=\"693\" height=\"294\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1-1024x435.png 1024w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1-300x127.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1-768x326.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1-600x255.png 600w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2022\/06\/image-1.png 1066w\" sizes=\"auto, (max-width: 693px) 100vw, 693px\" \/><\/a><figcaption>Opciones clave de la configuraci\u00f3n de uHTTPd<\/figcaption><\/figure>\n<\/div>\n\n\n<p>Hay que prestar atenci\u00f3n a esos ajustes: forzar conexiones para que sean cifradas y permitir acceso desde direcciones IP privadas. La ruta de los certificados tambi\u00e9n debe elegir cuidadosamente porque si se sit\u00faan en un directorio temporal, que sea borrado en cada arranque, el programa deja de funcionar por las bravas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Referencias<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/openwrt.org\/docs\/guide-user\/luci\/getting_rid_of_luci_https_certificate_warnings\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/openwrt.org\/docs\/guide-user\/luci\/getting_rid_of_luci_https_certificate_warnings<\/a><\/li><li><a href=\"https:\/\/wiki.segger.com\/HOWTO_convert_PEM_certificates_and_keys_to_DER_format_for_emSSL\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/wiki.segger.com\/HOWTO_convert_PEM_certificates_and_keys_to_DER_format_for_emSSL<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Pues s\u00ed, al final lo he conseguido. A partir de ahora tengo servicios en la red casera que pueden cifrar sus conexiones sin tener que montar una autoridad de certificaci\u00f3n.<\/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":[14],"tags":[18,1163,1162,554,1161,60,1093,1164],"class_list":["post-4315","post","type-post","status-publish","format-standard","hentry","category-internet","tag-administracion-de-sistemas","tag-certificados-der","tag-certificados-pem","tag-lets-encrypt","tag-openssl","tag-openwrt","tag-red-casera","tag-uhttpd"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4315","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=4315"}],"version-history":[{"count":4,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4315\/revisions"}],"predecessor-version":[{"id":4321,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4315\/revisions\/4321"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=4315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=4315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=4315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}