Veamos en este artículo cómo configurar un certificado SSL que firmaremos nosotros mismos para instalarlo en mi Raspberry Pi con Raspbian y poder acceder a mi servidor bajo https.
Hoy quiero utilizar mi blog como «libreta de apuntes» en la que anotar cómo he configurado un certificado SSL «autofirmado» para poder acceder al servidor de mi Raspberry Pi bajo un acceso https cifrado. Si te es útil me alegro.
Sí conozco Let’s Encrypt y su servicio de certificaciones de certificados gratuitos… quizás dentro de poco lo configure y podrás leer un nuevo artículo, de momento crearemos el certificado sin que lo firme ninguna Agencia Certificadora.
Partimos de la base que tenemos una Raspberry Pi, en mi caso con Raspbian. También ya le hemos puesto en marcha y configurado un servidor, en mi caso con Apache. Y en mi caso también utilizo un servicio de DNS dinámico, yo utilizo nsupdate.info.
Lo primero que tenemos que hacer es crear una carpeta dentro de /etc/apache2/ llamada ssl
sudo mkdir /etc/apache2/ssl
Después crearemos el certificado, válido para 3 años, con el siguiente comando:
sudo openssl req -x509 -nodes -days 1095 -newkey rsa:2048 -out /etc/apache2/ssl/server.crt -keyout /etc/apache2/ssl/server.key
Creará la clave del certificado y además nos realizará varias preguntas. Responderemos a ellas con datos ficticios, menos en la parte en la que nos pide el «Common Name» donde tendremos que meter el dominio que tengamos (si tenemos uno) o en mi caso el dominio que me ofrece mi servicio de DNS dinámico. ¡No sirven direcciones IP!
Generating a 2048 bit RSA private key ………………………+++ ………………………………………………………………+++ writing new private key to ‘/etc/apache2/ssl/server1.key’ —– You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.’, the field will be left blank. —– Country Name (2 letter code) [AU]:ES State or Province Name (full name) [Some-State]:Madrid Locality Name (eg, city) []:Home Organization Name (eg, company) [Internet Widgits Pty Ltd]: Acme.SA Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:midominio.nsupdate.info Email Address []:micorreo@miservicio.com
Todavía no reinicializaremos Apache. Ahora deberemos instalar el servicio SSL para Apache:
sudo a2enmod ssl
Ahora hacemos accesible el sitio ssl creando un enlace simbólico a la carpeta correspondiente:
sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf
Y editamos este archivo de configuración ya sea con el editor micro o nano o el que prefieras:
sudo micro /etc/apache2/sites-enabled/000-default-ssl.conf
Añadiremos estas dos líneas por encima de la línea </VirtualHost>
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
Ahora ya si queremos, reiniciamos el servicio de Apache para que tome en cuenta estas modificaciones:
sudo service apache2 restart
No debemos olvidar, que tenemos que hacer un «port-forwarding» a los puertos 80 y 443. Esto lo realizo en el router de mi casa. En donde redirijo las peticiones exteriores a los puertos 80 y al 443 (entre otros que también tengo configurados) que entren, a los puertos 80 y 443 de la dirección IP local de mi Raspberry Pi.
Con eso ya podríamos acceder mediante https a la dirección de nuestro dominio. Al acceder el navegador nos dará una advertencia, ya que el certificado no está firmado por una agencia certificadora (CA), ya que nos lo hemos «autofirmado».
Aceptamos y añadimos esa excepción cuando visitemos las páginas que sirve nuestro servidor.
Bola Extra: Si como yo también estás corriendo Tiny Tiny RSS en tu servidor, para tener un servicio de feeds, deberás editar el archivo que está en /var/www/html/tt-rss/config.php y en las primeras líneas del archivo de configuración, donde se define:
define('SELF_URL_PATH', http://tu.dominio/tt-rss')
A https para que acceda a la nueva dirección bajo cifrado ssl.
Nada más. Espero que te resulte útil y apuntado queda para tí y para «mi yo» del futuro.
Enlaces de interés
- https://hallard.me/enable-ssl-for-apache-server-in-5-minutes/
- https://the-bionic-cyclist.co.uk/2017/03/22/setup-ssl-on-a-raspberry-pi-in-2-minutes/
———————————————————————–
Hola Victor!
Genial entrada, sobre todo ahora que Google Chrome ha dado el siguiente paso en la batalla contra sitios http (ayer: https://www.adslzone.net/2018/07/24/google-chrome-68-http-https-no-seguras/)
Por cierto, en debian & friends existe un programa llamado a2ensite (incluido al instalar apache2), que hace exactamente eso, crear un link simbólico desde sites-available a sites-enabled. 😉
Es una de las cosas que eché en falta cuando me cambié a openSUSE. (A ver si tengo tiempo, y puedo implementar ese programa para openSUSE algún día)
En realidad a2enmod no instala los módulos, los activa, que en realidad es crear un link simbólico desde mod-available hacia mods-enabled. El módulo debe de estar instalado antes. El módulo SSL suele instalarse por defecto con apache2, pero algunos como proxy y rewrite, no.
¿Micro o nano? ¡vim! 😛
Un saludo.
Hola!
Bueno, lo de Google y los sitios http no me importa tanto como que la comunicación con mi RaspberryPi (nextcloud, etc) este cifrada… nunca sabes quien puede estar escuchando!!:)
Gracias por la info! un placer verte por aquí y que comentes y aportes!
Saludos.
Lo digo por tus lectores.
Imagino que empezará una ola de gente queriendo tener todos sus sitios cifrados y querrán tener como mínimo un certificado autofirmado.
Aunque un certificado autofirmado no es infalible, ya que, al no tener una CA externa, para asegurarse de que nadie está manipulando la conexión y realmente la comunicación es segura, hay que vigilar los «fingerprints». La conexión puede ser cifrada pero insegura, si alguien la ha manipulado 😉
Una solución a ese problema puede ser crear una CA interna, y usarla para firmar los certificados. Entonces, se puede importar/instalar el certificado de la CA interna y, mientras la CA interna esté protegida, ya no hace falta vigilar los «fingerprints» porque el navegador se encargará de ello (confiando en la CA interna)
¡De nada! Es gratificante poder aportar y compartir lo que sabemos 🙂
Un saludo.
¿una ola de gente?
Creo que sobreestimas este pequeño blog!! 🙂
Saludos.
Pues no me queda claro cuando comenzastes con Suse, pues siempre parlas de la versión libre, nunca de la anterior. La primera que yo instalé fue la Suse Linux 5.1 del pc world del año 1998, marzo. Guardo todas las distros, aunque en la mayoría de los casos los cd no dan lectura. Fue mi segunda distro, la primera la instalé el año anterior.
Hola!
no entendí muy bien a qué te refieres en el comentario… 😉
Saludos Eulalio!
El comentario no pertenece a esta entrega, sino a la charla que tuvistes el otro día en ¿El binario? en la que dijistes que siempre has usado Suse, de SO libre, pero siempre nombrabas a las versiones open, y Suse tiene unos cuantos años más. Justo cuando sale la primera libre, que me instalé, yo estaba entrando en Debian. Y la segunda distro que me instalé fue la 5.1 por el 98, hasta Sargen mi distro principal era Suse. La primera, por lógica, fue Slackware., sigo teniendo el cd.
Espero que ahora te resulte claro. Happy hacking!
Fue en Birras y Bits.
Empecé en openSUSE 11.2 la verdad es que me fue muy bien!
Saludos
eso, en cervacitas y bits
Saludos víctor ,buen aporte,debido a mi desconocimiento,tengo instalado wordpress localmente en una odroid c1,pero no veo la pagina correctamente en mi red local debido a que no hay conexión segura,al no tener certificados ssl,que es mejor encriptar apache2 o wordpress, o tengo que instalar un certificado para el servidor y otro para el editor de paginas web wordpress,no se si has trabajado con este ultimo,sin otro menester atentamente el bitmalo.
Hola!
Siento no poder darte una respuesta. No he instalado nunca un wordpress.
No sé si tienes que cifrar tu apache o wordpress…
siento no poder ser de ayuda…
Yo estoy pendiente de añadir un certificado de let’s encrypt.
Saludos…
Genial, estaba buscando precisamente la información de este post para hacer unas pruebas con mi raspberry pi con dns dinámico. Solucionado en 5′. Muchas gracias.
Me alegro si te resultó útil!
Gracias por pasarte y comentar!
Saludos.
Gracias, me he puesto el candadito con tu ayuda y un certificado de ZeroSSL. Me hace gracia lo de “mi yo del futuro” porque yo uso a menudo esa misma justificación para colgar cosas en web.
Mi yo del futuro es la principal motivación del blog! Jejeje
Saludos y gracias por comentar…
Excelente aportación. Después de volmerme tarumba con SSL de TrustCor, he obtenido excelentes resultados con este tuto a la primera. Gracias.
hola!
Me alegro!!
Gracias por comentarlo! 😉