anterior índice siguiente

Escribir datos en un certificado

Bien, pues hemos visto como obtener datos de un certificado X509, pero ahora seguro que esta ansioso por poder manipularlos a su voluntad y que los cambios queden para la posteridad. Para ello será necesario cambiar los datos en el certificado a su antojo. Pues vamos a ver como podemos hacer esto. Usaremos las funciones siguientes:

Las dos funciones no necesitan mucha explicación. Es prácticamente el caso contrario de cuando leíamos estos datos.


// En este ejemplo vamos a cargar un certificado y cambiar el numero de serie
// y el numero de la version de certificado.
// La sintaxis es:
//                      ponerserial cert_in serial cert_out
//
//      Ejemplo creado por Jose Traver - jose@nisu.org

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

int main (int argc, char ** argv)
{
   FILE *fp_cert, *fp_out;
   X509 * x;
   ASN1_INTEGER * numserie;
   long serie;
   long version = 3;  // Somos muy avanzados ;-) Recordemos que comienza en 0.

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

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

   serie=atol(argv[2]);

   // leemos el certificado

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

   // Zona de insercion de datos

   // Numero de version
   X509_set_version(x, version);

   // Numero de serie
   numserie=ASN1_INTEGER_new();
   ASN1_INTEGER_set(numserie, serie);
   X509_set_serialNumber(x,numserie);

   // Cerrando fichero y acabando

   PEM_write_X509(fp_out,x);

   fclose(fp_cert);
   fclose(fp_out);

   X509_free(x);
}

Ejemplo 6. Modificación del número de serie y versión de un X509

Recordemos que con esto estamos cambiando los datos del certificado referentes a la parte del subject, pues la parte del issuer se considera como otro certificado al que no estamos accediendo, aunque sea autofirmado.

Esta vez usamos una variante respecto de lo que parece habitual. Aunque también se podrían utilizar las funciones X509_set_notBefore(X509 * x, ASN1_UTCTIME * tm) y X509_set_notAfter(X509 * x, ASN1_UTCTIME * tm), es mucho más comodo usar:

Esto lo que hace es añadir una cantidad de tiempo al que tiene el certificado actualmente, por supuesto en segundos (con valores positivos y negativos).
// En este ejemplo vamos a cargar un certificado y cambiar las fechas de
// validez.
// La sintaxis es:
//              ponerfechas cert_in cert_out fecha_desde fecha_hasta
//
//      Ejemplo creado por Jose Traver - jose@nisu.org

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

int main (int argc, char ** argv)
{
   FILE *fp_cert, *fp_out;
   X509 * x;
   long desde,hasta;

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

    if ((fp_out =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);

   // Zona de insercion de datos

   desde=atol(argv[3]);
   hasta=atol(argv[4]);
   X509_gmtime_adj(X509_get_notBefore(x),desde);
   X509_gmtime_adj(X509_get_notAfter(x),hasta);

   // Cerrando fichero y acabando

   PEM_write_X509(fp_out,x);

   fclose(fp_cert);
   fclose(fp_out);

   X509_free(x);
}

Ejemplo 7. Modificación de las fechas de validez de un X509


anterior índice siguiente