anterior índice siguiente

La seguridad de clave pública en un certificado

Uno de los datos fundamentales que posee un certificado es la clave pública del propietario. Esta clave pública es la que nos permitirá mandarle mensajes seguros pues la usamos para cifrar información que sólo puede ser descifrada con la clave privada que posee esa persona. Es el principio de criptografía de clave pública.
Para manejar este elemento contamos con dos funciones que nos ayudan:

Así, podemos ver el resultado de obtener una clave de un certificado en el ejemplo 8.


//En este ejemplo vamos a leer una clave publica de un certificado x509
//La sintaxis es:
//			clavepub certin claveRSA
//
//	Ejemplo realizado por Jose Traver - jose@nisu.org

#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <stdio.h>


int main (int argc, char ** argv)
{
   FILE * fp_clave, * fp_cert;
   X509 * x;
   EVP_PKEY * clave;
   RSA * r;
 
   // Abrimos el fichero 

   if ((fp_cert =fopen(argv[1],"r")) == NULL) {
	perror("ERROR al leer el fichero con el certificado");
	exit(1);
   }

   if ((fp_clave =fopen(argv[2],"w")) == NULL) {
        perror("ERROR al abrir el fichero de SALIDA");
        exit(1);
   }

   // Leemos el certificado

   x = PEM_read_X509 (fp_cert,NULL,NULL,NULL);

   // Obtenemos la clave publica del certificado

   clave = X509_get_pubkey(x);
   
   //Extraemos la clave de la estructura EVP_PKEY

   r = EVP_PKEY_get1_RSA(clave);

   // Escribimos la clave el el fichero de salida

   PEM_write_RSAPublicKey(fp_clave,r);
   
   fclose(fp_clave);
   fclose(fp_clave);
   X509_free(x);
   EVP_PKEY_free(clave);
}

Ejemplo 8. Extracción de la clave RSA pública

Leemos un certificado, le extraemos su clave, escribiendo la clave. ¡Ojo! esa clave pública que hemos obtenido debe ir con la clave privada junto a la que fue generada para poder usarla con otros certificados (extaraño, no se me ocurren motivos), además de firmar el nuevo resultado. Si no se hace esto, la validez del certificado sería nula.

En cualquier caso, hemos de pensar que una persona no se hace su certificado X509 (excepto si lo hace autofirmado, siendo esa persona mismo titular y autoridad certificadora). Es la Autoridad Certificadora quien recibe una petición de certificado y firma esa petición, creando un nuevo objeto x509 a partir de los datos de la petición y otros que posee la autoridad.

La Forma que tiene una persona de pedir un certificado es a través de un objeto PKCS 10 o también conocido como Petición de certificado (CSR, certificate signing request). Es misión de la autoridad certificadora asegurarse de los datos que certifica, de lo contrario sus certificados tendrían una validez pésima.

Para poder asegurarnos de que la clave del certificado es correcta o la hemos puesto bien, podemos usar la función X509_check_private_key, tal y como se puede ver en el ejemplo 9, donde se lee un certificado X509 y su "supuesta" clave privada y se compara que sea la misma.



//En este ejemplo vamos a leer una clave publica de un certificado x509
//La sintaxis es:
//                      cmppkey cert clave
//
//      Ejemplo realizado por Jose Traver - jose@nisu.org

#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char ** argv)
{
   EVP_PKEY *evp;
   FILE *fp_cert, *fp_clave;
   X509 * x;
   int resultado;

   // Abrimos el fichero y leemos el certificado
   if ((fp_cert =fopen(argv[1],"r")) == NULL) {
        perror("ERROR al leer el fichero con el certificado");
        exit(1);
   }

   // Abrimos el fichero de la clave

   if ((fp_clave = fopen (argv[2],"r")) == NULL ){
        perror("ERROR al leer la clave privada");
        exit(1);
   }

   // leemos el certificado

   x = PEM_read_X509 (fp_cert,NULL,NULL,NULL);

   printf("Certificado leido\n");

   // Leemos la clave privada

   PEM_read_PrivateKey(fp_clave,&evp,NULL,NULL);
   printf("Clave leida\n");

   // Comprobamos la clave con la del certificado

   if (X509_check_private_key(x,evp) == 1)
   	printf("Clave correcta\n");
   else {perror("ERROR las claves no coinciden");
	exit(1);}


   fclose(fp_cert);
   fclose(fp_clave);

   EVP_PKEY_free(evp);
   X509_free(x);

}

Ejemplo 9. Comprobación de la clave de un X509


anterior índice siguiente