Capítulo 3. Gestión de Claves

Tabla de contenidos
Gestionando nuestro par de claves
Validar otras claves en nuestro anillo de claves públicas
Distribución de claves

En criptografía de clave pública la manipulación de claves es un punto flaco a tener en cuenta. Un «escucha» podría manipular los ficheros con las claves, o falsificar la clave pública y hacerla pública para que la usaran otros como si fuera la auténtica. Por ejemplo, supongamos que Jordi quisiera monitorizar los mensajes que Javier envía a Arancha. Jordi podría montar lo que se conoce como un intermediario en el plan de ataque. En este ataque Jordi crea una nuevo par de claves pública y privada, reemplazando la clave pública de Arancha que posee Javier con la nueva clave pública. A partir de ahí intercepta los mensajes que Javier envía a Arancha. Cada mensaje que intercepte lo descifrará usando la nueva clave privada, lo volverá a cifrar con la clave auténtica de Arancha, y reenviará el mensaje cifrado a Arancha. Así, todos los mensajes que Javier envíe a Arancha pueden ser leídos por Jordi.

Una buena gestión de claves es crucial para asegurarse, no sólo de la integridad de nuestros ficheros de claves, sino también de la integridad de los anillos de claves de otros. El punto central en la gestión de claves en GnuPG es la noción que hay detrás de firmar las claves. Firmar las claves tiene dos propósitos principales: nos permite detectar una manipulación en nuestros anillos de claves, y nos permite certificar que una clave realmente pertenece a la persona cuyo nombre aparece en el identificador de usuario de la clave. Las firmas de las claves también se usan en un esquema conocido como anillo de confianza para hacer extensiva la certificación de claves que no han sido firmadas directamente por el usuario, sino que han sido firmadas por otros en los que él confía. Un usuario responsable que lleve a cabo una buena gestión de claves puede contrarrestar los efectos prácticos de la manipulación de claves con GnuPG.

Gestionando nuestro par de claves

Un par de claves se compone de una clave pública y otra privada. Una clave pública se compone de la parte pública de la clave de firmado maestra, las partes públicas de las subclaves de firmado y cifrado, y de un juego de identificadores de usuario que se usa para asociar la clave pública con una persona real. Cada una de estas partes contiene datos sobre sí misma. Para una clave estos datos constan de su propio identificador, fecha de creación, fecha de caducidad, etc... Para un identificador de usuario, estos datos constan del nombre de la persona a la que identifica, un comentario opcional, y una dirección de correo electrónico. La estructura de la claves privada es parecida, con la diferencia de que sólo contiene las partes privadas de las claves, y que no tiene la información del identificador de usuario.

La opción de la línea de órdenes --edit-key se puede usar para ver un par de claves. Por ejemplo,

jordi% gpg --edit-key jordi@cat.es
Secret key is available.

pub  1024D/1208DD4F  created: 1999-09-24 expires: never      trust: -/u
sub  1024g/B9688D9E  created: 1999-09-24 expires: never
sub  2016G/4D88ACC4  created: 1999-09-26 expires: 2002-09-25
sub   960D/412EAF0C  created: 1999-09-26 expires: 2002-09-25
(1)  Jordi (Castell S.L.) <jordi@cat.es>
(2)  Jordi (oficina) <jordi@castell.com>

Command>
La clave pública se muestra junto con una indicación sobre si la clave privada se encuentra disponible o no. La información sobre cada componente de la clave pública se da en una lista. La primera columna indica el tipo de la clave. La palabra clave pub identifica a la clave pública maestra de firmado, y la palabra clave sub identifica a una clave pública subordinada a la anterior. La segunda columna informa sobre el tamaño en "bits" de la clave, el tipo, y el identificador. El tipo es D para una clave DSA, g para una clave ElGamal que sólo se pueda usar para cifrar, y G para una clave ElGamal que se pueda usar tanto para cifrar como para firmar. La fecha de creación y la fecha de caducidad se muestran en las columnas tres y cuatro. Los identificadores de usuario aparecen en una lista a continuación de las claves.

Se puede obtener más información sobre la clave mediante órdenes interactivas. La orden toggle sirve para conmutar entre los componentes público y privado de un par de claves, siempre y cuando ambos componentes estén presentes.

Command> toggle

sec  1024D/1208DD4F  created: 1999-09-24 expires: never
sbb  1024g/B9688D9E  created: 1999-09-24 expires: never
sbb   960D/412EAF0C  created: 1999-09-26 expires: 2002-09-25
sbb  2016G/4D88ACC4  created: 1999-09-26 expires: 2002-09-25
(1)  Jordi (Castell S.L.) <jordi@cat.es>
(2)  Jordi (oficina) <jordi@castell.com>
Esta información es parecida a la del componente para la clave pública. La palabra clave sec identifica a la clave privada maestra de firmado, y la palabra clave sbb identifica las claves subordinadas privadas. Los identificadores de usuario de la clave pública también aparecen en este caso.

Integridad de claves

Al distribuir nuestra clave pública, estamos distribuyendo los componentes públicos de nuestras claves maestra y subordinada, así como los identificadores de usuario. Sin embargo, por sí sola, la distribución de este material constituye un riesgo para la seguridad ya que sería posible que un atacante manipulara la clave. Se puede modificar una clave pública añadiendo o substituyendo claves, o añadiendo o cambiando los identificadores de usuario. Al manipular un identificador de usuario, el atacante podría cambiar la dirección de correo del identificador de usuario y redireccionar así el correo a su propia dirección. Al cambiar una de las claves de cifrado el atacante también podría descifrar los mensajes que le llegaran redireccionados.

El uso de las firmas digitales es una solución a este problema. Cuando unos datos son firmados por una clave privada, la clave pública correspondiente queda ligada a los datos firmados. En otras palabras, sólo la clave pública correspondiente puede verificar la firma y asegurar que los datos no han sido modificados. Una clave pública se puede proteger de la manipulación usando su correspondiente clave privada maestra, y firmando con ésta los componentes de la clave pública y los identificadores de usuario, ligando de este modo los componentes a la clave pública maestra. La acción de firmar los componentes de la clave pública con la correspondiente clave privada maestra se conoce como autofirmar, y una clave pública que contenga identificadores de usuario autofirmados ligados a ella se llama certificado.

Como ejemplo, si Jordi tuviera dos identificadores de usuario y tres subclaves, las firmas en los identificadores de usuario se podrían comprobar con la orden check desde el menú de edición de la clave.

jordi% gpg --edit-key jordi
Secret key is available.

pub  1024D/1208DD4F  created: 1999-09-24 expires: never      trust: -/u
sub  1024g/B9688D9E  created: 1999-09-24 expires: never
sub   960D/412EAF0C  created: 1999-09-26 expires: 2002-09-25
sub  2016G/4D88ACC4  created: 1999-09-26 expires: 2002-09-25
(1)  Jordi (Castell S.L.) <jordi@cat.es>
(2)  Jordi (oficina) <jordi@castell.com>

Command> check
uid  Jordi (Castell S.L.) <jordi@cat.es>
sig!       1208DD4F 1999-09-24   [self-signature]
uid  Jordi (oficina) <jordi@castell.com>
sig!       1208DD4F 1999-09-26   [self-signature]
Como era de esperar, la clave firmante para cada firma es la clave de firmado maestra con el identificador de clave 0x26B6AAE1. La autofirma en las subclaves se encuentra presente en la clave pública, pero en la interfaz de GnuPG no aparece.

Añadir y eliminar componentes a las claves

Tanto las nuevas subclaves como los nuevos identificadores de usuario, pueden ser añadidos a nuestro par de claves una vez que éste ya haya sido creado. Un identificador de usuario se añade mediante la orden adduid. A continuación se nos pedirá que introduzcamos un nombre real, una dirección de correo electrónico, y un comentario, del mismo modo que cuando generamos el par de claves inicial. Una subclave se añade usando la orden addkey. La interfaz es parecida a la usada cuando generamos un par de claves nuevo. La subclave puede ser una clave para firmado DSA y una clave sólo para cifrado ElGamal, o una clave para firmado y cifrado ElGamal. Cuando se genera una subclave o un identificador de usuario, éstos son autofirmados con nuestra clave de firmado maestra, por lo que se nos requerirá que introduzcamos la contraseña.

Los identificadores de usuario adicionales son útiles si necesitamos múltiples identidades. Por ejemplo, puede darse el caso de que utilicemos una identidad para el trabajo y otra para nuestras actividades políticas. Los colegas de trabajo nos conocerán por nuestro identificador de usuario del trabajo. Los correligionarios políticos nos conocerán por nuestra identidad de usuario política. Como es posible que estos grupos de personas no coincidan, cada grupo no se fiará del identificador que no corresponda. Por lo tanto, ambos identificadores de usuario son necesarios.

Las subclaves adicionales son también muy útiles. Los identificadores de usuario asociados con nuestra clave pública maestra son validados por las personas con quien nos comunicamos y por tanto, cambiar la clave maestra requiere «recertificación». Pero esto puede resultar difícil y una pérdida de tiempo si nos comunicamos con muchas personas. Por otra parte, es bueno cambiar las subclaves de cifrado periódicamente. Si una clave es descubierta, todos los datos cifrados con esa clave serán vulnerables. De todos modos, al cambiar las claves sólo los datos cifrados con la clave descubierta serán revelados.

También es posible eliminar las subclaves y los identificadores de usuario. Para eliminar una subclave o un identificador de usuario es preciso seleccionarlo primero con las órdenes key o uid respectivamente. Estas órdenes actúan como conmutadores. Por ejemplo, la orden key 2 selecciona la segunda subclave, e invocando key 2 de nuevo, desactiva la selección. Si no se da ningún otro argumento extra, todas las subclaves o identificadores de usuario son deseleccionados. Una vez que los identificadores de usuario que se van a eliminar son seleccionados, la orden deluid elimina los identificadores de usuario de la clave. De igual forma, la orden delkey elimina todas las subclaves previamente seleccionadas de nuestras claves pública y privada.

En la gestión local de anillos de claves, el eliminar componentes innecesarios de una clave es una buena práctica para aliviar los anillos de claves públicas de otros. Sin embargo, eliminar identificadores de usuarios y subclaves de nuestra propia clave no es siempre conveniente, ya que puede complicar la distribución de la clave. Por definición, cuando un usuario importa nuestra clave pública actualizada ésta se fusiona con la copia de la clave pública vieja en su anillo de claves, siempre que la vieja esté allí «a priori». Los componentes de ambas claves se combinan con la fusión, y el resultado de ésta es que se añade cualquier nuevo componente, pero también que se restaura cualquier componente eliminado. Para actualizar de manera correcta la clave es necesario que el usuario elimine primero la versión antigua de nuestra clave, y después que importe la versión nueva. Esto significa una carga extra para la gente con la que nos comunicamos. Es más, si enviáramos nuestra clave a un servidor de claves la fusión ocurriría a nuestro pesar, y cualquiera que se bajara nuestra clave del servidor no vería nunca nuestra clave con los componentes eliminados. En consecuencia, para actualizar nuestra propia clave es mejor revocar los componentes de la clave que eliminarlos.

Revocar componentes de una clave

Para revocar una subclave antes tenemos que seleccionarla. Una vez seleccionada, puede ser revocada con la orden revkey. La clave se revoca añadiéndole una autofirma de revocación. Al contrario que la opción de la línea de órdenes --gen-revoke, el efecto de revocación de una subclave es inmediato.


Command> key 4D88ACC4

pub  1024D/1208DD4F  created: 1999-09-24 expires: never      trust: -/u
sub  1024g/B9688D9E  created: 1999-09-24 expires: never
sub* 2016G/4D88ACC4  created: 1999-09-26 expires: 2002-09-25
sub   960D/412EAF0C  created: 1999-09-26 expires: 2002-09-25
(1)  Jordi (Castell S.L.) <jordi@cat.es>
(2)  Jordi (oficina) <jordi@castell.com>

Command> revkey
Do you really want to revoke this key? y

You need a passphrase to unlock the secret key for
user: "Jordi (Castell S.L.) <jordi@cat.es>"
1024-bit DSA key, ID 1208DD4F, created 1999-09-24

pub  1024D/1208DD4F  created: 1999-09-24 expires: never      trust: -/u
sub  1024g/B9688D9E  created: 1999-09-24 expires: never
sub  2016G/4D88ACC4  created: 1999-09-26 expires: 2002-09-25
rev! subkey has been revoked: 1999-09-26
sub   960D/412EAF0C  created: 1999-09-26 expires: 2002-09-25
(1)  Jordi (Castell S.L.) <jordi@cat.es>
(2)  Jordi (oficina) <jordi@castell.com>

La revocación de un identificador de usuario funciona de modo diferente. Generalmente, un identificador de usuario recolecta firmas que atestigüen que el identificador de usuario describe a la persona que sea la auténtica propietaria de la clave asociada. En teoría un identificador de usuario describe a una persona para siempre, ya que la identidad de esa persona no cambiará nunca. En la práctica los elementos del identificador de usuario, como la dirección de correo electrónico y el comentario, pueden cambiar con el tiempo, invalidando así el identificador de usuario.

Las especificaciones de OpenPGP no preveen la revocación del identificador de usuario, pero un identificador de usuario puede ser revocado de modo efectivo, revocando la autofirma en el identificador de usuario. Por razones de seguridad descritas anteriormente, los corresponsales no confiarán en un identificador de usuario con una autofirma no válida.

Una firma puede ser revocada mediante la orden revsig. Como es posible que hayamos firmado cualquier cantidad de identificadores de usuario, la interfaz nos pedirá que decidamos si queremos o no revocar cada una de las firmas.

Command> revsig
Command> revsig
You have signed these user IDs:
     Jordi (Castell S.L.) <jordi@cat.es>
   signed by 1208DD4F at 1999-09-24
     Jordi (oficina) <jordi@castell.com>
   signed by 1208DD4F at 1999-09-26
user ID: "Jordi (Castell S.L.) <jordi@cat.es>"
signed with your key 1208DD4F at 1999-09-24
Create a revocation certificate for this signature? (y/N)n
user ID: "Jordi (oficina) <jordi@castell.com>"
signed with your key 1208DD4F at 1999-09-26
Create a revocation certificate for this signature? (y/N)y
You are about to revoke these signatures:
     Jordi (oficina) <jordi@castell.com>
   signed by 1208DD4F at 1999-09-26
Really create the revocation certificates? (y/N)y

You need a passphrase to unlock the secret key for
user: "Jordi (Castell S.L.) <jordi@cat.es>"
1024-bit DSA key, ID 1208DD4F, created 1999-09-24

Enter passphrase:

pub  1024D/1208DD4F  created: 1999-09-24 expires: never      trust: -/u
sub  1024g/B9688D9E  created: 1999-09-24 expires: never
sub  2016G/4D88ACC4  created: 1999-09-26 expires: 2002-09-25
rev! subkey has been revoked: 1999-09-26
sub   960D/412EAF0C  created: 1999-09-26 expires: 2002-09-25
(1)  Jordi (Castell S.L.) <jordi@cat.es>
(2)  Jordi (oficina) <jordi@castell.com>

Un identificador de usuario revocado vendrá indicado por la firma de revocación en el identificador, y se podrá ver en las firmas en la lista de identificadores de usuario de las claves.

Command< check
uid  Jordi (Castell S.L.) <jordi@cat.es>
sig!       1208DD4F 1999-09-24   [self-signature]
uid  Jordi (oficina) <jordi@castell.com>
rev!       1208DD4F 1999-09-26   [revocation]
sig!       1208DD4F 1999-09-26   [self-signature]
sig!       B87DBA93 1999-06-28   [self-signature]

Al revocar tanto las subclaves como las autofirmas en los identificadores de usuarios, añadimos autofirmas de revocación a la clave. Ya que las firmas son añadidas a la clave y no eliminamos nada, una revocación siempre estará visible para otros usuarios desde el momento en el que la actualización de nuestra clave pública sea distribuida y fusionada con las copias más viejas de ésta. Por lo tanto, la revocación garantiza que todos los usuarios tengan una copia consistente de nuestra clave pública.

Actualizar la fecha de caducidad de una clave

La fecha de caducidad de una clave puede ser actualizada con la orden expire desde el menú de edición de la clave. Si no se selecciona ninguna clave, se actualizará la fecha de caducidad de la clave primaria. De otro modo, se actualizará la fecha de caducidad de la clave subordinada que hayamos seleccionado.

La fecha de caducidad de una clave está asociada con la autofirma de la clave. La fecha de caducidad se actualiza eliminando la autofirma antigua y añadiendo una nueva autofirma. Ya que los corresponsales no habrán eliminado la autofirma antigua, verán una autofirma adicional en la clave cuando actualicen su copia de nuestra clave. La última autofirma es la que tiene precedencia, así que todos los corresponsales pueden saber sin ambigüedad las fechas de caducidad de nuestras claves.