{"id":1369,"date":"2016-04-12T08:15:26","date_gmt":"2016-04-12T08:15:26","guid":{"rendered":"http:\/\/esferas.org\/msqlu\/?p=1369"},"modified":"2016-04-17T08:59:03","modified_gmt":"2016-04-17T08:59:03","slug":"aplicando-certificados-lets-encrypt-en-el-sistema","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2016\/04\/12\/aplicando-certificados-lets-encrypt-en-el-sistema\/","title":{"rendered":"Aplicando certificados Let&#8217;s Encrypt en el sistema"},"content":{"rendered":"<p>Ya hemos usado <a href=\"http:\/\/esferas.org\/msqlu\/2016\/04\/08\/usando-letsencrypt-sh-para-crear-y-renovar-certificados\/\">un cliente para el proyecto Let&#8217;s Encrypt<\/a> y hemos habilitado su renovaci\u00f3n autom\u00e1tica as\u00ed que ahora lo que toca es emplearlo en los diferentes servicios del sistema.<\/p>\n<p>Los que voy a comentar en esta entrada son:<\/p>\n<ul>\n<li>Servidor web<\/li>\n<li>Servidor SMTP<\/li>\n<li>Servidor IMAP\/POP3<\/li>\n<li>Servidor XMPP<\/li>\n<\/ul>\n<h4>Servidor web Apache<\/h4>\n<p>Para declarar los certificados en el servidor Apache necesitamos a\u00f1adir varias directivas a su configuraci\u00f3n. Tal y como lo he organizado dispongo de tres juegos de certificados, uno por cada dominio principal, por lo que voy a crear tres archivos de configuraci\u00f3n de manera que me sea m\u00e1s sencillo cargarlos en cada servidor virtual.<\/p>\n<p>S\u00f3lo anoto aqu\u00ed el ejemplo de uno de ellos<\/p>\n<pre class=\"lang:apache decode:true\">SSLEngine on\r\nSSLCipherSuite  HIGH\r\nSSLProtocol all -SSLv2\r\nSSLHonorCipherOrder on\r\nSSLCertificateFile \/etc\/letsencrypt.sh\/certs\/taquiones.net\/fullchain.pem\r\nSSLCertificateKeyFile \/etc\/letsencrypt.sh\/certs\/taquiones.net\/privkey.pem<\/pre>\n<p>Guardado como <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/apache2\/conf.d\/taquiones-ssl.conf<\/pre>\n<p> y cargado empleando la directiva\u00a0<\/p>\n<pre class=\"inline:true decode:1 \" >Include \/etc\/apache2\/conf.d\/taquiones-ssl.conf<\/pre>\n<p>. Las referencias sobre las otras opciones de SSL las he sacado, entre <a href=\"https:\/\/wiki.mozilla.org\/Security\/Server_Side_TLS\">otras fuentes<\/a>, de <a href=\"http:\/\/stackoverflow.com\/questions\/17308690\/how-do-i-enable-perfect-forward-secrecy-by-default-on-apache\">StackOverflow<\/a>. Ahora, tras recargar la configuraci\u00f3n podemos probar la nueva configuraci\u00f3n gracias a la ayuda de <a href=\"https:\/\/www.ssllabs.com\/ssltest\/index.html\">SSL Labs<\/a>.<\/p>\n<h4>Recepci\u00f3n de correo (servidor XMPP)<\/h4>\n<p>Para la recepci\u00f3n del correo estoy empleando <a href=\"http:\/\/www.qpsmtpd.org\/\">qpsmtpd<\/a> como frontal de exim4 y dado que es el encargado de identificar a los usuarios precisa de acceso a los certificados para las conexiones seguras.<\/p>\n<p>El complemento TLS del programa no est\u00e1 escrito con mucho cari\u00f1o, menos a\u00fan documentado, y me ha costado encontrar la forma de que funcione. Ya que <em>qpsmtpd<\/em> funciona con un usuario sin privilegios administrativos no tiene acceso a los archivos de los certificados; me he visto obligado a proporcionarle una copia de los mismos en su directorio de configuraci\u00f3n <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/qpsmtpd\/ssl<\/pre>\n<pre class=\"lang:default decode:true\">root@spin:\/etc\/qpsmtpd\/ssl# ls -ltra\r\ntotal 20\r\n-rw------- 1 qpsmtpd qpsmtpd 3875 abr 11 07:55 server.crt\r\n-rw------- 1 qpsmtpd qpsmtpd 3243 abr 11 07:55 private.key\r\n-rw------- 1 qpsmtpd qpsmtpd 3875 abr 11 08:01 ca.crt\r\ndrwxr-xr-x 2 root    root    4096 abr 11 08:21 .\r\ndrwxr-xr-x 3 root    root    4096 abr 11 08:56 ..\r\n<\/pre>\n<p>Para despu\u00e9s indicar d\u00f3nde est\u00e1n en la configuraci\u00f3n (<\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/qpsmtpd\/plugins<\/pre>\n<p>):<\/p>\n<pre class=\"lang:default decode:true\">#       Habilitar conexiones seguras\r\ntls \/etc\/qpsmtpd\/ssl\/server.crt \/etc\/qpsmtpd\/ssl\/private.key \/etc\/qpsmtpd\/ssl\/ca.crt\r\n<\/pre>\n<p>Ahora s\u00f3lo resta solucionar el detalle de que cada vez que se renueve un certificado se vuelvan a copiar los contenidos en su directorio particular. Para eso he modificado la funci\u00f3n <em>deploy_cert()<\/em> en el script <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/letsencrypt.sh\/hook.sh:<\/pre>\n<pre class=\"lang:sh decode:true\">        # y luego seg\u00fan el caso afinamos m\u00e1s\r\n        case $DOMAIN in\r\n        taquiones.net)\r\n                # Detenemos el servidor smtp\r\n                systemctl stop qpsmtpd\r\n\r\n                # Copiamos los certificados para \u00e9l\r\n                QPSMTPD=\/etc\/qpsmtpd\/ssl\r\n                cp $KEYFILE $QPSMTPD\/privkey.pem\r\n                cp $CERTFILE $QPSMTPD\/server.crt\r\n                cp $FULLCHAINFILE $QPSMTPD\/ca.crt\r\n\r\n                # Reiniciar servidores de correo, mensajer\u00eda ...\r\n                echo \"Reiniciando servidores de correo y mensajer\u00eda ...\" &gt;&amp;2\r\n                systemctl <strong>start<\/strong> qpsmtpd\r\n                systemctl restart dovecot\r\n                systemctl restart prosody\r\n                ;;\r\n        esac\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4>Servidor IMAP\/POP3 (dovecot)<\/h4>\n<p>Este ha sido el m\u00e1s sencillo de configurar. Para habilitar las conexiones seguras de los protocolos de acceso a los buzones de correo basta con a\u00f1adir unas estrofas a su archivo de configuraci\u00f3n en <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/dovecot\/dovecot.conf<\/pre>\n<p>:<\/p>\n<pre class=\"lang:default decode:true \">ssl_ca = &lt;\/etc\/letsencrypt.sh\/certs\/taquiones.net\/fullchain.pem\r\nssl_cert = &lt;\/etc\/letsencrypt.sh\/certs\/taquiones.net\/fullchain.pem\r\nssl_key = &lt;\/etc\/letsencrypt.sh\/certs\/taquiones.net\/privkey.pem\r\n<\/pre>\n<h4>Servidor XMPP (prosody)<\/h4>\n<p>Con este programa nos encontramos con el mismo problema que con <em>qpsmtpd<\/em>: funciona con una cuenta de usuario normal y no tiene acceso a los certificados. He tenido que implementar la misma t\u00e9cnica y copiar los certificados a un directorio privado <\/p>\n<pre class=\"inline:true decode:1 \" >\/etc\/prosody\/certs\/<\/pre>\n<p> e indicarle que los tomase de all\u00ed<\/p>\n<pre class=\"lang:lua decode:true \">-- These are the SSL\/TLS-related settings. If you don't want\r\n-- to use SSL\/TLS, you may comment or remove this\r\nssl = { \r\n        key = \"\/etc\/prosody\/certs\/taquiones.net.key\";\r\n        certificate = \"\/etc\/prosody\/certs\/taquiones.net.cert\";\r\n}\r\n<\/pre>\n<h4>Resumiendo<\/h4>\n<p>El programa <em>letsencrypt.sh<\/em> conserva los certificados bajo permisos muy restrictivos y a menos que el servicio funcione como <em>apache<\/em> (arranque como <em>root<\/em>, lea los certificados y luego cambie al usuario normal) ser\u00e1 necesario efectuar una copia tras la renovaci\u00f3n (o la creaci\u00f3n inicial) para que los servidores funcionen. En el resto no he encontrado m\u00e1s problemas.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ya hemos usado un cliente para el proyecto Let&#8217;s Encrypt y hemos habilitado su renovaci\u00f3n autom\u00e1tica as\u00ed que ahora lo que toca es emplearlo en los diferentes servicios del sistema. Los que voy a comentar en esta entrada son: Servidor web Servidor SMTP Servidor IMAP\/POP3 Servidor XMPP Servidor web Apache Para declarar los certificados en [&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":[2],"tags":[75,560,221,554,556,561,553],"class_list":["post-1369","post","type-post","status-publish","format-standard","hentry","category-software","tag-apache","tag-dovecot","tag-exim","tag-lets-encrypt","tag-letsencrypt-sh","tag-prosody","tag-qpsmtpd"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1369","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=1369"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/1369\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=1369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=1369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=1369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}