Mostrando entradas con la etiqueta Servidores. Mostrar todas las entradas
Mostrando entradas con la etiqueta Servidores. Mostrar todas las entradas

viernes, 25 de julio de 2014

Configurando la red para máquinas virtuales

Siguiendo con la configuración de máquinas virtuales, es hora de configurar la red.

Quiero que mis máquinas virtuales atiendan servicios, así que necesito que tengan direcciones IP visibles desde la red física, a las que mi enrutador pueda dirigirse.

Ha sido muy difícil encontrar la documentación, y al final en realidad he tenido que recurrir a métodos de prueba y error, pero finalmente lo tengo.

En el servidor, hay que configurar un puente. Eso quiere decir que pasamos de esto:

#/etc/network/interfaces

# The primary network interface
allow-hotplug eth0
auto eth0
iface eth0 inet static
      address 192.168.2.25
      netmask 255.255.255.0
      network 192.168.2.0
      broadcast 192.168.2.255
      gateway 192.168.2.1
      dns-nameservers 127.0.0.1
      dns-domain rolamasao.org

a esto:

#/etc/network/interfaces

# The primary network interface
auto br0
iface br0 inet static
        bridge_ports eth0
        address 192.168.2.25
        netmask 255.255.255.0
        network 192.168.2.0
        broadcast 192.168.2.255
        gateway 192.168.2.1
        dns-nameservers 127.0.0.1
        dns-domain rolamasao.org

Es importante notar que a partir de ese momento debemos considerar que la interfaz de red de nuestro servidor físico es br0, y no eth0.

Claro que de nada sirve tener un puente si los paquetes que llegan al puente no son retransmitidos hacia Internet. Por eso hay que modificar un parámetro del kernel:

# /etc/sysctl.conf - Configuration file for setting system variables

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Para que estos cambios tengan efecto es necesario reiniciar, pero siempre se pueden ejecutar a mano con un poquito de brctl, ifconfig, route y echo.

En las máquinas virtuales la configuración debe indicar que utilizan el puente br0, lo cual es bastante sencillo de hacer desde virt-manager. Ya dentro de la máquina virtual, tenemos una configuración bastante estándar. Simplemente hay que indicar que el enrutador por defecto es la máquina física, no el enrutador de la red:

#/etc/network/interfaces VIRTUAL

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
        address 192.168.2.80
        netmask 255.255.255.0
        network 192.168.2.0
        broadcast 192.168.2.255
        gateway 192.168.2.25
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.2.25

sábado, 19 de julio de 2014

Identificando máquinas virtuales

Últimamente me estoy metiendo a configurar máquinas virtuales en casa. Más adelante hablaré sobre todos los pasos necesarios, pero de momento me voy a referir al importante detalle de identificar la máquina en la que se trabaja.

Claro que todas las máquinas tienen nombre, pero ¿realmente leemos el nombre de máquina que aparece en el prompt de la shell?

root@vmserver:~#

¿Qué máquina es esa? Hay que fijarse mucho para ver que se trata de una máquina llamada vmserver. Y si tenemos varias máquinas abiertas en distintas pestañas de nuestro programa de terminal, es fácil confundirse. A mí me ha pasado ejecutar un poweroff en la máquina física pensando en apagar una máquina virtual. Y duele.

Así que me decidí a identificarlas por colores.

Las instrucciones de debajo son bastante generales pero has sido comprobadas en una máquina Debian. En otras distribuciones de Linux puede ser ligeramente diferente y en otros Unix muy diferente.

Toda sesión de shell de una máquina comienza ejecutando el fichero /etc/profile. Y este fichero a su vez llama a /etc/bash.bashrc (en el caso de que la shell en uso sea bash y el acceso sea interactivo).

Este segundo fichero define la variable PS1 de esta manera:

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Esto prepara el bonito prompt al que estamos acostumbrados, con user@host:directorio$ .

root@vmserver:~#

Pero decidí que las máquinas virtuales tuvieran el prompt azul para distinguirlas de la máquina física, así que lo modifiqué de esta manera:

set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
# extra color for real/virtual machine differentiation
MACHINECOLOR=34
STARTCOLOR="\e[0;${MACHINECOLOR}m";
ENDCOLOR="\e[0m"
export PS1="$STARTCOLOR$PS1$ENDCOLOR"

Aparte de un detalle para controlar si estamos en un chroot e indicárnoslo, obtenemos el bonito resultado de

root@vmserver:~#

STARTCOLOR se encarga de iniciar el azul, y ENDCOLOR de finalizarlo, lo que es muy importante para evitar que todo el texto quede azul:

root@vmserver:~# ls
root@vmserver:~# echo 1
1
root@vmserver:~#

34 es el código para el azul. Hay otros:

Black 0;30
Red 0;31
Green 0;32
Brown 0;33
Blue 0;34
Purple 0;35
Cyan 0;36
Light Gray 0;37
Dark Gray 1;30
Light Red 1;31
Light Green 1;32
Yellow 1;33
Light Blue 1;34
Light Purple 1;35
Light Cyan 1;36
White 1;37


Lo importante es que estos no son códigos de bash sino secuencias de escape ANSI/VT-100, porque no las interpreta la shell sino la terminal.

Así, podemos usar otros códigos ANSI/VT100 para conseguir otros efectos. Como los que necesito en la máquina física.

# set a fancy prompt (non-color, overwrite the one in /etc/profile)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
# extra color for real/virtual machine differentiation
MACHINECOLOR=31
# root differentiation
if [ $(id -u) -eq 0 ] ; then
    MACHINECOLOR="7;$MACHINECOLOR"
fi
STARTCOLOR="\e[0;${MACHINECOLOR}m";
ENDCOLOR="\e[0m"
export PS1="$STARTCOLOR$PS1$ENDCOLOR"

Aquí utilizo el código 31 que corresponde al rojo, color universal de aviso, que en este caso me indica que estoy en la máquina real, para evitar meter la pata. Pero hay un detalle más: se comprueba si el usuario es root y si es así, se utiliza el código 7 para invertir los colores:

user@realserver:~$ ls
user@realserver:~$ echo 1
1
user@realserver:~$ su -
Contraseña: 
root@realserver:~# ls
root@realserver:~# echo 1
1
root@realserver:~# 

Con lo cual ahora es bastante más difícil equivocarse de máquina o no recordar que uno es root.

El pequeño problema es que normalmente PS1 es posteriormente redefinido en el fichero ~/.bashrc que es llamado desde ~/.profile:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

Así que en el fichero ~/.bashrc de cada usuario, y en el fichero /etc/skel/.bashrc para los nuevos usuarios que se creen, hay que modificarlo a esto:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    #PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1=$PS1
fi
unset color_prompt force_color_prompt

Y ya tenemos nuestras terminales perfectamente coloreadas.

    Referencias:
  1. http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html
  2. http://misc.flogisoft.com/bash/tip_colors_and_formatting
  3. https://wiki.archlinux.org/index.php/Color_Bash_Prompt_(Espa%C3%B1ol)
  4. http://www.termsys.demon.co.uk/vtansi.htm

lunes, 9 de febrero de 2009

fam

Odio famd. Cada vez más.

famd es el «file alteration monitor», un demonio que se encarga de estar al tanto de las modificaciones que puedan sufrir los ficheros. Gracias a él, un proceso cualquiera, como puede ser un gestor de ficheros, no necesita preguntar constantemente al disco si han ocurrido cambios en un fichero, sino que simplemente puede encargarle a famd que le avise si dichos cambios se producen.

El problema es que a veces famd se vuelve loco y empieza a utilizar toda la CPU disponible, lo cual es, en general, un engorro, y en particular para un servidor, un problema.

He acabado por quitarlo.

lunes, 12 de enero de 2009

Servidor Subversion (y II)

Si hace doce días indicaba cómo configurar un servidor Subversión mediante Apache, hoy redondeo la jugada.

Una de las ventajas de utilizar WebDAV como tecnología subyacente es que se puede acceder al repositorio Subversion con un navegador normal y corriente. De hecho, como se pueden incluso montar «carpetas» WebDAV como directorios locales, es posible tener un sistema de ficheros versionado con SVN de manera transparente al usuario.

Pero el navegador normal y corriente, al contrario que las herramienta especializadas en Subversion, no puede acceder a todas las revisiones del repositorio. Tan solo a la última. Así que para que el usuario pueda acceder al código utilizando su navegador, algo normal si queremos, por ejemplo, publicar el código, serán necesarias herramientas adicionales. En este caso, ViewVC, que es una aplicación CGI para mostrar mediante el servidor web repositorios CVS o SVN.

Así que el primer paso es, de manera harto natural, instalarlo con sus dependencias:

aptitude install viewvc


Y el segundo, de manera igualmente natural, decirle a Apache que utilice ViewVC como un CGI cuando se le soliciten determinadas rutas, las que utilizaremos para publicar el código. Esto lo haremos, igualmente, mediante un fichero de configuración específico que haremos residir también en /var/svn:

#Fichero /var/svn/repositorio_viewvc_svn.apache2.conf

# Esto es para evitar que los usuarios vean que ViewVC es un CGI
ScriptAliasMatch ^/viewsvn(.*) /usr/lib/cgi-bin/viewvc.cgi$1


Bastante sencillo, ¿no?

Claro, hay que tener en cuenta que, si habíamos preparado un sistema de control de acceso mediante SVN, no podemos ahora dejar que cualquiera vea cualquier revisión de cualquier fichero. Esto no nos preocupará si las limitaciones que habíamos puesto eran solamente para la escritura, pero sí deberá importarnos si pusimos restricciones de lectura. En ese caso el fichero crece un poco:

#Fichero /var/svn/repositorio_viewvc_svn.apache2.conf

# Esto es para evitar que los usuarios vean que ViewVC es un CGI
ScriptAliasMatch ^/viewsvn(.*) /usr/lib/cgi-bin/viewvc.cgi$1

<Location /viewsvn>
# Repositorio Subversion vía ViewVC

# Método de autenticación y fichero de contraseñas
AuthType Digest
AuthDigestDomain http://miservidor/svn/
AuthName "Repositorio Subversion de miservidor"
AuthUserFile /var/svn/passwd-digest
</Location>

Include /var/svn/auth-viewvc


Suena, ¿no? Bastante parecido (de hecho, idéntico) a la configuración de autenticación para DAV-SVN. Lo que cambia es la configuración de autorización, que ahora debe manejar el propio Apache, y estará en el fichero /var/svn/auth-viewvc, que acabamos de incluir, al estilo de Apache:

#Fichero /var/svn/auth-viewvc
<Location /viewsvn/repo1>
Require user repo1admin repo1colaborador
</Location>

<Location /viewsvn/repo1/privado>
Require user repo1admin
</Location>


Y bien, en dos pasos acabado. El primero es, como la otra vez, enlazar el fichero de configuración en el Apache y activarlo:

ln -s /var/svn/repositorio_viewvc_svn.apache2.conf /etc/apache2/sites-available/repositorio_viewvc_svn
a2ensite repositorio_viewvc_svn
apache2ctl graceful


Y ya funciona. El segundo paso final es configurar ViewVC para que acceda a nuestro repositorio. Para ello tenemos que editar el fichero /etc/viewvc/viewvc.conf y tocar algunas cosas.

No voy a poner el fichero completo, pero sí detallar los cambios mínimos necesarios para que funcione como deseamos:


cvs_roots =
#Hay que vaciarlo

root_parents = /var/svn : svn
#Éste hay que descomentarlo y completarlo

address = <a href="mailto:cvs-admin@insert.your.domain.here">No admin address has been configured</a>
#Se debería poner aquí la dirección del Administrador

root_as_url_component = 1
Hay que cambiarlo para que funcionen nuestro control de acceso y nuestras redirecciones


Y listo: ya tenemos un precioso servidor de ficheros SVN vía web.

miércoles, 31 de diciembre de 2008

Servidor Subversion

Hace poco he instalado un servidor SVN para que distintas personas puedan alojar sus proyectos. Vamos a ver cómo lo he hecho.

El primer paso ha sido, evidentemente, instalar Subversion:

aptitude install subversion


Claro que, para que todos los colaboradores puedan contribuir, tienen que poder acceder a los repositorios. Para ello hay dos métodos, un servidor especializado (svnserve) y el bueno de nuestro querido Apache con web-DAV.

Dados los problemas que puede presentar el servidor especializado con respecto a cortafuegos, proxys y similares, y dado que de todos modos vamos a usar Apache, que además nos permitirá navegar por la versión más reciente de cada repositorio, o incluso descargarlo con herramientas del tipo de wget, hacemos:

aptitude install apache2


Y claro, necesitamos que Apache y Subversion se entiendan:

aptitude install libapache2-svn


El primer paso de decisión es colocar los repositorios. La elección obvia sería /var/svn pero también se pueden considerar otras opciones como /srv/svn o /usr/lib/svn o incluso /usr/local/lib/svn.

Así, dentro de /var/svn tendremos un subdirectorio para cada repositorio completo. Ahora hay que convencer a Apache de que nos los muestre. Para ello, en el mismo directorio creamos un fichero como éste:

#Fichero /var/svn/repositorio_dav_svn.apache2.conf

<Location /svn/>
# Repositorio Subversion vía WebDAV
DAV svn

# Cualquier petición "/svn/algo" corresponderá al repositorio /var/svn/algo
SVNParentPath /var/svn

# Permitimos el listado de repositorios
SVNListParentPath on
</Location>


Con esta configuración ya podemos crear repositorios con
svnadmin create
y directamente los podremos utilizar desde otros ordenadores con órdenes del estilo de
svn co http://host/svn/repositorio
tanto para hacer checkout como commit.

¿O no?

Pues no. Hay dos detalles que se nos han quedado pendientes. El primero es que Apache no se entera de la existencia de ese fichero por arte de magia. Hay que decirle que hay un nuevo sitio disponible y que lo use:

ln -s /var/svn/repositorio_dav_svn.apache2.conf /etc/apache2/sites-available/repositorio_dav_svn
a2ensite repositorio_dav_svn
apache2ctl graceful


Sí, ya sé que sites-available está para configuraciones de tipo VirtualHost, pero es que prefiero dejar las cosas limpitas.

El segundo detalle es que al crear un repositorio con
svnadmin create repositorio
no podremos realizar commit en él, ya que Apache no puede escribir en el directorio. Por ello, ejecutamos

chgrp -R www-data repositorio
chmod -R g+w repositorio


Claro que puede que a los colaboradores no les maraville que todas las versiones de todos los proyectos estén disponibles a todo el mundo, y menos aún con acceso de escritura. Así que hay que hacer algo con los permisos, pero ya no puede ser sobre los repositorios, porque quien accede a ellos es Apache. Así que lo que hacemos es decirle a él que se encargue de la autentificación de usuarios y de su autorización.

Para ello, cogemos el fichero /var/svn/repositorio_dav_svn.apache2.conf de antes y lo modificamos un poco:

#Fichero /var/svn/repositorio_dav_svn.apache2.conf

# Esto es para evitar la incompatibilidad entre SVNListParentPath y AuthzSVNAccessFile
RedirectMatch ^(/svn)$ $1/

<Location /svn/>
# Repositorio Subversion vía WebDAV
DAV svn

# Cualquier petición "/svn/algo" corresponderá al repositorio /var/svn/algo
SVNParentPath /var/svn

# Permitimos el listado de repositorios
SVNListParentPath on

# Fichero de control de acceso por repositorios y ramas
AuthzSVNAccessFile /var/svn/authz

# Orden de prueba de usuarios
Satisfy Any
Require valid-user

# Método de autenticación y fichero de contraseñas
AuthType Digest
AuthDigestDomain http://miservidor/svn/
AuthName "Repositorio Subversion de miservidor"
AuthUserFile /var/svn/passwd-digest
</Location>


Hemos añadido cuatro piezas nuevas. La primera es para evitar un problema con las autentificaciones que puede surgir si se trata de ver el listado de repositorios, y las otras tres, ya dentro de la Location, configuran la autentificación y la autorización.

Ojo, que ese RedirectMatch está para algo, y es que AuthzSVNAccessFile da problemas si la barra final no está, así que es muy importante que la Location diga algo como <Location /svn/> y no <Location /svn> sin la barra final, aunque eso sea lo que viene en la documentación.

La autentificación es el último bloque. En él decimos que queremos que las contraseñas viajen cifradas (AuthType Digest), qué Reino de Autentificación (conjunto de dominios y subdirectorios en ellos) está en juego (es una manera de separar los accesos para distintos sitios con el mismo nombre de usuario, y también de agruparlos), que el cliente utiliza para no requerirnos cada vez el nombre de usuario y la contraseña (AuthDigestDomain http://miservidor/svn/), el nombre del Reino de Autentificación (para que el usuario sepa a qué corresponden el nombre de usuario y contraseña que debe introducir) que el cliente normalmente nos mostrará en el formulario (AuthName "Repositorio Subversion de miservidor") y, finalmente, en qué fichero almacenamos las parejas nombre de usuario-contraseña (AuthUserFile /var/svn/passwd-digest).

Este fichero hay que crearlo con la orden htdigest. Y ojo, que como vamos a utilizar autentificación por digest tenemos que activar el módulo correspondiente de Apache:

a2enmod auth_digest


Los otros dos bloques son el control de acceso. La parte

# Orden de prueba de usuarios
Satisfy Any
Require valid-user

hace que el acceso sin identificarse sea posible allí donde esté permitido. Si no lo ponemos, será imposible incluso acceder a la lista de repositorios sin identificarse. La otra parte simplemente indica qué fichero tiene la lista de control de acceso, es decir, qué nombres de usuario tienen permitido el acceso de lectura o de escritura a cada repositorio y a cada directorio de cada repositorio (AuthzSVNAccessFile /var/svn/authz). Este fichero tiene aproximadamente este aspecto:

# Fichero /var/svn/authz

# Acceso de lectura libre a todos sitios
# (es decir, al listado de repositorios) para todos
# y acceso de escritura al administrador del sitio
[/]
administrador = rw
* = r

# Permisos particulares para el repositorio repo1
# Añadimos permiso de escritura para algunos usuarios
# y quitamos el permiso de lectura para el usuario sin identificar
[repo1:/]
repo1admin = rw
repo1colaborador = rw
* =

# Quitamos el permiso de lectura al colaborador en determinado directorio
[repo1:/privado]
repo1colaborador =


Por supuesto, esta estructura puede complicarse bastante, y además los usuarios se pueden organizar en grupos. Hay más información en http://svnbook.red-bean.com/nightly/en/svn.serverconfig.pathbasedauthz.html.

Y adelante, ya tenemos un servidor Subversion preparado para aguantar lo que le echen.

lunes, 13 de agosto de 2007

Certificados X509 para Apache 2 (I): Clave de la Autoridad Certificadora

PUBLICADA, PERO PENDIENTE DE MEJORAR EL FORMATO (no habrá cambios de contenido, salvo correcciones)



Bueno, a ver cómo van las cosas. Llegas un día y decides que quieres cambiar de protocolo: tu servidor Apache, con la costumbre de escuchar por el puerto 80 (HTTP), quieres que se ponga a escuchar en el puerto 443 (SSL) para usar eso que llaman el "protocolo HTTPS".

En una relación cifrada cliente-servidor como esa normalmente hay tres partes implicadas, no dos. Está el cliente, que no tiene motivos para confiar en el servidor, está el servidor, que no tiene motivos para confiar en el cliente, y está la Autoridad Certificadora. Así, con mayúsculas. Y la idea es que tanto el cliente como el servidor confían en la Autoridad Certificadora. Así, si el servidor presenta al cliente un documento de identidad certificado por la Autoridad Certificadora, el cliente puede estar seguro de que el servidor es quien realmente dice ser, y no un impostor.

Por eso, el papel de la Autoridad Certificadora es tan importante. Si he de meter mi número de tarjeta de crédito para hacer un pago en una página, quiero estar seguro de que el servidor que lo va a recibir es quien dice ser, y estoy seguro si mi navegador me dice que lo es.

Mi navegador me lo dice si el servidor se identifica mediante un certificado firmado por una Autoridad Certificadora en la que confíe. Y los navegadores confían en unas pocas Autoridades Certificadoras que tienen un negocio enorme con la venta de certificados. Evidentemente, los navegadores no confiarán en los certificados de cualquier autoridad certificadora, ya que cualquier ladrón informatizado que falsee una página puede falsear también su certificado creando una autoridad certificadora falsa.

Así que si no quieres pagar los 1500 (sí, mil quinientos) dólares que Verisign[1] u otros piratas semejantes cobran por un certificado, o si simplemente tienes algún motivo para convertirte en tu propia CA (Certificating Authority - Autoridad Certificadora), puedes hacerlo sin demasiados problemas (igual que lo haría el falsificador). Ten en cuenta que un servidor con SSL no funcionará sin un certificado.

Sólo necesitas tener instalado el paquete openssl, que proporciona las piezas y programas necesarios.

Crear la clave maestra de la CA


Lo primero es pensar en dónde almacenaremos todos los ficheros sensibles que vamos a crear. Lo ideal sería que creáramos un directorio sólo para esas cosas, con permisos adecuados, y que nos metiéramos en él antes de empezar a trabajar.

EDITO: He mejorado estas órdenes en una nueva entrada.

Nota: los comandos introducidos a partir de ahora son válidos en un sistema operativo de tipo UNIX, en particular yo los he probado en Linux, en la distribución Debian.

Antes de crear la clave crearemos un directorio llamado private para almacenar en él la clave privada:
mkdir private

A continuación creamos la clave:
openssl genrsa -des3 -out private/cakey.pem 2048

El comando openssl es la base de todo nuestro trabajo. Tiene un buen número de subcomandos para diferentes tareas. En esta ocasión utilizamos el subcomando genrsa para, precisamente, generar una clave RSA. Las opciones indican, por ese orden, que la clave generada estará protegida mediante un cifrado 3DES con contraseña (-3des) y que se almacenará en el directorio private en el fichero cakey.pem (-out private/cakey.pem), mientras que el argumento 2048 indica que la clave generada tendrá 2048 bits de longitud. La clave se almacenará en formato PEM, por eso ponemos la extensión como .pem, mientras que el nombre cakey indica, literalmente, que se trata de la clave de la CA. Esa es, además, la razón (aparte de que lo recomienda la documentación) de que la guardemos en el directorio private.

En la documentación oficial de OpenSSL se detalla que el subcomando genrsa es obsoleto y se debería usar en su lugar el subcomando genpkey, en cuyo caso la línea de órdenes sería:
openssl genpkey -des3 -outform PEM -out private/cakey.pem -pkeyopt rsa_keygen_bits:2048

Ojo: No he probado esta línea.

Bueno, en cualquier caso, como hemos pedido que la clave quede protegida mediante contraseña, tendremos que introducir la contraseña elegida, y volverla a introducir para confirmar que la hemos escrito bien:
openssl genrsa -des3 -out private/cakey.pem 2048
Generating RSA private key, 2048 bit long modulus
..........................................+++
.............................................+++
e is 65537 (0x10001)
Enter pass phrase for private/cakey.pem:
Verifying - Enter pass phrase for private/cakey.pem:

Como se puede ver, el generador nos indica que está creando una clave privada RSA de 2048 bits, con el exponente 65537, lo que es un dato técnico que no nos importa ahora.

¿Y qué son todos esos puntitos y cruces? Pues muy sencillo: hay que encontrar dos números primos, y se prueban números al azar a ver si lo son. Cada puntito es un número probado que pasa una prueba de primalidad sencilla, y cada cruz es un número que pasa una prueba mayor. El salto de línea es un número que pasa todas las pruebas, es decir, que es uno de los dos números primos que estamos buscando.

Ojo: no pierdas nunca la contraseña que has introducido para cifrar la clave privada de la CA. Sin esa contraseña, toda la estructura de la CA queda inutilizada.

Seguiré en otro artículo con la creación del certificado raíz, la creación de la clave del servidor y la creación del certificado del servidor.