viernes, 9 de julio de 2010

Firma de Documentos con Archivos .p12 Usando BouncyCastle

Buscando en la red un ejemplo de como firmar un archivo digitalmente usando la librería BouncyCastle y la extensión p7z usada por Certicamara pude notar que no es fácil hallar con uno, así que decidí publicar este sencillo y básico ejemplo.
Lo primero que debemos tener en cuenta es que necesitamos "decirle a Java" que proveeedor de seguridad queremos usar
Security.addProvider(new BouncyCastleProvider());
Luego debemos instanciar un nuevo keystore, el certificado y key con los que vamos a trabajar
KeyStore ks;
X509Certificate certificate;
PrivateKey key;
String alias;
ks = KeyStore.getInstance("PKCS12");
ks.load(new java.io.FileInputStream("La_ruta_del_certificado_p12"), "la_clave".toCharArray());
for (Enumeration aliasEnum = ks.aliases(); aliasEnum.hasMoreElements();) {
alias = (String) aliasEnum.nextElement();
if (ks.isKeyEntry(alias)) {
certificate = (X509Certificate) ks.getCertificate(alias);
key = (PrivateKey) ks.getKey(alias, password.toCharArray());
break;
}
}
Hecho esto podemos proceder a firmar nuestro archivo
byte[] data = convertimos_el_archivo_a_bytes;
CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSigner(key, (X509Certificate) certificate, CMSSignedDataGenerator.DIGEST_SHA1);
generator.addCertificatesAndCRLs(getCertStore(ks, alias));
CMSProcessable content = new CMSProcessableByteArray(data);
CMSSignedData signedData = generator.generate(content, true, "BC");
bytes[] salida = signedData.getEncoded();
Aquí ya podemos escribir los bytes en un archivo y colocarle la extensión .p7z si se quiere