anterior | índice | siguiente |
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:
// 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