paquetesGUIxSeguridad
Utilidades para leer certificados de Internet Explorer, eDNI, firmar
y
verificar firma de forma sencilla.1. Acceso HTTPS con eDNI
2. Firma digital y verificación
3. Seleccionar un certificado de forma visual
1. Acceso HTTPS con eDNI
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.security.KeyStore;
import java.security.Provider;
import java.security.Security;
import java.util.Enumeration;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import utilesGUIxSeguridad.JCertificadosSUN;
import utilesGUIxSeguridad.JFrameSeleccionarCertificado;
/**
*
* @author eduardo
*/
public class JTest5 {
public static void main(String[] args) throws
Exception {
//conectamos con url
HttpsURLConnection
connection = null;
URL url = null;
//config. para leer la dll
PKCS11 directamente (en este caso la de la Universidad de Murcia)
String ls =
"name = DNIe" + "\n"
+ "slot = 1" + "\n"
+ "library = c:/WINDOWS/system32/UMU_PKCS11_v1_02.dll" + "\n"
+ "showInfo=true" + "\n";
InputStream loConf = new
ByteArrayInputStream(ls.getBytes());
//Creamos el Provider con la
clase SunPKCS11
Provider nss = new
sun.security.pkcs11.SunPKCS11(loConf);
Security.addProvider(nss);
//creamos el keystore
KeyStore ks =
KeyStore.getInstance("PKCS11", nss);
ks.load(null,
"1111".toCharArray());
//recorremos todos los
certificados e imprimimos el titulo
Enumeration aliases =
ks.aliases();
String alias = null;
while
(aliases.hasMoreElements()) {
alias = (String) aliases.nextElement();
System.out.println(alias);
}
//creamos el controlador de
seguridad
JCertificadosSUN loCert =
new JCertificadosSUN();
//establecemos el keystore
loCert.setKeyStore(ks);
//seleccionamos un
certificado
new
JFrameSeleccionarCertificado(null, loCert).setVisible(true);
SSLContext sc =
SSLContext.getInstance("SSLv3");
url = new
URL("https://172.16.0.4:8443/");
connection =
(HttpsURLConnection) url.openConnection();
//establecemos el
verificador de nombres, la funcion de esta clase es comprobar que el
certificado del servidor
//contiene la direccion del
servidor, si se construye con true ignora esta comprobacion, util para
pruebas
connection.setHostnameVerifier(new
JTramitacionOnLineHostNameVerifier(true));
//establecemos el conexto
ssl, con nuestro controlador de certificados que ya tiene el
certificado a usar
sc.init(
//controlador de certificados que ya tiene el certificado a usar
new KeyManager[]{
new JTramitacionOnLineKeyManager(loCert)
},
//TrustManager:comprueba la cadena de confianza del certificado del
servidor
//cuando se crea a true no comprueba la cadena de confianza del
certificado del servidor, es util cuando somos nosotros los q creamos
los certificados
new TrustManager[]{new JTramitacionOnLineTrustManager(true)},
null);
connection.setSSLSocketFactory(sc.getSocketFactory());
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("User-Agent", "Mozilla/4.05 [en] (WinNT;
I)");
connection.setFollowRedirects(true);
connection.setInstanceFollowRedirects(true);
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
OutputStreamWriter out = new
OutputStreamWriter(connection.getOutputStream());
out.write("");
out.close();
System.err.println(connection.getResponseCode());
InputStream in =
connection.getInputStream();
int l;
while ((l = in.read()) >=
0) {
System.out.print((char) l);
}
}
}
2. Firma digital y verificación
ICertificados loAux = new
JCertificadosSUN();
Vector loVector =
loAux.getListaCertificados();
loAux.mostrarInformacionCertificados(loVector);
loAux.setX509Certificate((X509Certificate) loVector.get(0));
byte[] lab =
loAux.sign("pepe".getBytes());
System.out.println(loAux.getTransFormarABASE64(lab));
System.out.println(" La verificación resultó: "
+ loAux.verificar("pepe".getBytes(), lab) + "!!!\n");
3. Seleccionar un certificado de forma visual
try {
ICertificados loCert = new JCertificadosSUN();
//mostramos el formulario para seleccionar un certificado digital
new JFrameSeleccionarCertificado(null, loCert).setVisible(true);
byte[] lab = loCert.sign("pepe".getBytes());
System.out.println(loCert.getTransFormarABASE64(lab));
System.out.println(" La verificación resultó: "
+ loCert.verificar("pepe".getBytes(), lab) + "!!!\n");
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(new JLabel(), ex);
}
4. Firmar un PDF
//leemos certificado
KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream(msFirmaFichero),
msFirmaPasword.toCharArray());
JCertificadosSUN loCert = new JCertificadosSUN();
loCert.setKeyStore(ks);
loCert.setPassword(msFirmaPasword);
loCert.setX509Certificate((X509Certificate)loCert.getListaCertificados().get(0));
//leemos el fichero PDF recien creado
FileInputStream loin = new FileInputStream("PDFOriginal.pdf"));
//un nuevo fichero de firma
File loFilePDF = new File("PDFFirmado.pdf");
loFileO = new FileOutputStream(loFilePDF);
//firma del fichero
loCert.fimarPDF(loin, loFileO, "ITV", "SPAIN", new Rectangle(0, 450,
200, 100)); //verificar firma
loCert.verificarPDF(new FileInputStream(loFilePDF),
null);
NOTA: al abrirlo en Acrobat Reader te indica si la firma es valida, esto lo acepta el cliente cuando lo abre.
Si el certificado no es de confianza lo puedes añadir a la cadena de confianza: una vez abierto el documento ir a propieades de la firma, mostrar certificado, pestaña confianza, agregar idetntidades de confianza y marcarlo todo