<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>http://educacion.luisantolin.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lantolin</id>
	<title>Recursos Educativos - Contribuciones del usuario [es]</title>
	<link rel="self" type="application/atom+xml" href="http://educacion.luisantolin.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lantolin"/>
	<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php/Especial:Contribuciones/Lantolin"/>
	<updated>2026-05-12T12:47:55Z</updated>
	<subtitle>Contribuciones del usuario</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Jardiner_ia&amp;diff=286</id>
		<title>Jardiner ia</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Jardiner_ia&amp;diff=286"/>
		<updated>2026-03-08T17:26:09Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Control inteligente del riego mediante sensores de humedad a distintas profundidades&lt;br /&gt;
&lt;br /&gt;
== Montaje ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Riego1.webp|marco|alt=conexiones]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Jardiner_ia&amp;diff=285</id>
		<title>Jardiner ia</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Jardiner_ia&amp;diff=285"/>
		<updated>2026-03-08T17:19:43Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Control inteligente del riego mediante sensores de humedad a distintas profundidades  == Montaje ==  alt=conexiones»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Control inteligente del riego mediante sensores de humedad a distintas profundidades&lt;br /&gt;
&lt;br /&gt;
== Montaje ==&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Riego1.webp|miniaturadeimagen|alt=conexiones]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Archivo:Riego1.webp&amp;diff=284</id>
		<title>Archivo:Riego1.webp</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Archivo:Riego1.webp&amp;diff=284"/>
		<updated>2026-03-08T17:19:30Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;conexiones&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=P%C3%A1gina_principal&amp;diff=283</id>
		<title>Página principal</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=P%C3%A1gina_principal&amp;diff=283"/>
		<updated>2026-03-08T17:13:16Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Colección de recursos relacionados con la educación, la docencia, y la tecnología.&lt;br /&gt;
&lt;br /&gt;
[[Especial:Todas|Todas las páginas]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Me_dan_un_C1_si_no_saco_el_C2_por_poco&amp;diff=282</id>
		<title>Me dan un C1 si no saco el C2 por poco</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Me_dan_un_C1_si_no_saco_el_C2_por_poco&amp;diff=282"/>
		<updated>2025-04-03T08:46:24Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OJO con esto. Sucede lo mismo con el examen C1 y el B2.&lt;br /&gt;
&lt;br /&gt;
Resumen: Cambridge &amp;quot;acredita que tienes las habilidades para alcanzar un C1&amp;quot;, pero NO te da un Certificado C1 completo y con todas las de la ley. Te da algo similar pero que no es lo mismo. Esto es importante porque en entornos muy oficiales (oposiciones, trabajo público, etc.) ese certificado NO vale.&lt;br /&gt;
&lt;br /&gt;
Fuente: [https://www.cambridgeenglish.org/exams-and-tests/proficiency/results/ Página de Cambridge]&lt;br /&gt;
&lt;br /&gt;
Capturas de pantalla (abr-2025):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Results.png|miniaturadeimagen]]&lt;br /&gt;
&lt;br /&gt;
Ojo a como está dicho: &amp;quot;certificate stating that you demonstrated ability at Level C1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ejemplo: no es lo mismo un certificado que dice que &amp;quot;has demostrado las habilidades suficientes para ganar el oro en las Olimpiadas&amp;quot; que un certificado que dice que &#039;&#039;&#039;has ganado el oro en las Olimpiadas&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Niveles.png|miniaturadeimagen]]&lt;br /&gt;
&lt;br /&gt;
Nótese los colores, el C2 y sus dos grados están en azul oscuro (lo bueno) y lo demás en otro color.&lt;br /&gt;
&lt;br /&gt;
[[Category:Inglés]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Me_dan_un_C1_si_no_saco_el_C2_por_poco&amp;diff=281</id>
		<title>Me dan un C1 si no saco el C2 por poco</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Me_dan_un_C1_si_no_saco_el_C2_por_poco&amp;diff=281"/>
		<updated>2025-04-03T08:42:58Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «OJO con esto.  Sucede lo mismo con el examen C1 y el B2.  Resumen: Cambridge &amp;quot;acredita que tienes las habilidades para alcanzar un C1&amp;quot;, pero no te da un Certificado C1 completo y con todas las de la ley. Te da algo similar pero no es lo mismo. Esto es importante porque en entornos muy oficiales (oposiciones, trabajo público, etc.) ese certificado NO vale.  Fuente: [https://www.cambridgeenglish.org/exams-and-tests/proficiency/results/]  Capturas de pantalla (abr-2025)…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OJO con esto.&lt;br /&gt;
&lt;br /&gt;
Sucede lo mismo con el examen C1 y el B2.&lt;br /&gt;
&lt;br /&gt;
Resumen: Cambridge &amp;quot;acredita que tienes las habilidades para alcanzar un C1&amp;quot;, pero no te da un Certificado C1 completo y con todas las de la ley. Te da algo similar pero no es lo mismo. Esto es importante porque en entornos muy oficiales (oposiciones, trabajo público, etc.) ese certificado NO vale.&lt;br /&gt;
&lt;br /&gt;
Fuente: [https://www.cambridgeenglish.org/exams-and-tests/proficiency/results/]&lt;br /&gt;
&lt;br /&gt;
Capturas de pantalla (abr-2025):&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Results.png|miniaturadeimagen]]&lt;br /&gt;
&lt;br /&gt;
Ojo a como está dicho &amp;quot;certificate stating that you demonstrated ability at Level C1&amp;quot;, no es lo mismo un certificado que dice que has demostrado las habilidades suficientes para ganar la Olimpiada que un certificado que dice que &#039;&#039;&#039;has ganado la Olimpiada&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Niveles.png|miniaturadeimagen]]&lt;br /&gt;
&lt;br /&gt;
Nótese los colores, el C2 y sus dos grados están en azul oscuro (lo bueno) y lo demás en otro color.&lt;br /&gt;
&lt;br /&gt;
[[Category:Inglés]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Archivo:Niveles.png&amp;diff=280</id>
		<title>Archivo:Niveles.png</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Archivo:Niveles.png&amp;diff=280"/>
		<updated>2025-04-03T08:39:45Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Niveles&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Archivo:Results.png&amp;diff=279</id>
		<title>Archivo:Results.png</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Archivo:Results.png&amp;diff=279"/>
		<updated>2025-04-03T08:39:03Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Captura de pantalla&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Reservas_de_IP_en_DHCP_VirtualBox&amp;diff=278</id>
		<title>Reservas de IP en DHCP VirtualBox</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Reservas_de_IP_en_DHCP_VirtualBox&amp;diff=278"/>
		<updated>2024-11-21T12:08:25Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Problema: quiero hacer reservas MAC:IP en el servidor DHCP de VirtualBox, por ejemplo para que el adaptador Host Only de las IPs que yo quiero.   vboxmanage dhcpserver modify --interface=vboxnet0 --mac-address=08:00:27:00:00:06 --fixed-address 192.168.56.6  Ojo, si es para un interfaz Host Only hay que usar &amp;lt;code&amp;gt;--interface&amp;lt;/code&amp;gt;, para otros es &amp;lt;code&amp;gt;--network&amp;lt;/code&amp;gt;  Esto escribirá en el fichero &amp;lt;code&amp;gt;$HOME/.config/VirtualBox/VirtualBox.xml&amp;lt;/code&amp;gt; que a su vez gen…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: quiero hacer reservas MAC:IP en el servidor DHCP de VirtualBox, por ejemplo para que el adaptador Host Only de las IPs que yo quiero.&lt;br /&gt;
&lt;br /&gt;
 vboxmanage dhcpserver modify --interface=vboxnet0 --mac-address=08:00:27:00:00:06 --fixed-address 192.168.56.6&lt;br /&gt;
&lt;br /&gt;
Ojo, si es para un interfaz Host Only hay que usar &amp;lt;code&amp;gt;--interface&amp;lt;/code&amp;gt;, para otros es &amp;lt;code&amp;gt;--network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esto escribirá en el fichero &amp;lt;code&amp;gt;$HOME/.config/VirtualBox/VirtualBox.xml&amp;lt;/code&amp;gt; que a su vez genera el &amp;lt;code&amp;gt;HostInterfaceNetworking-vboxnet0-Dhcpd.config&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OJO con modificar directamente estos ficheros, el 2o es generado, y además si están los servicios de VirtualBox levantados pueden sobreescribirlos.&lt;br /&gt;
&lt;br /&gt;
OJO también que hay un fichero de leases en &amp;lt;code&amp;gt;HostInterfaceNetworking-vboxnet0-Dhcpd.leases&amp;lt;/code&amp;gt;, con los servicios parados se puede borrar. También hay ficheros &amp;lt;code&amp;gt;.prev&amp;lt;/code&amp;gt; que no se bien que pintan.&lt;br /&gt;
&lt;br /&gt;
Los servicios de VirtualBox se paran (VB 7.0.22 sobre Debian 12.8) teniendo todas las VMs paradas con:&lt;br /&gt;
&lt;br /&gt;
 systemctl stop vboxdrv.service&lt;br /&gt;
&lt;br /&gt;
[[Category:Tecnologia]]&lt;br /&gt;
[[Category:Redes]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=277</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=277"/>
		<updated>2024-07-16T11:20:20Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP y/o IP fija&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/fija.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=10.1.10.9/24&lt;br /&gt;
 Gateway=10.1.10.1&lt;br /&gt;
 DNS=10.1.10.1&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
&lt;br /&gt;
OJO: en debian, antes de hacer esta parte, la migracion de DNS, asegurate de que tu sistema tiene instalado el paquete &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt; porque si haces esto te quedas sin DNS y no podrás instalar paquetes de la red.&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Si está &amp;lt;code&amp;gt;NetworkManager&amp;lt;/code&amp;gt; instalado (entornos gráficos), necesitarás tambien pararlo.&lt;br /&gt;
&lt;br /&gt;
 systemctl stop NetworkManager.service&lt;br /&gt;
 systemctl disable NetworkManager.service&lt;br /&gt;
&lt;br /&gt;
Nota: tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo si se usa el cliente DHCP &amp;lt;code&amp;gt;dhclient&amp;lt;/code&amp;gt; era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
En IPFire se usa el cliente &amp;lt;code&amp;gt;dhcpcd&amp;lt;/code&amp;gt; y en ese habia que tocar el fichero &amp;lt;code&amp;gt;dhcpcd.conf&amp;lt;/code&amp;gt; y en el propio fichero vienen las instrucciones.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Acostumbrarse_a_los_nuevos_comandos_Linux&amp;diff=276</id>
		<title>Acostumbrarse a los nuevos comandos Linux</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Acostumbrarse_a_los_nuevos_comandos_Linux&amp;diff=276"/>
		<updated>2024-06-25T11:03:01Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: eres un administrador de sistemas &amp;quot;old-school&amp;quot; y estás acostumbrado a comandos como &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipconfig&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt;, etc. Estos comandos o han desaparecido o les falta poco. Tienes que irte acostumbrando a usar sus sustitutos.&lt;br /&gt;
&lt;br /&gt;
Solución: aquí me apunto algunos que siempre se me olvidan.&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;listar los mensajes del kernel&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;journalctl --dmesg&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k -S today&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar el runlevel por defecto&#039;&#039;&#039;&lt;br /&gt;
* Antes: lo mirabas en &amp;lt;code&amp;gt;/etc/initab&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;systemctl get-default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar el runlevel actual&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;runlevel&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: no tiene sentido actualmente, se supone que si el sistema está &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; es que ha alcanzado su &amp;lt;code&amp;gt;default.target&amp;lt;/code&amp;gt;, puedes consultar los target con &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt; sin argumentos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar la tabla ARP&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;arp&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;ip neighbor&amp;lt;/code&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Acostumbrarse_a_los_nuevos_comandos_Linux&amp;diff=275</id>
		<title>Acostumbrarse a los nuevos comandos Linux</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Acostumbrarse_a_los_nuevos_comandos_Linux&amp;diff=275"/>
		<updated>2024-06-25T11:02:05Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: eres un administrador de sistemas &amp;quot;old-school&amp;quot; y estás acostumbrado a comandos como &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipconfig&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt;, etc. Estos comandos o han desaparecido o les falta poco. Tienes que irte acostumbrando a usar sus sustitutos.&lt;br /&gt;
&lt;br /&gt;
Solución: aquí me apunto algunos que siempre se me olvidan.&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;listar los mensajes del kernel&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;journalctl --dmesg&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k -S today&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar el runlevel por defecto&#039;&#039;&#039;&lt;br /&gt;
* Antes: lo mirabas en &amp;lt;code&amp;gt;/etc/initab&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;systemctl get-default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar el runlevel actual&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;runlevel&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: no tiene sentido actualmente, se supone que si el sistema está &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; es que ha alcanzado su &amp;lt;code&amp;gt;default.target&amp;lt;/code&amp;gt;, puedes consultar los target con &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt; sin argumentos.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Acostumbrarse_a_los_nuevos_comandos_Linux&amp;diff=274</id>
		<title>Acostumbrarse a los nuevos comandos Linux</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Acostumbrarse_a_los_nuevos_comandos_Linux&amp;diff=274"/>
		<updated>2024-06-25T11:01:26Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Problema: eres un administrador de sistemas &amp;quot;old-school&amp;quot; y estás acostumbrado a comandos como &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipconfig&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt;, etc. Estos comandos o han desaparecido o les falta poco. Tienes que irte acostumbrando a usar sus sustitutos.  Solución: aquí me apunto algunos que siempre se me olvidan.  * Uso: &amp;#039;&amp;#039;&amp;#039;listar los mensajes del kernel&amp;#039;&amp;#039;&amp;#039; * Antes: &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt; * Ahora: &amp;lt;code&amp;gt;journalctl --dmesg&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k&amp;lt;/co…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: eres un administrador de sistemas &amp;quot;old-school&amp;quot; y estás acostumbrado a comandos como &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ipconfig&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service&amp;lt;/code&amp;gt;, etc. Estos comandos o han desaparecido o les falta poco. Tienes que irte acostumbrando a usar sus sustitutos.&lt;br /&gt;
&lt;br /&gt;
Solución: aquí me apunto algunos que siempre se me olvidan.&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;listar los mensajes del kernel&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;journalctl --dmesg&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;journalctl -k -S today&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar el runlevel por defecto&#039;&#039;&#039;&lt;br /&gt;
* Antes: lo mirabas en &amp;lt;code&amp;gt;/etc/initab&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: &amp;lt;code&amp;gt;systemctl get-default&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Uso: &#039;&#039;&#039;consultar el runlevel por actual&#039;&#039;&#039;&lt;br /&gt;
* Antes: &amp;lt;code&amp;gt;runlevel&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ahora: no tiene sentido actualmente, se supone que si el sistema está &amp;lt;code&amp;gt;running&amp;lt;/code&amp;gt; es que ha alcanzado su &amp;lt;code&amp;gt;default.target&amp;lt;/code&amp;gt;, puedes consultar los target con &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt; sin argumentos.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Detector_de_mentiras_con_arduino&amp;diff=273</id>
		<title>Detector de mentiras con arduino</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Detector_de_mentiras_con_arduino&amp;diff=273"/>
		<updated>2024-06-01T08:38:17Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: /* Construcción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Fase de investigación ==&lt;br /&gt;
&lt;br /&gt;
Buscar en Google &amp;quot;detector de mentiras arduino&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La mayoría de resultados refieren a este [https://create.arduino.cc/projecthub/BuildItDR/arduino-lie-detector-a0b914 artículo de create.arduino.cc].&lt;br /&gt;
&lt;br /&gt;
El proyecto en si es muy fácil. No es mas que una lectura de una señal analógica, visualizar la lectura usando el &amp;quot;Serial Plotter&amp;quot; del IDE de Arduino, calibrar tres niveles, y un simple IF que enciende 3 LEDs.&lt;br /&gt;
&lt;br /&gt;
Vamos a probarlo.&lt;br /&gt;
&lt;br /&gt;
== Requisitos y materiales ==&lt;br /&gt;
&lt;br /&gt;
Siempre interesa tener actualizado el IDE y las librerías, uso IDE 1.8.5 y librerias y placas actualizadas a día de hoy (Abr 2018). No se puede hacer con IDEs muy antiguos porque no traian el Serial Plotter.&lt;br /&gt;
&lt;br /&gt;
Materiales, aparte de lo obvio (arduino, cables, etc)&lt;br /&gt;
&lt;br /&gt;
* 3 LEDs (no son estrictamente necesarios)&lt;br /&gt;
* Papel de aluminio&lt;br /&gt;
* Esparadrapo o similar&lt;br /&gt;
* Resistencias variadas, entre 2K y 10K.&lt;br /&gt;
* Cables de cobre multifilamento (mejor que monofilamento) para los sensores, para que hagan mejor contacto&lt;br /&gt;
&lt;br /&gt;
== Construcción ==&lt;br /&gt;
&lt;br /&gt;
El artículo lo hace con el [https://store.arduino.cc/arduino-nano arduino nano], yo lo hice con el [https://www.arduino.cc/en/Main/ArduinoBoardDuemilanove duemilanove], para el caso debería dar lo mismo.&lt;br /&gt;
&lt;br /&gt;
El cableado es muy similar al de el artículo, pero para mi montaje la resistencia de 2K que propone no me daba apenas variaciones en el gráfico, funcionó mucho mejor con una de 10K.&lt;br /&gt;
&lt;br /&gt;
Los cables negro/blanco y rojo/blanco en el esquema van a los sensores de aluminio. Interesa que sean cables multi-filamento.&lt;br /&gt;
&lt;br /&gt;
Para el contacto entre los cables multi-filamento y los sensores no hace falta complicarse, si dejamos la tira de aluminio un poco tensa con ayuda del esparadrapo, el cable se sujeta solo entre el aluminio y el dedo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Detector bb.png|500px]]&lt;br /&gt;
&lt;br /&gt;
OJO: el diagrama de arribe tiene un error, los dos cables negros verticales no van a VCC, van a tierra, es decir no terminan en la fila de más abajo (VCC) sino en la penúltima (GND).&lt;br /&gt;
&lt;br /&gt;
Algunas imágenes más que ilustran el montaje y los sensores.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=240px&amp;gt;&lt;br /&gt;
Archivo:Serial plotter.png|Serial Plotter&lt;br /&gt;
Archivo:Cable multifilamento.jpg|Cable multifilamento&lt;br /&gt;
Archivo:Detector03.jpg|Detalle de los sensores&lt;br /&gt;
Archivo:Detector02.jpg|Los sensores en los dedos&lt;br /&gt;
Archivo:Detector04.jpg|Detalle del montaje&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
int NIVEL_VERDE=75;&lt;br /&gt;
int NIVEL_AMARILLO=80;&lt;br /&gt;
int NIVEL_ROJO=95;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(2, OUTPUT);&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  digitalWrite(3, HIGH);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  digitalWrite(4, HIGH);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  int lectura = analogRead(A0);&lt;br /&gt;
  if ( lectura &amp;gt; NIVEL_ROJO)&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(4, HIGH);&lt;br /&gt;
    digitalWrite(3, HIGH);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( lectura &amp;gt; NIVEL_AMARILLO)&lt;br /&gt;
    {&lt;br /&gt;
    digitalWrite(4, LOW);&lt;br /&gt;
    digitalWrite(3, HIGH);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if ( lectura &amp;gt; NIVEL_VERDE)&lt;br /&gt;
      {&lt;br /&gt;
        digitalWrite(4, LOW);&lt;br /&gt;
        digitalWrite(3, LOW);&lt;br /&gt;
        digitalWrite(2, HIGH);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        digitalWrite(4, LOW);&lt;br /&gt;
        digitalWrite(3, LOW);&lt;br /&gt;
        digitalWrite(2, LOW);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(lectura);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usandolo ==&lt;br /&gt;
&lt;br /&gt;
A mi como detector de mentiras ... pues no funcionó, no detectaba variaciones, ni muchas ni pocas, estaba la gráfica plana.&lt;br /&gt;
&lt;br /&gt;
La manera mas interesante que encontré de generar variaciones fue con presión. Poniendo la mano en el borde de la mesa y apretando los electrodos y soltando se generaba la siguiente gráfica.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Detector01.png|800px]]&lt;br /&gt;
&lt;br /&gt;
De forma consistente, con la mano relajada esta en torno a los 70 y con ella apretada entre 90 y 100. Ajustando los valores de las variables globales &amp;lt;code&amp;gt;NIVEL_VERDE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NIVEL_AMARILLO&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;NIVEL_ROJO&amp;lt;/code&amp;gt; puedes jugar a ir encendiendo y apagando los LEDs con la presión de la mano. Otro experimento posible y curioso es jugar con otras variables corporales y ver como influyen en la gráfica, por ejemplo a mi me funcionó con la respiración, respirando fuerte y rápido se observaban cambios en la gráfica con respecto a la respiración en reposo.&lt;br /&gt;
&lt;br /&gt;
Cosas que influyen en los valores que obtenemos y sobre todo en lo que interesa, que es que se muevan en vez de permanecer plano, es decir con que tenemos que jugar si la grafica apenas se mueve:&lt;br /&gt;
&lt;br /&gt;
* construcción de los sensores, que esten apretados, que el contacto con el cable sea bueno, su tamaño, etc&lt;br /&gt;
* el valor de la resistencia&lt;br /&gt;
&lt;br /&gt;
¡Ale, a jugar y a pasarlo bien!&lt;br /&gt;
&lt;br /&gt;
[[Category:Arduino]]&lt;br /&gt;
[[Category:Circuitos]]&lt;br /&gt;
[[Category:3oESO]]&lt;br /&gt;
[[Category:4oESO]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Detector_de_mentiras_con_arduino&amp;diff=272</id>
		<title>Detector de mentiras con arduino</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Detector_de_mentiras_con_arduino&amp;diff=272"/>
		<updated>2024-06-01T08:38:00Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: /* Construcción */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Fase de investigación ==&lt;br /&gt;
&lt;br /&gt;
Buscar en Google &amp;quot;detector de mentiras arduino&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La mayoría de resultados refieren a este [https://create.arduino.cc/projecthub/BuildItDR/arduino-lie-detector-a0b914 artículo de create.arduino.cc].&lt;br /&gt;
&lt;br /&gt;
El proyecto en si es muy fácil. No es mas que una lectura de una señal analógica, visualizar la lectura usando el &amp;quot;Serial Plotter&amp;quot; del IDE de Arduino, calibrar tres niveles, y un simple IF que enciende 3 LEDs.&lt;br /&gt;
&lt;br /&gt;
Vamos a probarlo.&lt;br /&gt;
&lt;br /&gt;
== Requisitos y materiales ==&lt;br /&gt;
&lt;br /&gt;
Siempre interesa tener actualizado el IDE y las librerías, uso IDE 1.8.5 y librerias y placas actualizadas a día de hoy (Abr 2018). No se puede hacer con IDEs muy antiguos porque no traian el Serial Plotter.&lt;br /&gt;
&lt;br /&gt;
Materiales, aparte de lo obvio (arduino, cables, etc)&lt;br /&gt;
&lt;br /&gt;
* 3 LEDs (no son estrictamente necesarios)&lt;br /&gt;
* Papel de aluminio&lt;br /&gt;
* Esparadrapo o similar&lt;br /&gt;
* Resistencias variadas, entre 2K y 10K.&lt;br /&gt;
* Cables de cobre multifilamento (mejor que monofilamento) para los sensores, para que hagan mejor contacto&lt;br /&gt;
&lt;br /&gt;
== Construcción ==&lt;br /&gt;
&lt;br /&gt;
El artículo lo hace con el [https://store.arduino.cc/arduino-nano arduino nano], yo lo hice con el [https://www.arduino.cc/en/Main/ArduinoBoardDuemilanove duemilanove], para el caso debería dar lo mismo.&lt;br /&gt;
&lt;br /&gt;
El cableado es muy similar al de el artículo, pero para mi montaje la resistencia de 2K que propone no me daba apenas variaciones en el gráfico, funcionó mucho mejor con una de 10K.&lt;br /&gt;
&lt;br /&gt;
Los cables negro/blanco y rojo/blanco en el esquema van a los sensores de aluminio. Interesa que sean cables multi-filamento.&lt;br /&gt;
&lt;br /&gt;
Para el contacto entre los cables multi-filamento y los sensores no hace falta complicarse, si dejamos la tira de aluminio un poco tensa con ayuda del esparadrapo, el cable se sujeta solo entre el aluminio y el dedo.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Detector bb.png|500px]]&lt;br /&gt;
&lt;br /&gt;
OJO: el diagrama de arribe tiene un error, los dos cables negros verticales de la derecha no van a VCC, van a tierra, es decir no terminan en la fila de más abajo (VCC) sino en la penúltima (GND).&lt;br /&gt;
&lt;br /&gt;
Algunas imágenes más que ilustran el montaje y los sensores.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; heights=240px&amp;gt;&lt;br /&gt;
Archivo:Serial plotter.png|Serial Plotter&lt;br /&gt;
Archivo:Cable multifilamento.jpg|Cable multifilamento&lt;br /&gt;
Archivo:Detector03.jpg|Detalle de los sensores&lt;br /&gt;
Archivo:Detector02.jpg|Los sensores en los dedos&lt;br /&gt;
Archivo:Detector04.jpg|Detalle del montaje&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Código ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot; line&amp;gt;&lt;br /&gt;
int NIVEL_VERDE=75;&lt;br /&gt;
int NIVEL_AMARILLO=80;&lt;br /&gt;
int NIVEL_ROJO=95;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(2, OUTPUT);&lt;br /&gt;
  pinMode(3, OUTPUT);&lt;br /&gt;
  pinMode(4, OUTPUT);&lt;br /&gt;
  digitalWrite(2, HIGH);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  digitalWrite(3, HIGH);&lt;br /&gt;
  delay(500);&lt;br /&gt;
  digitalWrite(4, HIGH);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  int lectura = analogRead(A0);&lt;br /&gt;
  if ( lectura &amp;gt; NIVEL_ROJO)&lt;br /&gt;
  {&lt;br /&gt;
    digitalWrite(4, HIGH);&lt;br /&gt;
    digitalWrite(3, HIGH);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( lectura &amp;gt; NIVEL_AMARILLO)&lt;br /&gt;
    {&lt;br /&gt;
    digitalWrite(4, LOW);&lt;br /&gt;
    digitalWrite(3, HIGH);&lt;br /&gt;
    digitalWrite(2, HIGH);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      if ( lectura &amp;gt; NIVEL_VERDE)&lt;br /&gt;
      {&lt;br /&gt;
        digitalWrite(4, LOW);&lt;br /&gt;
        digitalWrite(3, LOW);&lt;br /&gt;
        digitalWrite(2, HIGH);&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
        digitalWrite(4, LOW);&lt;br /&gt;
        digitalWrite(3, LOW);&lt;br /&gt;
        digitalWrite(2, LOW);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  Serial.println(lectura);&lt;br /&gt;
  delay(20);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usandolo ==&lt;br /&gt;
&lt;br /&gt;
A mi como detector de mentiras ... pues no funcionó, no detectaba variaciones, ni muchas ni pocas, estaba la gráfica plana.&lt;br /&gt;
&lt;br /&gt;
La manera mas interesante que encontré de generar variaciones fue con presión. Poniendo la mano en el borde de la mesa y apretando los electrodos y soltando se generaba la siguiente gráfica.&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Detector01.png|800px]]&lt;br /&gt;
&lt;br /&gt;
De forma consistente, con la mano relajada esta en torno a los 70 y con ella apretada entre 90 y 100. Ajustando los valores de las variables globales &amp;lt;code&amp;gt;NIVEL_VERDE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NIVEL_AMARILLO&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;NIVEL_ROJO&amp;lt;/code&amp;gt; puedes jugar a ir encendiendo y apagando los LEDs con la presión de la mano. Otro experimento posible y curioso es jugar con otras variables corporales y ver como influyen en la gráfica, por ejemplo a mi me funcionó con la respiración, respirando fuerte y rápido se observaban cambios en la gráfica con respecto a la respiración en reposo.&lt;br /&gt;
&lt;br /&gt;
Cosas que influyen en los valores que obtenemos y sobre todo en lo que interesa, que es que se muevan en vez de permanecer plano, es decir con que tenemos que jugar si la grafica apenas se mueve:&lt;br /&gt;
&lt;br /&gt;
* construcción de los sensores, que esten apretados, que el contacto con el cable sea bueno, su tamaño, etc&lt;br /&gt;
* el valor de la resistencia&lt;br /&gt;
&lt;br /&gt;
¡Ale, a jugar y a pasarlo bien!&lt;br /&gt;
&lt;br /&gt;
[[Category:Arduino]]&lt;br /&gt;
[[Category:Circuitos]]&lt;br /&gt;
[[Category:3oESO]]&lt;br /&gt;
[[Category:4oESO]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_de_modphp_a_fpm&amp;diff=271</id>
		<title>Migrar de modphp a fpm</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_de_modphp_a_fpm&amp;diff=271"/>
		<updated>2024-01-01T13:36:59Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Problema: usas PHP en Apache, y usas el bueno y viejo &amp;lt;code&amp;gt;mod_php&amp;lt;/code&amp;gt;, pero quieres ir más allá y pasarte a una arquitectura FastCGI  Aquí dejo mis notas de cuando lo hice. Estamos hablando de 2023 y Debian 11, quizás 12.   a2dismod mpm_worker mpm_prefork  a2enmod proxy_fcgi mpm_prefork setenvif  a2enconf php8.2-fpm  a2dismod php8.2   apt install php-fpm  Integracion con Munin, tomada de [https://github.com/morbz-archive/munin-php-fpm Munin FPM]   cd /usr/sha…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas PHP en Apache, y usas el bueno y viejo &amp;lt;code&amp;gt;mod_php&amp;lt;/code&amp;gt;, pero quieres ir más allá y pasarte a una arquitectura FastCGI&lt;br /&gt;
&lt;br /&gt;
Aquí dejo mis notas de cuando lo hice. Estamos hablando de 2023 y Debian 11, quizás 12.&lt;br /&gt;
&lt;br /&gt;
 a2dismod mpm_worker mpm_prefork&lt;br /&gt;
 a2enmod proxy_fcgi mpm_prefork setenvif&lt;br /&gt;
 a2enconf php8.2-fpm&lt;br /&gt;
 a2dismod php8.2&lt;br /&gt;
&lt;br /&gt;
 apt install php-fpm&lt;br /&gt;
&lt;br /&gt;
Integracion con Munin, tomada de [https://github.com/morbz-archive/munin-php-fpm Munin FPM]&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/munin/plugins/&lt;br /&gt;
 wget -O php-fpm https://raw.github.com/MorbZ/munin-php-fpm/master/php-fpm.php&lt;br /&gt;
 chmod +x php-fpm&lt;br /&gt;
 ln -s /usr/share/munin/plugins/php-fpm /etc/munin/plugins/php-fpm-memory&lt;br /&gt;
 ln -s /usr/share/munin/plugins/php-fpm /etc/munin/plugins/php-fpm-cpu&lt;br /&gt;
 ln -s /usr/share/munin/plugins/php-fpm /etc/munin/plugins/php-fpm-count&lt;br /&gt;
 ln -s /usr/share/munin/plugins/php-fpm /etc/munin/plugins/php-fpm-time&lt;br /&gt;
 service munin-node restart&lt;br /&gt;
&lt;br /&gt;
Ajustes habituales en el fichero: &amp;lt;code&amp;gt;/etc/php/8.2/fpm/php.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 memory_limit = 128M&lt;br /&gt;
 post_max_size = 21M&lt;br /&gt;
 upload_max_filesize = 20M&lt;br /&gt;
&lt;br /&gt;
Otros ajustes en &amp;lt;code&amp;gt;/etc/php/8.2/fpm/pool.d/www.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 systemctl restart php8.2-fpm.service&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Calcular_el_hash_de_un_password_usando_yescrypt_y_una_salt&amp;diff=270</id>
		<title>Calcular el hash de un password usando yescrypt y una salt</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Calcular_el_hash_de_un_password_usando_yescrypt_y_una_salt&amp;diff=270"/>
		<updated>2023-04-14T12:52:27Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «&amp;#039;&amp;#039;&amp;#039;Problema:&amp;#039;&amp;#039;&amp;#039; necesitas calcular el valor del hash de un password en Linux con un valor de SALT predecible, por ejemplo para meter ese valor directamente en &amp;lt;code&amp;gt;/etc/sh…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Problema:&#039;&#039;&#039; necesitas calcular el valor del hash de un password en Linux con un valor de SALT predecible, por ejemplo para meter ese valor directamente en &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;. Recientemente algunas distribuciones como Debian 11 han empezado a usar yescrypt y esto lo hace mucho más dificil. Intentas usar &amp;lt;code&amp;gt;mkdpasswd&amp;lt;/code&amp;gt; pero no hay manera.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solución:&#039;&#039;&#039; puedes usar alguno de los métodos que se proponen como la librería &amp;lt;code&amp;gt;crypt&amp;lt;/code&amp;gt; accedida a través de Perl o Python, pero vamos a usar &amp;lt;code&amp;gt;mkpasswd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lo que sucede es que la documentación de &amp;lt;code&amp;gt;mkpasswd&amp;lt;/code&amp;gt; está muy mal explicada y el nombre de los parámetros es confuso. Donde dice SALT tienes que meter mucho más que eso, tienes que meter el método, los parámetros y la SALT.&lt;br /&gt;
&lt;br /&gt;
Lo intutivo leyendo la documentación sería:&lt;br /&gt;
&lt;br /&gt;
 mkpasswd --method=yescrypt --salt=&#039;/kuoWIs/HW3B2GAIYjr3T0&#039; contrasenya&lt;br /&gt;
&lt;br /&gt;
Pero si haces eso no fufa, te dice:&lt;br /&gt;
&lt;br /&gt;
 Wrong salt length: 22 bytes when 0 expected.&lt;br /&gt;
&lt;br /&gt;
Si no usas SALT, entonces si va, pero eso no es lo que queremos, queremos un hash predecible.&lt;br /&gt;
&lt;br /&gt;
 mkpasswd --method=yescrypt contrasenya&lt;br /&gt;
 $y$j9T$uLmXYmWNvc.fmCpkBGV4D/$hGHWY2pCmnH6CMon864rM.fjCsrFrNT6G9wIUj56a8B&lt;br /&gt;
&lt;br /&gt;
Solución: tienes que poner en SALT también el método y los parámetros, es decir añadir &amp;lt;code&amp;gt;$y$j9T$&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Asi si que funciona:&lt;br /&gt;
&lt;br /&gt;
 mkpasswd --method=yescrypt --salt=&#039;$y$j9T$/kuoWIs/HW3B2GAIYjr3T0&#039; contrasenya&lt;br /&gt;
 $y$j9T$/kuoWIs/HW3B2GAIYjr3T0$8bWIcutUs1QftN1c0wgDD8yqc8KOfDWqxCt7md9kEg0&lt;br /&gt;
&lt;br /&gt;
Si quieres hacerte un script de Bash sería algo asi:&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 PASSWORD=$1&lt;br /&gt;
 SALT=$2&lt;br /&gt;
 &lt;br /&gt;
 mkpasswd -m yescrypt -S &amp;quot;\$y\$j9T\$${SALT}&amp;quot; &amp;quot;${PASSWORD}&amp;quot;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=269</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=269"/>
		<updated>2022-12-15T14:27:06Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP y/o IP fija&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/fija.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=10.1.10.9/24&lt;br /&gt;
 Gateway=10.1.10.1&lt;br /&gt;
 DNS=10.1.10.1&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Si está &amp;lt;code&amp;gt;NetworkManager&amp;lt;/code&amp;gt; instalado (entornos gráficos), necesitarás tambien pararlo.&lt;br /&gt;
&lt;br /&gt;
 systemctl stop NetworkManager.service&lt;br /&gt;
 systemctl disable NetworkManager.service&lt;br /&gt;
&lt;br /&gt;
Nota: tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo si se usa el cliente DHCP &amp;lt;code&amp;gt;dhclient&amp;lt;/code&amp;gt; era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
En IPFire se usa el cliente &amp;lt;code&amp;gt;dhcpcd&amp;lt;/code&amp;gt; y en ese habia que tocar el fichero &amp;lt;code&amp;gt;dhcpcd.conf&amp;lt;/code&amp;gt; y en el propio fichero vienen las instrucciones.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=268</id>
		<title>Leer un fichero linea a linea en BASH</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=268"/>
		<updated>2022-10-20T10:43:05Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: tengo un fichero con líneas de texto que contienen espacios, por ejemplo nombres de directorios, quiero hacer un bucle de BASH que vaya creando esos directorios&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 while read l; do mkdir &amp;quot;$l&amp;quot; ; done &amp;lt; directorios.txt&lt;br /&gt;
&lt;br /&gt;
Referencia: [http://mywiki.wooledge.org/BashFAQ/001 How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?]&lt;br /&gt;
&lt;br /&gt;
Referencia: [https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable Read a file line by line assigning the value to a variable]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=267</id>
		<title>Leer un fichero linea a linea en BASH</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=267"/>
		<updated>2022-10-20T10:19:15Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Un titulo =&lt;br /&gt;
&lt;br /&gt;
Problema: tengo un fichero con líneas de texto que contienen espacios, por ejemplo nombres de directorios, quiero hacer un bucle de BASH que vaya creando esos directorios&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 while read l; do mkdir &amp;quot;$l&amp;quot; ; done &amp;lt; directorios.txt&lt;br /&gt;
&lt;br /&gt;
Referencia: [http://mywiki.wooledge.org/BashFAQ/001 How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?]&lt;br /&gt;
&lt;br /&gt;
Referencia: [https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable Read a file line by line assigning the value to a variable]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=266</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=266"/>
		<updated>2022-06-06T11:25:24Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP y/o IP fija&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/fija.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=10.1.10.9/24&lt;br /&gt;
 Gateway=10.1.10.1&lt;br /&gt;
 DNS=10.1.10.1&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Si está &amp;lt;code&amp;gt;NetworkManager&amp;lt;/code&amp;gt; instalado (entornos gráficos), necesitarás tambien pararlo.&lt;br /&gt;
&lt;br /&gt;
 systemctl stop NetworkManager.service&lt;br /&gt;
 systemctl disable NetworkManager.service&lt;br /&gt;
&lt;br /&gt;
Nota: tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=265</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=265"/>
		<updated>2022-06-06T11:24:42Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP y/o IP fija&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/fija.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=10.1.10.9/24&lt;br /&gt;
 Gateway=10.1.10.1&lt;br /&gt;
 DNS=10.1.10.1&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Si está NetworkManager instalado (entornos gráficos), necesitarás tambien pararlo.&lt;br /&gt;
&lt;br /&gt;
 systemctl stop NetworkManager.service&lt;br /&gt;
 systemctl disable NetworkManager.service&lt;br /&gt;
&lt;br /&gt;
Tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=264</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=264"/>
		<updated>2022-06-06T11:09:43Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP y/o IP fija&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/fija.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 Address=10.1.10.9/24&lt;br /&gt;
 Gateway=10.1.10.1&lt;br /&gt;
 DNS=10.1.10.1&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=263</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=263"/>
		<updated>2022-02-04T10:16:51Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: /* Procedimiento */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados. Además es un incordio estar añadiendo las excepciones de seguridad en los programas cliente, y además quiero usar comodines en los dominios.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de este fantástico artículo [https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/ Crear autoridad certificadora (CA) y certificados autofirmados en Linux]. ¡Muchas gracias Antonio Guillen!&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -policy policy_loose -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Convertimos el certificado en DER, por si nos lo piden en ese formato, tenerlo ya&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -in certs/${DOMINIO}.cert.pem -out certs/${DOMINIO}.cert.der -outform DER&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Meter_lineageos_en_samsung_j3_2016&amp;diff=262</id>
		<title>Meter lineageos en samsung j3 2016</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Meter_lineageos_en_samsung_j3_2016&amp;diff=262"/>
		<updated>2021-06-07T21:53:24Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «&amp;#039;&amp;#039;&amp;#039;El problema&amp;#039;&amp;#039;&amp;#039;: tienes un telefono android no tan antiguo (samsung y google puede que piensen que es antiguo, pero tu discrepas), y quieres hacer algo con el, pero no pu…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;El problema&#039;&#039;&#039;: tienes un telefono android no tan antiguo (samsung y google puede que piensen que es antiguo, pero tu discrepas), y quieres hacer algo con el, pero no puedes porque la versión de Android mas moderna que soporta ese telefono, de forma oficial, no lo permite. Por ejemplo en mi caso era usar Android Auto en un Samsung J3 (SM-J320FN), pero Android Auto requiere Android 6 y ese telefono solo recibió actualizaciones hasta la 5.1.1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;La solución&#039;&#039;&#039;: instalar una Custom ROM. En mi caso LineageOS 14.1 (Android 7.1)&lt;br /&gt;
&lt;br /&gt;
Me dejo aqui una breve &amp;quot;chuleta&amp;quot; de como lo hice. Las instrucciones no son muy precisas y no se refieren a los menus u opciones por su nombre exacto. Es solo para acordarme de los pasos. Si te olvidas o haces mal uno solo de ellos, la cagaste-burt-lancaster.&lt;br /&gt;
&lt;br /&gt;
== Que necesitas ==&lt;br /&gt;
&lt;br /&gt;
Ficheros que use:&lt;br /&gt;
&lt;br /&gt;
 lineage-14.1-20210321-UNOFFICIAL-j3xnlte.zip  - ultimo lineage que se portó al SM-J320FN&lt;br /&gt;
 open_gapps-arm-7.1-pico-20210605.zip          - la version Stock no cabe en el J3, tienes que usar mini o menos&lt;br /&gt;
&lt;br /&gt;
Como briquee el telefono, tuve que usar SM-J320FN_PHE_J320FNXXU0ARB1_J320FNOXA0ARA1_J320FNXXU0ARD1_J320FNXXU0ARB1.zip de sammobile.&lt;br /&gt;
&lt;br /&gt;
Software que use: &lt;br /&gt;
&lt;br /&gt;
* heimdall en linux debian buster&lt;br /&gt;
* adb en  linux debian buster&lt;br /&gt;
* odin en Windows 10 en una maquina virtual VirtualBox sobre anfitrión debian buster (requiere el extension pack para activar USB 2.0)&lt;br /&gt;
&lt;br /&gt;
Odin no es necesario, yo lo tuve que usar porque me salté un paso y briquee el movil.&lt;br /&gt;
&lt;br /&gt;
== Proceso ==&lt;br /&gt;
&lt;br /&gt;
* limpia el telefono de cuentas, mejor aun, ponlo de fabrica&lt;br /&gt;
* activa el modo desarrollador con 8 toques en Build Number&lt;br /&gt;
* desactiva la proteccion OEM, si no haces esto saltara la proteccion FRP y estaras jodido (lo se)&lt;br /&gt;
* modo download (home+vol-down)&lt;br /&gt;
* flashea TWRP con heimdall&lt;br /&gt;
* rebota *directamente* en recovery (home+vol-up), si no haces esto la ROM stock sobreescribe TWRP (me estuvo volviendo loco este paso)&lt;br /&gt;
* desde TWRP carga en adb sideload lineage y las gapps&lt;br /&gt;
* la 1a vez se queda en la animacion, ni caso, vuelve a rebotar&lt;br /&gt;
* y listo&lt;br /&gt;
&lt;br /&gt;
== Comandos ==&lt;br /&gt;
&lt;br /&gt;
 heimdall flash --RECOVERY sm-j320fn_twrp_3.1.1_20200119/recovery.img --no-reboot&lt;br /&gt;
 adb sideload lineage-14.1-20210321-UNOFFICIAL-j3xnlte.zip&lt;br /&gt;
 adb sideload open_gapps-arm-7.1-pico-20210605.zip&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=261</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=261"/>
		<updated>2021-04-14T07:28:25Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;systemd-resolved&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP.&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=260</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=260"/>
		<updated>2021-04-14T07:21:53Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP.&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 MulticastDNS=true&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Tanto el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; como el &amp;lt;code&amp;gt;MulticastDNS=true&amp;lt;/code&amp;gt;, son muy específicos de mi red, que es mixta Linux/Windows 2012 Server. Lo mas posible es que tu no lo necesites. mDNS funcionaba por defecto en el modo antiguo y el equivalente a &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt; en el modo antiguo era poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt; (sin esto las reservas DHCP en el Windows Server 2012 no me funcionaban).&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=259</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=259"/>
		<updated>2021-04-13T15:56:25Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP.&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
 &lt;br /&gt;
 rm /etc/resolv.conf &lt;br /&gt;
 ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf&lt;br /&gt;
 systemctl enable systemd-resolved.service &lt;br /&gt;
&lt;br /&gt;
Lo mas normal es que no necesites el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt;, yo si porque el servidor DHCP es un Windows Server 2012 y si no pongo eso las reservas DHCP no funcionan. Es el equivalente a poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=258</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=258"/>
		<updated>2021-04-12T17:18:26Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP.&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo mas normal es que no necesites el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt;, yo si porque el servidor DHCP es un Windows Server 2012 y si no pongo eso las reservas DHCP no funcionan. Es el equivalente a poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=257</id>
		<title>Migrar a systemd networkd</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Migrar_a_systemd_networkd&amp;diff=257"/>
		<updated>2021-04-12T14:05:38Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;syst…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux, pongamos Debian 10 y estas usando el bueno y viejo &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;, pero por el motivo que sea quieres comenzar a usar &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, en concreto &amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
He aquí una pequeña chuleta para convertir un sistema de 1 sola tarjeta y DHCP.&lt;br /&gt;
&lt;br /&gt;
Fichero: &amp;lt;code&amp;gt;/etc/systemd/network/dhcp.network&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [Match]&lt;br /&gt;
 Name=enp0s3&lt;br /&gt;
 &lt;br /&gt;
 [Network]&lt;br /&gt;
 DHCP=ipv4&lt;br /&gt;
 &lt;br /&gt;
 [DHCP]&lt;br /&gt;
 ClientIdentifier=mac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comandos:&lt;br /&gt;
&lt;br /&gt;
 cd /etc/network/&lt;br /&gt;
 mv interfaces.old interfaces.migrado-a-systemd&lt;br /&gt;
 systemctl enable systemd-networkd&lt;br /&gt;
 systemctl disable networking.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lo mas normal es que no necesites el &amp;lt;code&amp;gt;ClientIdentifier=mac&amp;lt;/code&amp;gt;, yo si porque el servidor DHCP es un Windows Server 2012 y si no pongo eso las reservas DHCP no funcionan. Es el equivalente a poner &amp;lt;code&amp;gt;send dhcp-client-identifier = hardware;&amp;lt;/code&amp;gt; en el &amp;lt;code&amp;gt;/etc/dhcp/dhclient.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=256</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=256"/>
		<updated>2021-03-02T22:35:22Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados. Además es un incordio estar añadiendo las excepciones de seguridad en los programas cliente, y además quiero usar comodines en los dominios.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de este fantástico artículo [https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/ Crear autoridad certificadora (CA) y certificados autofirmados en Linux]. ¡Muchas gracias Antonio Guillen!&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Convertimos el certificado en DER, por si nos lo piden en ese formato, tenerlo ya&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -in certs/${DOMINIO}.cert.pem -out certs/${DOMINIO}.cert.der -outform DER&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=255</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=255"/>
		<updated>2021-03-02T22:17:21Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: /* openssl.conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Convertimos el certificado en DER, por si nos lo piden en ese formato, tenerlo ya&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -in certs/${DOMINIO}.cert.pem -out certs/${DOMINIO}.cert.der -outform DER&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=254</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=254"/>
		<updated>2021-03-02T22:16:58Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: /* openssl.conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Convertimos el certificado en DER, por si nos lo piden en ese formato, tenerlo ya&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -in certs/${DOMINIO}.cert.pem -out certs/${DOMINIO}.cert.der -outform DER&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=253</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=253"/>
		<updated>2021-03-02T22:16:18Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Convertimos el certificado en DER, por si nos lo piden en ese formato, tenerlo ya&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -in certs/${DOMINIO}.cert.pem -out certs/${DOMINIO}.cert.der -outform DER&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=252</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=252"/>
		<updated>2021-03-02T22:06:43Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export $BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Convertimos el certificado en DER, por si nos lo piden en ese formato, tenerlo ya&lt;br /&gt;
&lt;br /&gt;
 openssl x509 -in certs/${DOMINIO}.cert.pem -out certs/${DOMINIO}.cert.der -outform DER&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=251</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=251"/>
		<updated>2021-03-02T22:05:05Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export $BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA (En Common Name ponemos lo que queramos)&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado (en Common Name ponemos el DOMINIO)&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=250</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=250"/>
		<updated>2021-03-02T22:04:31Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export $BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
En Common Name ponemos lo que queramos.&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
En Common Name ponemos el DOMINIO.&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=249</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=249"/>
		<updated>2021-03-02T22:03:06Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export $BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
En Common Name ponemos lo que queramos.&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 openssl genrsa -out ./private/${DOMINIO}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${DOMINIO}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=248</id>
		<title>Crear un CA para firmar certificados SSL</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Crear_un_CA_para_firmar_certificados_SSL&amp;diff=248"/>
		<updated>2021-03-02T22:01:50Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.  Solución: crear una clave privada+certificado de una CA, usarla para fir…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: estamos practicando SSL/TLS y queremos ir más allá de los certificados auto-firmados.&lt;br /&gt;
&lt;br /&gt;
Solución: crear una clave privada+certificado de una CA, usarla para firmar certificados, e importar esa CA a Firefox y Thunderbird para que confien en ella.&lt;br /&gt;
&lt;br /&gt;
== Procedimiento ==&lt;br /&gt;
&lt;br /&gt;
Practicamente todo está tomado de https://blog.guillen.io/2018/09/29/crear-autoridad-certificadora-ca-y-certificados-autofirmados-en-linux/&lt;br /&gt;
&lt;br /&gt;
Basicamente lo que ves aquí es una simplificación de ese artículo.&lt;br /&gt;
&lt;br /&gt;
Creamos un directorio vacío como base, aquí va a estar la CA.&lt;br /&gt;
&lt;br /&gt;
 export $BASE=&#039;/root/ca&#039; &lt;br /&gt;
 mkdir $BASE&lt;br /&gt;
 cd $BASE&lt;br /&gt;
&lt;br /&gt;
 mkdir certs csr crl newcerts private&lt;br /&gt;
 chmod 700 private&lt;br /&gt;
 touch index.txt&lt;br /&gt;
 touch index.txt.attr&lt;br /&gt;
 echo 1000 &amp;gt; serial&lt;br /&gt;
&lt;br /&gt;
Creamos el fichero &amp;lt;code&amp;gt;openssl.conf&amp;lt;/code&amp;gt;, puedes ver el contenido al final.&lt;br /&gt;
&lt;br /&gt;
Creamos la clave privada de la CA&lt;br /&gt;
&lt;br /&gt;
 openssl genrsa -aes256 -out ./private/ca.key.pem 4096&lt;br /&gt;
 chmod 400 ./private/ca.key.pem&lt;br /&gt;
&lt;br /&gt;
Generamos el certificado de la CA&lt;br /&gt;
&lt;br /&gt;
 URL=luisantolin.com&lt;br /&gt;
 export SAN=DNS:$URL&lt;br /&gt;
 openssl req -config openssl.conf -key private/ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/ca.cert.pem&lt;br /&gt;
 chmod 444 certs/ca.cert.pem&lt;br /&gt;
&lt;br /&gt;
En Common Name ponemos lo que queramos.&lt;br /&gt;
&lt;br /&gt;
Crear una clave privada para nuestro sitio web.&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 openssl genrsa -out ./private/${URL}.key.pem 2048&lt;br /&gt;
 chmod 400 ./private/${URL}.key.pem&lt;br /&gt;
&lt;br /&gt;
Generar la solicitud de certificado&lt;br /&gt;
&lt;br /&gt;
 URL=&amp;quot;*.miweb.com&amp;quot;&lt;br /&gt;
 DOMINIO=$(echo $URL | sed &#039;s/*\.//g&#039; )&lt;br /&gt;
 export SAN=DNS:$URL,DNS:$DOMINIO&lt;br /&gt;
 openssl req -config openssl.conf -key private/${DOMINIO}.key.pem -new -sha256 -out csr/${DOMINIO}.csr.pem&lt;br /&gt;
&lt;br /&gt;
Firmar la solicitud de certificado con la CA&lt;br /&gt;
&lt;br /&gt;
 openssl ca -config openssl.conf -extensions v3_req -days 3650 -notext -md sha256 -in csr/${DOMINIO}.csr.pem -out certs/${DOMINIO}.cert.pem    &lt;br /&gt;
 chmod 444 certs/${DOMINIO}.cert.pem&lt;br /&gt;
&lt;br /&gt;
Ahora hay colocar el certs/DOMINIO.cert.pem y el private/DOMINIO.key.pem al servidor (Apache, o Postfix, o Dovecot), en donde corresponda en cada caso.&lt;br /&gt;
&lt;br /&gt;
Por ultimo hay que importar el certs/ca.cert.pem en los clientes. En Mar-2021, para Firefox Linux y para Thunderbird Linux, en Ubuntu 20.04 LTS el procedimiento es trivial, basta con ir a opciones, buscar certificados, ahi CAs e importar el PEM.&lt;br /&gt;
&lt;br /&gt;
== openssl.conf== &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
[ ca ]&lt;br /&gt;
# man ca&lt;br /&gt;
&lt;br /&gt;
default_ca = CA_default&lt;br /&gt;
 &lt;br /&gt;
[ CA_default ]&lt;br /&gt;
# Directory and file locations.&lt;br /&gt;
&lt;br /&gt;
dir               = ./&lt;br /&gt;
certs             = ./certs&lt;br /&gt;
crl_dir           = ./crl&lt;br /&gt;
new_certs_dir     = ./newcerts&lt;br /&gt;
database          = ./index.txt&lt;br /&gt;
serial            = ./serial&lt;br /&gt;
RANDFILE          = ./private/.rand&lt;br /&gt;
 &lt;br /&gt;
# The root key and root certificate.&lt;br /&gt;
&lt;br /&gt;
private_key       = ./private/ca.key.pem&lt;br /&gt;
certificate       = ./certs/ca.cert.pem&lt;br /&gt;
 &lt;br /&gt;
# For certificate revocation lists.&lt;br /&gt;
&lt;br /&gt;
crlnumber         = ./crlnumber&lt;br /&gt;
crl               = ./crl/ca.crl.pem&lt;br /&gt;
crl_extensions    = crl_ext&lt;br /&gt;
default_crl_days  = 30&lt;br /&gt;
 &lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md        = sha256&lt;br /&gt;
 &lt;br /&gt;
name_opt          = ca_default&lt;br /&gt;
cert_opt          = ca_default&lt;br /&gt;
default_days      = 375&lt;br /&gt;
preserve          = no&lt;br /&gt;
policy            = policy_strict&lt;br /&gt;
 &lt;br /&gt;
[ policy_strict ]&lt;br /&gt;
# The root CA should only sign intermediate certificates that match.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of man ca.&lt;br /&gt;
&lt;br /&gt;
countryName             = match&lt;br /&gt;
stateOrProvinceName     = match&lt;br /&gt;
organizationName        = match&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ policy_loose ]&lt;br /&gt;
# Allow the intermediate CA to sign a more diverse range of certificates.&lt;br /&gt;
&lt;br /&gt;
# See the POLICY FORMAT section of the ca man page.&lt;br /&gt;
&lt;br /&gt;
countryName             = optional&lt;br /&gt;
stateOrProvinceName     = optional&lt;br /&gt;
localityName            = optional&lt;br /&gt;
organizationName        = optional&lt;br /&gt;
organizationalUnitName  = optional&lt;br /&gt;
commonName              = supplied&lt;br /&gt;
emailAddress            = optional&lt;br /&gt;
 &lt;br /&gt;
[ req ]&lt;br /&gt;
# Options for the req tool (man req).&lt;br /&gt;
&lt;br /&gt;
default_bits        = 2048&lt;br /&gt;
distinguished_name  = req_distinguished_name&lt;br /&gt;
string_mask         = utf8only&lt;br /&gt;
# SHA-1 is deprecated, so use SHA-2 instead.&lt;br /&gt;
&lt;br /&gt;
default_md          = sha256&lt;br /&gt;
# Extension to add when the -x509 option is used.&lt;br /&gt;
&lt;br /&gt;
x509_extensions     = v3_ca&lt;br /&gt;
# Extension for SANs&lt;br /&gt;
&lt;br /&gt;
req_extensions      = v3_req&lt;br /&gt;
 &lt;br /&gt;
[ v3_req ]&lt;br /&gt;
# Extensions to add to a certificate request&lt;br /&gt;
&lt;br /&gt;
# Before invoke openssl use: export SAN=DNS:value1,DNS:value2&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
keyUsage = nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
subjectAltName = ${ENV::SAN}&lt;br /&gt;
 &lt;br /&gt;
[ req_distinguished_name ]&lt;br /&gt;
# See &amp;lt;https://en.wikipedia.org/wiki/Certificate_signing_request&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
countryName                     = Country Name (2 letter code)&lt;br /&gt;
stateOrProvinceName             = State or Province Name&lt;br /&gt;
localityName                    = Locality Name&lt;br /&gt;
0.organizationName              = Organization Name&lt;br /&gt;
organizationalUnitName          = Organizational Unit Name&lt;br /&gt;
commonName                      = Common Name&lt;br /&gt;
emailAddress                    = Email Address&lt;br /&gt;
 &lt;br /&gt;
# Optionally, specify some defaults.&lt;br /&gt;
&lt;br /&gt;
countryName_default             = CO&lt;br /&gt;
stateOrProvinceName_default     = Coruscant&lt;br /&gt;
localityName_default            = Ciudad Galactica&lt;br /&gt;
0.organizationName_default      = Consejo Jedi&lt;br /&gt;
organizationalUnitName_default  = CJ&lt;br /&gt;
emailAddress_default            = consejo@templo.jedi.org&lt;br /&gt;
 &lt;br /&gt;
[ v3_ca ]&lt;br /&gt;
# Extensions for a typical CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ v3_intermediate_ca ]&lt;br /&gt;
# Extensions for a typical intermediate CA (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid:always,issuer&lt;br /&gt;
basicConstraints = critical, CA:true, pathlen:0&lt;br /&gt;
keyUsage = critical, digitalSignature, cRLSign, keyCertSign&lt;br /&gt;
 &lt;br /&gt;
[ usr_cert ]&lt;br /&gt;
# Extensions for client certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = client, email&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Client Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = clientAuth, emailProtection&lt;br /&gt;
 &lt;br /&gt;
[ server_cert ]&lt;br /&gt;
# Extensions for server certificates (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
nsCertType = server&lt;br /&gt;
nsComment = &amp;quot;OpenSSL Generated Server Certificate&amp;quot;&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer:always&lt;br /&gt;
keyUsage = critical, digitalSignature, keyEncipherment&lt;br /&gt;
extendedKeyUsage = serverAuth&lt;br /&gt;
 &lt;br /&gt;
[ crl_ext ]&lt;br /&gt;
# Extension for CRLs (man x509v3_config).&lt;br /&gt;
&lt;br /&gt;
authorityKeyIdentifier=keyid:always&lt;br /&gt;
 &lt;br /&gt;
[ ocsp ]&lt;br /&gt;
# Extension for OCSP signing certificates (man ocsp).&lt;br /&gt;
&lt;br /&gt;
basicConstraints = CA:FALSE&lt;br /&gt;
subjectKeyIdentifier = hash&lt;br /&gt;
authorityKeyIdentifier = keyid,issuer&lt;br /&gt;
keyUsage = critical, digitalSignature&lt;br /&gt;
extendedKeyUsage = critical, OCSPSigning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Openssh_sin_contrase%C3%B1a_en_windows10&amp;diff=247</id>
		<title>Openssh sin contraseña en windows10</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Openssh_sin_contrase%C3%B1a_en_windows10&amp;diff=247"/>
		<updated>2021-02-02T18:01:36Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Objetivo: poder acceder remotamente desde un Linux a un Windows10 para poder lanzar comandos remotamente de modo que se puedan automatizar tareas.  Seguro que no es la form…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Objetivo: poder acceder remotamente desde un Linux a un Windows10 para poder lanzar comandos remotamente de modo que se puedan automatizar tareas.&lt;br /&gt;
&lt;br /&gt;
Seguro que no es la forma mas &amp;quot;windows&amp;quot;, pero para Linuxeros, tu dame un SSH y moveré el mundo.&lt;br /&gt;
&lt;br /&gt;
=== Instalar OpenSSH Server ===&lt;br /&gt;
&lt;br /&gt;
No viene por defecto&lt;br /&gt;
&lt;br /&gt;
Abrimos una Powershell con privilegios de Administrador&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nos informará de si le hace falta reboot o no.&lt;br /&gt;
&lt;br /&gt;
 Set-Service -Name sshd -StartupType &#039;Automatic&#039;&lt;br /&gt;
&lt;br /&gt;
 Start-Service -Name sshd&lt;br /&gt;
&lt;br /&gt;
Listo, deberíamos tener el puerto 22 escuchando&lt;br /&gt;
&lt;br /&gt;
=== Autorizar la clave pública ===&lt;br /&gt;
&lt;br /&gt;
 scp /home/lantolin/.ssh/id_rsa.pub l.antolin@172.16.4.236:/ProgramData/ssh/administrators_authorized_keys&lt;br /&gt;
&lt;br /&gt;
Por estas cosas maravillosas de Windows ... que tanto nos enamoran, para que funcione hay que ejecutar lo siguiente en PS&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys&lt;br /&gt;
 $acl.SetAccessRuleProtection($true, $false)&lt;br /&gt;
 $administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule(&amp;quot;Administradores&amp;quot;,&amp;quot;FullControl&amp;quot;,&amp;quot;Allow&amp;quot;)&lt;br /&gt;
 $systemRule = New-Object system.security.accesscontrol.filesystemaccessrule(&amp;quot;SYSTEM&amp;quot;,&amp;quot;FullControl&amp;quot;,&amp;quot;Allow&amp;quot;)&lt;br /&gt;
 $acl.SetAccessRule($administratorsRule)&lt;br /&gt;
 $acl.SetAccessRule($systemRule)&lt;br /&gt;
 $acl | Set-Acl&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cosas que se pueden hacer ===&lt;br /&gt;
&lt;br /&gt;
Cambiar el proxy&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;ssh lantolin@192.168.1.114 powershell Set-ItemProperty \&#039;HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet\ Settings\&#039; -Name ProxyEnable -Value 0&lt;br /&gt;
 Set-ItemProperty &#039;HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings&#039; -Name ProxyEnable -Value 0&lt;br /&gt;
 Set-ItemProperty &#039;HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings&#039; -Name ProxyEnable -Value 1&lt;br /&gt;
 Set-ItemProperty &#039;HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings&#039; -Name ProxyServer -Value 172.16.7.200:3128&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Quitar la ruta por defecto. Esto es un modo de dejar un PC con Intranet (red local directamente conectada) pero sin Internet. Muy util para PCs de alumnos.&lt;br /&gt;
&lt;br /&gt;
 Remove-NetRoute -DestinationPrefix 0.0.0.0/0 -Confirm:$false&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Manipulaci%C3%B3n_de_PDFs_e_imagenes_en_linea_de_comandos&amp;diff=246</id>
		<title>Manipulación de PDFs e imagenes en linea de comandos</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Manipulaci%C3%B3n_de_PDFs_e_imagenes_en_linea_de_comandos&amp;diff=246"/>
		<updated>2020-12-10T14:50:00Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Crear un jpg con la primera pagina === &lt;br /&gt;
&lt;br /&gt;
 gs -q -sDEVICE=jpeg -dBATCH -dNOPAUSE -dFirstPage=1 -dLastPage=1 -r300 -sOutputFile=test.jpg test.pdf&lt;br /&gt;
&lt;br /&gt;
=== Extraer una imagen, de la primera pagina, (por ejemplo la portada) === &lt;br /&gt;
&lt;br /&gt;
 pdfimages -f 1 -l 1 -j fichero.pdf pgs&lt;br /&gt;
&lt;br /&gt;
Un detalle: lo que hace pdfimages no es &amp;quot;generar&amp;quot; una imagen con el contenido de la página sino extraer los elementos de la página que sean imagenes. Es decir si el PDF lo que tiene en la pag 1 son 3 imágenes y un texto, el comando producirá 3 ficheros de imagen, y nada para el texto.&lt;br /&gt;
&lt;br /&gt;
Si lo que queremos es realmente &amp;quot;renderizar&amp;quot; el PDF a PNG, podemos usar este comando:&lt;br /&gt;
&lt;br /&gt;
 pdftoppm -r 300 -png pdf.pdf prefijo-paginas&lt;br /&gt;
&lt;br /&gt;
=== Crear un PDF con un libro escaneado === &lt;br /&gt;
&lt;br /&gt;
Secuencia de comandos para partiendo de un libro que estaba escaneado, con una imagen por página, pero con 2 paginas reales por imagen y muchos bordes blancos, hacer un PDF mejor, con una página real por pagina PDF y sin bordes blancos:&lt;br /&gt;
&lt;br /&gt;
 # Extraer todas las imágenes&lt;br /&gt;
 pdfimages -j fichero.pdf pgs&lt;br /&gt;
&lt;br /&gt;
 # rotarlas 90 a la izq&lt;br /&gt;
 for f in ???.jpg ; do echo &amp;quot;$f&amp;quot; ; convert &amp;quot;$f&amp;quot; -rotate 270 &amp;quot;${f%.jpg}_r.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Cortar las imágenes por la mitad, supongamos que la imagen es de 1200x500&lt;br /&gt;
 for f in pgs-???.ppm ; do convert &amp;quot;$f&amp;quot;  -crop 600x500! &amp;quot;${f.%.ppm}.%d.ppm&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
 # Cortarlas en 2 veces&lt;br /&gt;
 for f in ???_r.jpg ; do echo $f ; convert &amp;quot;$f&amp;quot; -crop 1330x2340+0+200\! &amp;quot;${f%.jpg}_r_c1.jpg&amp;quot;; convert &amp;quot;$f&amp;quot; -crop 1330x2340+1330+200\! &amp;quot;${f%.jpg}_r_c2.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Tipico caso de banda horizontal arriba y banda horizontal abajo. La de arriba tiene 282px y la imagen que quiero conservar 1490px. El ancho es 1200.&lt;br /&gt;
&lt;br /&gt;
 for f in ???.jpg ; do convert &amp;quot;$f&amp;quot; -crop 1200x1490+0+282\! &amp;quot;${f%.jpg}.c.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Quitar los bordes blancos&lt;br /&gt;
 for f in pgs-???.pbm.[01].jpg ; do  convert &amp;quot;$f&amp;quot;  +repage -fuzz &amp;quot;99%&amp;quot; -trim &amp;quot;$f.trim.jpg&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
 # Recrear el PDF a partir de las imágenes nuevas:&lt;br /&gt;
 convert pgs-???.ppm.?.ppm fichero.pdf&lt;br /&gt;
&lt;br /&gt;
=== Crear un PDF a partir de imágenes convirtiendo el tamaño (como mucho de X de alto o de Y de ancho, respetando el aspecto) === &lt;br /&gt;
&lt;br /&gt;
 convert * -resize XxY fichero.pdf&lt;br /&gt;
&lt;br /&gt;
=== Ponerle metadata (XMP) para que el e-reader lo muestre ===  &lt;br /&gt;
&lt;br /&gt;
 # extraer metadata a fichero&lt;br /&gt;
 pdftk f1.pdf dump_data output metadata.txt&lt;br /&gt;
 # Editar metadata.txt a gusto del consumidor (se pueden añadir campos nuevos)&lt;br /&gt;
 pdftk f1.pdf update_info metadata.txt output f2.pdf&lt;br /&gt;
&lt;br /&gt;
Un método mejor que no requiere archivo intermedio y edición manual:&lt;br /&gt;
&lt;br /&gt;
 exiftool -Title=&amp;quot;This is my title&amp;quot; -Author=&amp;quot;Cobarde Anonimo&amp;quot; my.pdf&lt;br /&gt;
&lt;br /&gt;
=== Eliminar las restricciones de un PDF === &lt;br /&gt;
&lt;br /&gt;
Para eliminar las restricciones de seguridad de un PDF sin password simplemente basta con hacer &lt;br /&gt;
&lt;br /&gt;
 qpdf --decrypt in.pdf out.pdf&lt;br /&gt;
&lt;br /&gt;
[[Category:Tips]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Tunel_Inverso_con_SSH&amp;diff=245</id>
		<title>Tunel Inverso con SSH</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Tunel_Inverso_con_SSH&amp;diff=245"/>
		<updated>2020-11-11T21:52:39Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «&amp;#039;&amp;#039;&amp;#039;Problema&amp;#039;&amp;#039;&amp;#039;: quiero acceder a una máquina A que está tras un NAT y/o un firewall, tengo cuenta SSH en esa máquina  &amp;#039;&amp;#039;&amp;#039;Solución&amp;#039;&amp;#039;&amp;#039;: mantener una sesion SSH abierta ha…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Problema&#039;&#039;&#039;: quiero acceder a una máquina A que está tras un NAT y/o un firewall, tengo cuenta SSH en esa máquina&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solución&#039;&#039;&#039;: mantener una sesion SSH abierta hacia un servidor de salto en Internet, con un tunel inverso; usar ese tunel inverso para hacer un SSH de la máquina de salto hacia la máquina A&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 # desde la maquina A&lt;br /&gt;
 ssh -p 5847 -N -R 10022:127.0.0.1:22 nadie@maquina.de.salto&lt;br /&gt;
&lt;br /&gt;
 # desde la máquina de salto&lt;br /&gt;
 ssh -p 10022 usuario-de-A@127.0.0.1&lt;br /&gt;
&lt;br /&gt;
Para mantener la sesión abierta usamos autossh y para que autossh arranque al arrancar la máquina A, creamos una unidad systemd&lt;br /&gt;
&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=AutoSSH reverse tunnel service for jump.you.io 100022 -&amp;gt; 22&lt;br /&gt;
 After=network.target&lt;br /&gt;
 [Service]&lt;br /&gt;
 Environment=&amp;quot;AUTOSSH_GATETIME=0&amp;quot;&lt;br /&gt;
 ExecStart=autossh -N -R 10022:127.0.0.1:22 nadie@maquina.de.salto&lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
Referencia: [https://gist.github.com/ntrepid8/0af12c012dd2567c800799d86eb44f90 AutoSSH reverse tunnel service config for systemd]&lt;br /&gt;
&lt;br /&gt;
Referencia: [https://unix.stackexchange.com/a/379991/47775 StackExchange]&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Trabajando_con_Git&amp;diff=244</id>
		<title>Trabajando con Git</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Trabajando_con_Git&amp;diff=244"/>
		<updated>2020-10-21T17:15:26Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anotaciones para ayudarme a migrar de Subversion a Git. La intención es documentar los flujos básicos de trabajo con Git, y anotar las principales diferencias de concepto que voy encontrando.&lt;br /&gt;
&lt;br /&gt;
Mi uso es para un solo desarrollador en multiples ordenadores. Es una configuracion muy sencilla (para lo que Git es capaz de hacer).&lt;br /&gt;
&lt;br /&gt;
Asunciones:&lt;br /&gt;
&lt;br /&gt;
* Servidor Git: &amp;lt;code&amp;gt;aws.luisantolin.com&amp;lt;/code&amp;gt;&lt;br /&gt;
* Usuario Git con intercambio de claves SSH ya configurado: &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;&lt;br /&gt;
* Una sola rama, la de por defecto: &amp;lt;code&amp;gt;master&amp;lt;/code&amp;gt;&lt;br /&gt;
* Una solo repositorio remoto por proyecto, el de por defecto: &amp;lt;code&amp;gt;origin&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nombre de proyecto: &amp;lt;code&amp;gt;proyecto&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Proyecto nuevo ==&lt;br /&gt;
&lt;br /&gt;
Creando un proyecto nuevo. Git usa un repositorio por proyecto.&lt;br /&gt;
&lt;br /&gt;
=== En el servidor ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;PROYECTO=&amp;quot;proyecto&amp;quot; ; ssh git@aws.luisantolin.com &amp;quot;cd /var/git &amp;amp;&amp;amp; mkdir \&amp;quot;${PROYECTO}\&amp;quot;.git &amp;amp;&amp;amp; cd \&amp;quot;${PROYECTO}\&amp;quot;.git &amp;amp;&amp;amp; git init --bare&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listo, tenemos un repositorio vacio y listo para recibir datos.&lt;br /&gt;
&lt;br /&gt;
=== En el cliente ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd &amp;lt;directorio raiz del proyecto&amp;gt;&lt;br /&gt;
git init .&lt;br /&gt;
git add -A&lt;br /&gt;
git commit -m &amp;quot;Initial commit. Everything was in a dot.&amp;quot; &lt;br /&gt;
git remote add origin git@aws.luisantolin.com:/var/git/&amp;lt;nombreproyecto&amp;gt;.git&lt;br /&gt;
git push origin master&lt;br /&gt;
git push --set-upstream origin master  &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listo, tenemos nuestro proyecto local enviado al servidor.&lt;br /&gt;
&lt;br /&gt;
=== En otro cliente ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
cd &amp;lt;donde queramos que se cree la raiz de nuestro nuevo proyecto&amp;gt;&lt;br /&gt;
git clone git@aws.luisantolin.com:/var/git/&amp;lt;nombredeproyecto&amp;gt;.git&lt;br /&gt;
cd proyecto&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listo, ya podemos trabajar en este otro cliente.&lt;br /&gt;
&lt;br /&gt;
== Trabajo diario ==&lt;br /&gt;
&lt;br /&gt;
# Traemos la ultima version del repositorio: &amp;lt;code&amp;gt;git fetch&amp;lt;/code&amp;gt;&lt;br /&gt;
# Vemos los cambios: &amp;lt;code&amp;gt;git diff master origin/master&amp;lt;/code&amp;gt;&lt;br /&gt;
# Incorporamos los cambios: &amp;lt;code&amp;gt;git merge origin/master&amp;lt;/code&amp;gt;&lt;br /&gt;
# Hacemos nuestros cambios&lt;br /&gt;
# Añadimos los ficheros cambiados al &amp;quot;staging area&amp;quot;: &amp;lt;code&amp;gt;git add -A&amp;lt;/code&amp;gt;&lt;br /&gt;
# Hacemos el commit de los cambios en el repositorio local: &amp;lt;code&amp;gt;git commit -m &amp;quot;descripcion de commit&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
# Enviamos los cambios al servidor: &amp;lt;code&amp;gt;git push&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nota: &amp;lt;code&amp;gt;fetch&amp;lt;/code&amp;gt; y &amp;lt;code&amp;gt;merge&amp;lt;/code&amp;gt; se pueden hacer juntos con &amp;lt;code&amp;gt;git pull origin master&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Y vuelta a empezar :)&lt;br /&gt;
&lt;br /&gt;
== Diferencias con Subversion ==&lt;br /&gt;
&lt;br /&gt;
Tropezaré en estas mil veces.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lo que en Subversion era un solo paso (commit) aqui son tres: add, commit y push.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Git tiene el concepto de &amp;quot;staging area&amp;quot;, un area intermedia donde tengo que ir anotando los cambios explicitamente antes de hacer commit. De modo que desde que yo cambio un fichero hasta que esta disponible en el repositorio son 3 pasos:&lt;br /&gt;
&lt;br /&gt;
# add lo anota como cambiado en la &amp;quot;staging area&amp;quot;, totalmente local&lt;br /&gt;
# commit agrupa todos los cambios de la &amp;quot;staging area&amp;quot; y les da un ID y una descripcion, ¡aun todo local!&lt;br /&gt;
# push envia el commit al repositorio remoto&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;En Git todo son ramas, fetch se trae los cambios a lo que llama &amp;quot;rama remota&amp;quot; dentro del repositorio local&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Al traer cambios del repositorio también hay mas pasos que en Subversion. Aqui el concepto nuevo (y confuso en mi modesta opinión) es que se trae los cambios a una rama remota local, nombre confuso donde los haya, quizá queda mas claro decir una rama remota del repositorio local. Es decir que en el repositorio local tenemos dos tipos de ramas, las locales, y una copia de las remotas (se ven todas con &amp;lt;code&amp;gt;git branch -a&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
# fetch trae los cambios desde el repositorio a una rama remota de nuestro repositorio local.&lt;br /&gt;
# merge incorpora los cambios, de cualquier rama a cualquier rama, en este caso de la remota a la local&lt;br /&gt;
&lt;br /&gt;
[[Category:Tips]]&lt;br /&gt;
[[Category:Tecnologia]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Manipulaci%C3%B3n_de_PDFs_e_imagenes_en_linea_de_comandos&amp;diff=243</id>
		<title>Manipulación de PDFs e imagenes en linea de comandos</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Manipulaci%C3%B3n_de_PDFs_e_imagenes_en_linea_de_comandos&amp;diff=243"/>
		<updated>2020-09-05T12:09:36Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crear un jpg con la primera pagina:&lt;br /&gt;
&lt;br /&gt;
 gs -q -sDEVICE=jpeg -dBATCH -dNOPAUSE -dFirstPage=1 -dLastPage=1 -r300 -sOutputFile=test.jpg test.pdf&lt;br /&gt;
&lt;br /&gt;
Extraer una imagen, de la primera pagina, (por ejemplo la portada):&lt;br /&gt;
&lt;br /&gt;
 pdfimages -f 1 -l 1 -j fichero.pdf pgs&lt;br /&gt;
&lt;br /&gt;
Un detalle: lo que hace pdfimages no es &amp;quot;generar&amp;quot; una imagen con el contenido de la página sino extraer los elementos de la página que sean imagenes. Es decir si el PDF lo que tiene en la pag 1 son 3 imágenes y un texto, el comando producirá 3 ficheros de imagen, y nada para el texto.&lt;br /&gt;
&lt;br /&gt;
Si lo que queremos es realmente &amp;quot;renderizar&amp;quot; el PDF a PNG, podemos usar este comando:&lt;br /&gt;
&lt;br /&gt;
 pdftoppm -r 300 -png pdf.pdf prefijo-paginas&lt;br /&gt;
&lt;br /&gt;
Secuencia de comandos para partiendo de un libro que estaba escaneado, con una imagen por página, pero con 2 paginas reales por imagen y muchos bordes blancos, hacer un PDF mejor, con una página real por pagina PDF y sin bordes blancos:&lt;br /&gt;
&lt;br /&gt;
 # Extraer todas las imágenes&lt;br /&gt;
 pdfimages -j fichero.pdf pgs&lt;br /&gt;
&lt;br /&gt;
 # rotarlas 90 a la izq&lt;br /&gt;
 for f in ???.jpg ; do echo &amp;quot;$f&amp;quot; ; convert &amp;quot;$f&amp;quot; -rotate 270 &amp;quot;${f%.jpg}_r.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Cortar las imágenes por la mitad, supongamos que la imagen es de 1200x500&lt;br /&gt;
 for f in pgs-???.ppm ; do convert &amp;quot;$f&amp;quot;  -crop 600x500! &amp;quot;${f.%.ppm}.%d.ppm&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
 # Cortarlas en 2 veces&lt;br /&gt;
 for f in ???_r.jpg ; do echo $f ; convert &amp;quot;$f&amp;quot; -crop 1330x2340+0+200\! &amp;quot;${f%.jpg}_r_c1.jpg&amp;quot;; convert &amp;quot;$f&amp;quot; -crop 1330x2340+1330+200\! &amp;quot;${f%.jpg}_r_c2.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Tipico caso de banda horizontal arriba y banda horizontal abajo. La de arriba tiene 282px y la imagen que quiero conservar 1490px. El ancho es 1200.&lt;br /&gt;
&lt;br /&gt;
 for f in ???.jpg ; do convert &amp;quot;$f&amp;quot; -crop 1200x1490+0+282\! &amp;quot;${f%.jpg}.c.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Quitar los bordes blancos&lt;br /&gt;
 for f in pgs-???.pbm.[01].jpg ; do  convert &amp;quot;$f&amp;quot;  +repage -fuzz &amp;quot;99%&amp;quot; -trim &amp;quot;$f.trim.jpg&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
 # Recrear el PDF a partir de las imágenes nuevas:&lt;br /&gt;
 convert pgs-???.ppm.?.ppm fichero.pdf&lt;br /&gt;
&lt;br /&gt;
Crear un PDF a partir de imágenes convirtiendo el tamaño (como mucho de X de alto o de Y de ancho, respetando el aspecto)&lt;br /&gt;
&lt;br /&gt;
 convert * -resize XxY fichero.pdf&lt;br /&gt;
&lt;br /&gt;
Ponerle metadata (XMP) para que el e-reader lo muestre:&lt;br /&gt;
&lt;br /&gt;
 # extraer metadata a fichero&lt;br /&gt;
 pdftk f1.pdf dump_data output metadata.txt&lt;br /&gt;
 # Editar metadata.txt a gusto del consumidor (se pueden añadir campos nuevos)&lt;br /&gt;
 pdftk f1.pdf update_info metadata.txt output f2.pdf&lt;br /&gt;
&lt;br /&gt;
Un método mejor que no requiere archivo intermedio y edición manual:&lt;br /&gt;
&lt;br /&gt;
 exiftool -Title=&amp;quot;This is my title&amp;quot; -Author=&amp;quot;Cobarde Anonimo&amp;quot; my.pdf&lt;br /&gt;
&lt;br /&gt;
[[Category:Tips]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Manipulaci%C3%B3n_de_PDFs_e_imagenes_en_linea_de_comandos&amp;diff=242</id>
		<title>Manipulación de PDFs e imagenes en linea de comandos</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Manipulaci%C3%B3n_de_PDFs_e_imagenes_en_linea_de_comandos&amp;diff=242"/>
		<updated>2020-09-05T12:00:12Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Crear un jpg con la primera pagina:&lt;br /&gt;
&lt;br /&gt;
 gs -q -sDEVICE=jpeg -dBATCH -dNOPAUSE -dFirstPage=1 -dLastPage=1 -r300 -sOutputFile=test.jpg test.pdf&lt;br /&gt;
&lt;br /&gt;
Extraer una imagen, de la primera pagina, (por ejemplo la portada):&lt;br /&gt;
&lt;br /&gt;
 pdfimages -f 1 -l 1 -j fichero.pdf pgs&lt;br /&gt;
&lt;br /&gt;
Un detalle: lo que hace pdfimages no es &amp;quot;generar&amp;quot; una imagen con el contenido de la página sino extraer los elementos de la página que sean imagenes. Es decir si el PDF lo que tiene en la pag 1 son 3 imágenes y un texto, el comando producirá 3 ficheros de imagen, y nada para el texto.&lt;br /&gt;
&lt;br /&gt;
Secuencia de comandos para partiendo de un libro que estaba escaneado, con una imagen por página, pero con 2 paginas reales por imagen y muchos bordes blancos, hacer un PDF mejor, con una página real por pagina PDF y sin bordes blancos:&lt;br /&gt;
&lt;br /&gt;
 # Extraer todas las imágenes&lt;br /&gt;
 pdfimages -j fichero.pdf pgs&lt;br /&gt;
&lt;br /&gt;
 # rotarlas 90 a la izq&lt;br /&gt;
 for f in ???.jpg ; do echo &amp;quot;$f&amp;quot; ; convert &amp;quot;$f&amp;quot; -rotate 270 &amp;quot;${f%.jpg}_r.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Cortar las imágenes por la mitad, supongamos que la imagen es de 1200x500&lt;br /&gt;
 for f in pgs-???.ppm ; do convert &amp;quot;$f&amp;quot;  -crop 600x500! &amp;quot;${f.%.ppm}.%d.ppm&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
 # Cortarlas en 2 veces&lt;br /&gt;
 for f in ???_r.jpg ; do echo $f ; convert &amp;quot;$f&amp;quot; -crop 1330x2340+0+200\! &amp;quot;${f%.jpg}_r_c1.jpg&amp;quot;; convert &amp;quot;$f&amp;quot; -crop 1330x2340+1330+200\! &amp;quot;${f%.jpg}_r_c2.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Tipico caso de banda horizontal arriba y banda horizontal abajo. La de arriba tiene 282px y la imagen que quiero conservar 1490px. El ancho es 1200.&lt;br /&gt;
&lt;br /&gt;
 for f in ???.jpg ; do convert &amp;quot;$f&amp;quot; -crop 1200x1490+0+282\! &amp;quot;${f%.jpg}.c.jpg&amp;quot; ; done&lt;br /&gt;
&lt;br /&gt;
 # Quitar los bordes blancos&lt;br /&gt;
 for f in pgs-???.pbm.[01].jpg ; do  convert &amp;quot;$f&amp;quot;  +repage -fuzz &amp;quot;99%&amp;quot; -trim &amp;quot;$f.trim.jpg&amp;quot;; done&lt;br /&gt;
&lt;br /&gt;
 # Recrear el PDF a partir de las imágenes nuevas:&lt;br /&gt;
 convert pgs-???.ppm.?.ppm fichero.pdf&lt;br /&gt;
&lt;br /&gt;
Crear un PDF a partir de imágenes convirtiendo el tamaño (como mucho de X de alto o de Y de ancho, respetando el aspecto)&lt;br /&gt;
&lt;br /&gt;
 convert * -resize XxY fichero.pdf&lt;br /&gt;
&lt;br /&gt;
Ponerle metadata (XMP) para que el e-reader lo muestre:&lt;br /&gt;
&lt;br /&gt;
 # extraer metadata a fichero&lt;br /&gt;
 pdftk f1.pdf dump_data output metadata.txt&lt;br /&gt;
 # Editar metadata.txt a gusto del consumidor (se pueden añadir campos nuevos)&lt;br /&gt;
 pdftk f1.pdf update_info metadata.txt output f2.pdf&lt;br /&gt;
&lt;br /&gt;
Un método mejor que no requiere archivo intermedio y edición manual:&lt;br /&gt;
&lt;br /&gt;
 exiftool -Title=&amp;quot;This is my title&amp;quot; -Author=&amp;quot;Cobarde Anonimo&amp;quot; my.pdf&lt;br /&gt;
&lt;br /&gt;
[[Category:Tips]]&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Monitorizar_Moodle_con_Munin&amp;diff=241</id>
		<title>Monitorizar Moodle con Munin</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Monitorizar_Moodle_con_Munin&amp;diff=241"/>
		<updated>2020-07-19T10:22:35Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Quiero monitorizar algunos aspectos de moodle relacionados con el rendimiento porque uso un servidor muy limitado en recursos.  Por ejemplo, quiero saber cuantos usuarios c…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Quiero monitorizar algunos aspectos de moodle relacionados con el rendimiento porque uso un servidor muy limitado en recursos.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo, quiero saber cuantos usuarios concurrentes hay, cosas asi. Quiero que sea con Munin porque es lo que uso y me parece simple y efectivo.&lt;br /&gt;
&lt;br /&gt;
Despues de mucho mirar no encuentro nada que haga lo que necesito, asi que intentaré hacerlo yo.&lt;br /&gt;
&lt;br /&gt;
Solucion simple: queries SQL y plugin de munin&lt;br /&gt;
&lt;br /&gt;
Investigación en curso:&lt;br /&gt;
&lt;br /&gt;
Numero de usuarios que han hecho login en los ultimos X segudos (ojo, fecha en epoch)&lt;br /&gt;
&lt;br /&gt;
 SELECT count(username) FROM mdl_user WHERE currentlogin&amp;gt;=&#039;1595153702&#039;;&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=240</id>
		<title>Leer un fichero linea a linea en BASH</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=240"/>
		<updated>2020-06-19T11:07:22Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: tengo un fichero con líneas de texto que contienen espacios, por ejemplo nombres de directorios, quiero hacer un bucle de BASH que vaya creando esos directorios&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 while read l; do mkdir &amp;quot;$l&amp;quot; ; done &amp;lt; directorios.txt&lt;br /&gt;
&lt;br /&gt;
Referencia: [http://mywiki.wooledge.org/BashFAQ/001 How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?]&lt;br /&gt;
&lt;br /&gt;
Referencia: [https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable Read a file line by line assigning the value to a variable]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=239</id>
		<title>Leer un fichero linea a linea en BASH</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=239"/>
		<updated>2020-06-19T11:07:14Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: tengo un fichero con líneas de texto que contienen espacios, por ejemplo nombres de directorios, quiero hacer un bucle de BASH que vaya creando esos directorios&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 while read l; do mkdir &amp;quot;$l&amp;quot; ; done &amp;lt; directorios.txt&lt;br /&gt;
&lt;br /&gt;
Referencia: [http://mywiki.wooledge.org/BashFAQ/001 How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?]&lt;br /&gt;
Referencia: [https://stackoverflow.com/questions/10929453/read-a-file-line-by-line-assigning-the-value-to-a-variable Read a file line by line assigning the value to a variable]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=238</id>
		<title>Leer un fichero linea a linea en BASH</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Leer_un_fichero_linea_a_linea_en_BASH&amp;diff=238"/>
		<updated>2020-06-19T11:04:18Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: Página creada con «Problema: tengo un fichero con líneas de texto que contienen espacios, por ejemplo nombres de directorios, quiero hacer un bucle de BASH que vaya creando esos directorios…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: tengo un fichero con líneas de texto que contienen espacios, por ejemplo nombres de directorios, quiero hacer un bucle de BASH que vaya creando esos directorios&lt;br /&gt;
&lt;br /&gt;
Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 while read l; do mkdir &amp;quot;$l&amp;quot; ; done &amp;lt; directorios.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Tips]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
	<entry>
		<id>http://educacion.luisantolin.com/index.php?title=Cambiar_de_mapa_de_teclado&amp;diff=237</id>
		<title>Cambiar de mapa de teclado</title>
		<link rel="alternate" type="text/html" href="http://educacion.luisantolin.com/index.php?title=Cambiar_de_mapa_de_teclado&amp;diff=237"/>
		<updated>2020-06-10T14:46:38Z</updated>

		<summary type="html">&lt;p&gt;Lantolin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Problema: usas Linux y estas usando una maquina que no es la tuya, o una maquina de usar y tirar, la distribución o mapa del teclado no es el que tu tienes fisicamente o no es al que estas acostumbrado.&lt;br /&gt;
&lt;br /&gt;
Para sesion gráfica:&lt;br /&gt;
&lt;br /&gt;
 setxkbmap -layout us -variant intl&lt;br /&gt;
&lt;br /&gt;
Pendiente, investigar si es o no un cambio permanente, como averiguar el que ya habia, y como restaurarlo.&lt;br /&gt;
&lt;br /&gt;
Para sesion de consola:&lt;br /&gt;
&lt;br /&gt;
 dpkg-reconfigure keyboard-configuration&lt;br /&gt;
 setupcon&lt;br /&gt;
&lt;br /&gt;
Pendiente, investigar una opcion que no requiera root, como averiguar el que ya habia, y como restaurarlo.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Lantolin</name></author>
	</entry>
</feed>