Certificados digitales
1.
Firma "en bruto"
con eDNI o con cualquier certificado incluido en internet explorer
2. Tomcat pida a internet explorer cliente un certificado digital eDNI
3. Acceso HTTPS con eDNI (DNI electrónico)
4. openSSL, autoridad certificadora
2. Tomcat
pida a internet explorer cliente un certificado digital
eDNI
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
y dejarla asi
<Connector port="8443" maxHttpHeaderSize="8192" SSLEnabled="true"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
acceptCount="100" scheme="https" secure="true"
enableLookups="false" disableUploadTimeout="true"
clientAuth="true" sslProtocol="TLS"
truststoreFile="/home/eduardo/.truststore" truststorePass="eduardo"
keystoreFile="/home/eduardo/myKeyStore" keystorePass="eduardo"
/>
Los parámetros de configuración del elemento "Connector" que debemos establecer son:
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
[Unknown]: 172.16.0.4
¿Cuál es el nombre de su unidad de organización?
[Unknown]: Informatica
¿Cuál es el nombre de su organización?
[Unknown]: informatica
¿Cuál es el nombre de su ciudad o localidad?
[Unknown]: Murcia
¿Cuál es el nombre de su estado o provincia?
[Unknown]: Murcia
¿Cuál es el código de país de dos letras de la unidad?
[Unknown]: es
¿Es correcto CN=Eduardo Gonzalez, OU=Informatica, O=informatica, L=Murcia, ST=Murcia, C=es?
[no]: y
Generando par de claves RSA de 1.024 bits para certificado autofirmado (SHA1withRSA) con una validez de 90 días
para: CN=Eduardo Gonzalez, OU=Informatica, O=informatica, L=Murcia, ST=Murcia, C=es
Escriba la contraseña clave para <mykey>
(INTRO si es la misma contraseña que la del almacén de claves):
Le damos a INTRO para que utilice la misma que la del almacén.
keytool -import -keystore /home/eduardo/.truststore -file FNMTClase2CA.cer
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>*.ctrl</url-pattern>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
esto es todas las paginas con .ctrl o .jsp se pedira propotoco seguro y el certificado digital eDNI
otro ejemplo
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Todas las llamadas q esten en el directorio /secure de la aplicacion
2. Tomcat pida a internet explorer cliente un certificado digital eDNI
3. Acceso HTTPS con eDNI (DNI electrónico)
4. openSSL, autoridad certificadora
1. Firma "en bruto" con eDNI o con cualquier certificado incluido en internet explorer
1.1 mityc
(http://oficinavirtual.mityc.es/componentes/index.html)Conjunto de clases y dll que ha desarrollado el ministerio de
industria
para la eFactura
Código:
- Version 1.0.4
IESignEngine moBrige
= new IESignEngine();
IPKStoreManager moStore =
new IExplorerStore();
Vector loVector1 = new
Vector(moStore.getSignCertificates());
moBrige.setBinaryCertificate(((X509Certificate)
loVector1.get(0)).getEncoded());
moBrige.setToSign("pepe".getBytes());
byte[] lab1 =
moBrige.engineSign();
BASE64Encoder
moBase64Encoder = new BASE64Encoder();
BASE64Decoder
moBase64Decoder = new
BASE64Decoder();
System.out.println(moBase64Encoder.encode(lab1));
Signature rsa_vfy =
Signature.getInstance("SHA1withRSA");
rsa_vfy.initVerify(((X509Certificate) loVector1.get(0)).getPublicKey());
rsa_vfy.update("pepe".getBytes());
boolean lbResult =
rsa_vfy.verify(lab1);
System.out.println(" La verificación resultó: "
+ lbResult + "!!!\n");
- Version 0.9
// Accedemos al almacén de
certificados de internet explorer
InterfazFirma si =
UtilidadFirmaElectronica.getSignatureInstance(EnumAlmacenCertificados.ALMACEN_EXPLORER);
listCertificates =
si.getAllCertificates("My");
// Accedemos al almacén de
certificados de Mozilla Firefox
//InterfazFirma si =
UtilidadFirmaElectronica.getSignatureInstance(EnumAlmacenCertificados.ALMACEN_MOZILLA);
//listCertificates =
si.getAllCertificates("Poner aqui la ruta al perfil de Mozilla");
System.out.println("Hay " +
listCertificates.size() + " certificados");
//
mostrarInformacionCertificados(listCertificates);
//recogemos el certificado
para firmar
// moCerts =
(X509Certificate[]) listCertificates.toArray();
//Seleccionamos el primero
de los certificados para firmar
moX509 = (X509Certificate)
listCertificates.get(0);
// // Consigue la clave
privada
// moPriv = (PrivateKey)
keystore.getKey(alias, pwd);
//
// if (moPriv == null) {
//
throw new Exception(alias + " could not be accessed");
// }
byte[] labDatos = "perico de
los palotes".getBytes();
FirmaMSBridge loBrige = new
FirmaMSBridge();
loBrige.setBinaryCertificate(moX509.getSignature());
loBrige.setToSign(labDatos);
loBrige.engineSetParameter(
ParametrosFirma.getInstance(
moX509.getSerialNumber(),
moX509.getIssuerDN().toString()));
byte[] labFirma =
loBrige.engineSign();
System.out.println();
System.out.println(new
String(labFirma));
System.out.println();
BASE64Encoder base64Encoder
= new BASE64Encoder();
String lsFirmaBase64 =
base64Encoder.encode(labFirma);
System.out.println();
System.out.println(lsFirmaBase64);
System.out.println();
BASE64Decoder base64Decoder
= new BASE64Decoder();
byte[] b=
base64Decoder.decodeBuffer(lsFirmaBase64);
byte[] datos= labDatos;
//Verification:
System.out.println(" Verificando la firma ...");
Signature rsa_vfy =
Signature.getInstance( "SHA1withRSA");
rsa_vfy.initVerify(moX509.getPublicKey());
rsa_vfy.update(datos);
System.out.println(" La verificación resultó: "
+ rsa_vfy.verify(b) + "!!!\n");
1.2 SunMSCAPI
Conjunto de clases y dll incorporadas en jre 1.6
KeyStore ks = KeyStore.getInstance("Windows-MY");
// Note: When a security manager is installed,
// the following call requires SecurityPermission
// "authProvider.SunMSCAPI".
ks.load(null, null);
byte[] data = ...
String alias = "myRSA";
PrivateKey privKey = (PrivateKey) ks.getKey(alias, null);
Certificate cert = ks.getCertificate(alias);
Provider p = ks.getProvider();
Signature sig = Signature.getInstance("SHA1withRSA", p);
sig.initSign(privKey);
sig.update(data);
byte[] signature = sig.sign();
System.out.println("\tGenerated signature...");
sig.initVerify(cert);
sig.update(data);
if (sig.verify(signature)) {
System.out.println("\tSignature verified!");
}
2. Tomcat
pida a internet explorer cliente un certificado digital
eDNI
- Ir a tomcat_home/conf/server.xml
<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
-->
y dejarla asi
<Connector port="8443" maxHttpHeaderSize="8192" SSLEnabled="true"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
acceptCount="100" scheme="https" secure="true"
enableLookups="false" disableUploadTimeout="true"
clientAuth="true" sslProtocol="TLS"
truststoreFile="/home/eduardo/.truststore" truststorePass="eduardo"
keystoreFile="/home/eduardo/myKeyStore" keystorePass="eduardo"
/>
Los parámetros de configuración del elemento "Connector" que debemos establecer son:
- clientAuth: true-> es el que pedira el
certificado al cliente
- TruststoreFile: el certificado que cumpla la cadena de confianza podra ser seleccionado por el cliente, "pá" enterdernos, en el internet explorer solo aparareceran para seleccionar los certificados que cumplan la cadena de confianza de este archivo
- truststorePass: password del fichero anterior
- keystoreFile: el almacen de nuestro certificado digital en el servidor
- keystorePass:
password
del fichero anterior
- para generar el keystoreFile, en una consola:
El keytool nos pedirá una contraseña: "eduardo". Después nos pedirá una serie de datos para el certificado:
Importante:
en la
pregunta¿Cuáles son su nombre y su apellido? poner la ip o dns de la
pagina web, pq asi en el navegador de internet explorer puedes añadir
el certificado a entidades emisoras raiz de confianza y asi NO te hace
la pregunta de q "no es un certificado de confianza" O usar un
certificado firmado por fnmt o @firma o firma profesional
Volver a escribir la contraseña nueva:
¿Cuáles son su nombre y su apellido?
[Unknown]: 172.16.0.4
¿Cuál es el nombre de su unidad de organización?
[Unknown]: Informatica
¿Cuál es el nombre de su organización?
[Unknown]: informatica
¿Cuál es el nombre de su ciudad o localidad?
[Unknown]: Murcia
¿Cuál es el nombre de su estado o provincia?
[Unknown]: Murcia
¿Cuál es el código de país de dos letras de la unidad?
[Unknown]: es
¿Es correcto CN=Eduardo Gonzalez, OU=Informatica, O=informatica, L=Murcia, ST=Murcia, C=es?
[no]: y
Generando par de claves RSA de 1.024 bits para certificado autofirmado (SHA1withRSA) con una validez de 90 días
para: CN=Eduardo Gonzalez, OU=Informatica, O=informatica, L=Murcia, ST=Murcia, C=es
Escriba la contraseña clave para <mykey>
(INTRO si es la misma contraseña que la del almacén de claves):
Le damos a INTRO para que utilice la misma que la del almacén.
- para generar truststoreFile
keytool -import -keystore /home/eduardo/.truststore -file FNMTClase2CA.cer
- Import the Chain Certificate into you
keystore




keytool -import -alias root -keystore <your_keystore_filename> \
-trustcacerts -file <filename_of_the_chain_certificate>



- And finally import your new Certificate




keytool -import -alias tomcat -keystore <your_keystore_filename> \
-trustcacerts -file <your_certificate_filename>
- Prueba de que va todo bien:en internet explorer poner https://localhost:8443 y debe pedir el certificado digital eDNI
- Configurar una aplicacion para forzar las comunicaciones como https
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>*.ctrl</url-pattern>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
esto es todas las paginas con .ctrl o .jsp se pedira propotoco seguro y el certificado digital eDNI
otro ejemplo
<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
Todas las llamadas q esten en el directorio /secure de la aplicacion
- para obtener los datos del certificado del cliente en un servlet del servidor:
X509Certificate[] certs;
certs = (X509Certificate[])
request.getAttribute("javax.servlet.request.X509Certificate");
if (certs != null) {
clientCert = certs[0];
}
3. Acceso HTTPS con eDNI (DNI electrónico)
Para acceder a una página web mediante protocolo
https con eDNI ver paquetesGUIxSeguridad