View Javadoc

1   /**
2    * LICENCIA LGPL:
3    * 
4    * Esta librería es Software Libre; Usted puede redistribuirla y/o modificarla
5    * bajo los términos de la GNU Lesser General Public License (LGPL) tal y como 
6    * ha sido publicada por la Free Software Foundation; o bien la versión 2.1 de 
7    * la Licencia, o (a su elección) cualquier versión posterior.
8    * 
9    * Esta librería se distribuye con la esperanza de que sea útil, pero SIN 
10   * NINGUNA GARANTÍA; tampoco las implícitas garantías de MERCANTILIDAD o 
11   * ADECUACIÓN A UN PROPÓSITO PARTICULAR. Consulte la GNU Lesser General Public 
12   * License (LGPL) para más detalles
13   * 
14   * Usted debe recibir una copia de la GNU Lesser General Public License (LGPL) 
15   * junto con esta librería; si no es así, escriba a la Free Software Foundation 
16   * Inc. 51 Franklin Street, 5º Piso, Boston, MA 02110-1301, USA o consulte
17   * <http://www.gnu.org/licenses/>.
18   *
19   * Copyright 2011 Agencia de Tecnología y Certificación Electrónica
20   */
21  package es.accv.arangi.certificate;
22  
23  import java.io.File;
24  import java.io.FileNotFoundException;
25  import java.io.InputStream;
26  import java.security.cert.X509Certificate;
27  import java.util.ArrayList;
28  import java.util.HashSet;
29  import java.util.List;
30  
31  import org.apache.log4j.Logger;
32  import org.bouncycastle.asn1.x509.X509Name;
33  
34  import es.accv.arangi.base.certificate.Certificate;
35  import es.accv.arangi.base.certificate.validation.CAList;
36  import es.accv.arangi.base.exception.certificate.CertificateCANotFoundException;
37  import es.accv.arangi.base.exception.certificate.CertificateFieldException;
38  import es.accv.arangi.base.exception.certificate.NormalizeCertificateException;
39  import es.accv.arangi.base.exception.certificate.ValidationXMLException;
40  import es.accv.arangi.base.util.AlternativeNameElement;
41  import es.accv.arangi.exception.ResourceNotLoadedException;
42  import es.accv.arangi.util.ArangiUtil;
43  
44  /**
45   * Clase para el tratamiento de los certificados reconocidos de empleado público de la ACCV, 
46   * según la política definida en la URL: 
47   * <a href="http://www.accv.es/pdf-politicas/ACCV-CP-13V2.0-c.pdf" target="politica">
48   * http://www.accv.es/pdf-politicas/ACCV-CP-13V2.0-c.pdf</a>
49   * 
50   * @author <a href="mailto:jgutierrez@accv.es">José M Gutiérrez</a>
51   */
52  public class CertificadoEmpleadoPublico extends CertificadoPersona implements CertificadoEmpleado {
53  
54  	/*
55  	 * Logger de la clas
56  	 */
57  	static Logger logger = Logger.getLogger(CertificadoEmpleadoPublico.class);
58  	
59  	/**
60  	 * Base del OID de la política de certificados de ep en dispositivo seguro
61  	 */
62  	public static final String POLICY_IN_PKCS11_DEVICE = "1.3.6.1.4.1.8149.3.13";
63  
64  	/**
65  	 * Base del OID de la política de certificados de ep en dispositivo software
66  	 */
67  	public static final String POLICY_IN_SOFTWARE_DEVICE = "1.3.6.1.4.1.8149.3.18";
68  
69  	/**
70  	 * Base del OID de la política de certificados de pe en la nube
71  	 */
72  	public static final String POLICY_IN_CLOUD = "1.3.6.1.4.1.8149.3.24";
73  	
74  	/**
75  	 * OID base de los campos del SAN para la versión 1 de la política
76  	 */
77  	public static final String OID_SAN_VERSION_1 = "1.3.6.1.4.1.99999.1.4.4.4"; 
78  	
79  	/**
80  	 * OID base de los campos del SAN para la versión 2 de la política
81  	 */
82  	public static final String OID_SAN_VERSION_2 = "1.3.6.1.4.1.14862.1.4.4.2"; 
83  	
84  	/**
85  	 * OID base de los campos del SAN para la versión 3 de la política
86  	 */
87  	public static final String OID_SAN_VERSION_3 = "2.16.724.1.3.5.3.2"; 
88  	
89  	/**
90  	 * OID base de los campos del SAN para la versión 4 de la política
91  	 */
92  	public static final String OID_SAN_VERSION_4 = "2.16.724.1.3.5.7.2"; 
93  	
94  	/**
95  	 * Sufijo del OID del campo con el cargo del empleado público
96  	 */
97  	public static final String SUFIJO_OID_SAN_CARGO	= "11"; 
98  	
99  	/**
100 	 * Sufijo del OID del campo con el CIF de la entidad suscriptora
101 	 */
102 	public static final String SUFIJO_OID_SAN_CIF_ENTIDAD = "3"; 
103 	
104 	/**
105 	 * Sufijo del OID del campo con el nombre de la entidad suscriptora
106 	 */
107 	public static final String SUFIJO_OID_SAN_NOMBRE_ENTIDAD = "2"; 
108 	
109 	/**
110 	 * Sufijo del OID del campo con la unidad del empleado público
111 	 */
112 	public static final String SUFIJO_OID_SAN_UNIDAD = "10"; 
113 	
114 	/**
115 	 * Sufijo del OID del campo con el nrp/nip
116 	 */
117 	public static final String SUFIJO_OID_SAN_NRP = "5"; 
118 	
119 	/**
120 	 * Alias del keystore donde se guarda el certificado
121 	 */
122 	public static final String ALIAS_PKCS11 = "EPN1";
123 
124 	/*
125 	 * Lista de SKI de los certificados de CA de explotación
126 	 */
127 	private static HashSet setExplotationCACertificates = new HashSet();
128 	
129 	/*
130 	 * Lista de SKI de los certificados de CA de test
131 	 */
132 	private static HashSet setTestCACertificates = new HashSet();
133 	
134 	/**
135 	 * Constructor con un certificado X509Certificate
136 	 * 
137 	 * @param certificate Certificado en formato X.509
138 	 * @throws CertificateCANotFoundException No se ha encontrado alguno de los certificados de
139 	 * las CA que tratan este certificado en el classpath
140 	 * @throws NormalizeCertificateException El certificado no puede ser normalizado al formato
141 	 * 	reconocido por el proveedor criptográfico de Arangi o su firma no es correcta o no
142 	 * 	puede ser analizada
143 	 */
144 	public CertificadoEmpleadoPublico(X509Certificate certificate) throws CertificateCANotFoundException, NormalizeCertificateException {
145 		super(certificate, getCAList());
146 	}
147 	
148 	/**
149 	 * Constructor con un fichero que contiene un certificado
150 	 * 
151 	 * @param fileCertificate Fichero que contiene un certificado en formato X.509
152 	 * @throws CertificateCANotFoundException No se ha encontrado alguno de los certificados de
153 	 * las CA que tratan este certificado en el classpath
154 	 * @throws NormalizeCertificateException El certificado no puede ser normalizado al formato
155 	 * 	reconocido por el proveedor criptográfico de Arangi o su firma no es correcta o no
156 	 * 	puede ser analizada
157 	 * @throws FileNotFoundException El fichero no existe
158 	 */
159 	public CertificadoEmpleadoPublico(File fileCertificate) throws CertificateCANotFoundException, NormalizeCertificateException, FileNotFoundException {
160 		super(fileCertificate, getCAList());
161 	}
162 	
163 	/**
164 	 * Constructor con un fichero que contiene un certificado
165 	 * 
166 	 * @param isCertificate Stream de lectura a un certificado en formato X.509
167 	 * @throws CertificateCANotFoundException No se ha encontrado alguno de los certificados de
168 	 * las CA que tratan este certificado en el classpath
169 	 * @throws NormalizeCertificateException El certificado no puede ser normalizado al formato
170 	 * 	reconocido por el proveedor criptográfico de Arangi o su firma no es correcta o no
171 	 * 	puede ser analizada
172 	 */
173 	public CertificadoEmpleadoPublico(InputStream isCertificate) throws CertificateCANotFoundException, NormalizeCertificateException {
174 		super(isCertificate, getCAList());
175 	}
176 	
177 	/**
178 	 * Constructor con un fichero que contiene un certificado
179 	 * 
180 	 * @param contenidoCertificado Contenido de un certificado en formato X.509
181 	 * @throws CertificateCANotFoundException No se ha encontrado alguno de los certificados de
182 	 * las CA que tratan este certificado en el classpath
183 	 * @throws NormalizeCertificateException El certificado no puede ser normalizado al formato
184 	 * 	reconocido por el proveedor criptográfico de Arangi o su firma no es correcta o no
185 	 * 	puede ser analizada
186 	 */
187 	public CertificadoEmpleadoPublico(byte[] contenidoCertificado) throws CertificateCANotFoundException, NormalizeCertificateException {
188 		super(contenidoCertificado, getCAList());
189 	}
190 	
191 	//-- Métodos públicos
192 	
193 	/**
194 	 * Comprueba si el certificado es de una CA de test
195 	 * 
196 	 * @return Cierto si el certificado es de una CA de test
197 	 */
198 	public boolean isTestCertificate () {
199 		logger.debug("[CertificadoEmpleadoPublico.isTestCertificate]::Entrada");
200 		return setTestCACertificates.contains(getIssuerKeyIdentifier());
201 	}
202 	
203 	/**
204 	 * Método que devuelve el nombre del titular del certificado
205 	 * 
206 	 * @return Nombre del titular del certificado
207 	 */
208 	public String getName () {
209 		return getElementSubject(X509Name.GIVENNAME);
210 	}
211 	
212 	/**
213 	 * Método que devuelve el primer apellido del titular del certificado
214 	 * 
215 	 * @return Primer apellido del titular del certificado
216 	 */
217 	public String getFirstSurname () {
218 		
219 		logger.debug ("[CertificadoEmpleadoPublico.getFirstSurname]::Entrada");
220 		
221 		return getNombreCompleto()[1].trim();
222 	}
223 	
224 	/**
225 	 * Método que devuelve el segundo apellido del titular del certificado
226 	 * 
227 	 * @return Segundo apellido del titular del certificado
228 	 */
229 	public String getSecondSurname () {
230 		
231 		logger.debug ("[CertificadoEmpleadoPublico.getSecondSurname]::Entrada");
232 		
233 		String[] nombreCompleto = getNombreCompleto();
234 		
235 		//-- El segundo apellido no es obligatorio
236 		if (nombreCompleto == null || nombreCompleto.length < 3) {
237 			return "";
238 		}
239 		
240 		return nombreCompleto[2].trim();
241 	}
242 	
243 	/**
244 	 * Método que devuelve los apellidos del titular del certificado
245 	 * 
246 	 * @return Apellidos del titular del certificado
247 	 */
248 	public String getSurnames () {
249 		
250 		logger.debug ("[CertificadoEmpleadoPublico.getSurnames]::Entrada");
251 		
252 		return getFirstSurname() + " " + getSecondSurname();
253 	}
254 	
255 	/**
256 	 * Método que devuelve el NIF del titular del certificado
257 	 * 
258 	 * @return NIF del titular del certificado
259 	 */
260 	public String getNIF () {
261 		try {
262 			return getSubjectAlternativeNameElement(OID_USERID);
263 		} catch (CertificateFieldException e) {
264 			logger.info ("[CertificadoEmpleadoPublico.getNIF]::No se puede obtener el NIF", e);
265 			return null;
266 		}
267 	}
268 	
269 	/**
270 	 * Método que devuelve la dirección de correo electrónico del titular del certificado
271 	 * 
272 	 * @return E-mail del titular del certificado
273 	 */
274 	public String getEmail () {
275 		
276 		logger.debug ("[CertificadoEmpleadoPublico.getEmail]::Entrada");
277 		
278 		List altNames;
279 		try {
280 			altNames = getSubjectAlternativeName();
281 		} catch (CertificateFieldException e) {
282 			logger.info ("[CertificadoEmpleadoPublico.getEmail]::No ha sido posible obtener el e-mail del empleado público", e);
283 			return null;
284 		}
285 	
286 		//-- Es el primer elemento del nombre alternativo
287 		return (String) ((AlternativeNameElement) altNames.get(0)).getValue();
288 	}
289 	
290 	/**
291 	 * Método que obtiene el cargo del Empleado Público.
292 	 * 
293 	 * @return Cargo del Empleado Público
294 	 */
295 	public String getPosition() {
296 		
297 		logger.debug ("[CertificadoEmpleadoPublico.getCargo]::Entrada");
298 		
299 		try {
300 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_CARGO) != null) {
301 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_CARGO);
302 			} 
303 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_CARGO) != null) {
304 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_CARGO);
305 			} 
306 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_CARGO) != null) {
307 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_CARGO);
308 			} 
309 
310 			return getSubjectAlternativeNameElement(OID_SAN_VERSION_1 + "." + SUFIJO_OID_SAN_CARGO);
311 			 
312 		} catch (CertificateFieldException e) {
313 			logger.info ("[CertificadoEmpleadoPublico.getCargo]::No se puede obtener el cargo del empleado público", e);
314 			return null;
315 		}
316 	}
317 	
318 	/**
319 	 * Método que obtiene el valor diferenciador para este tipo
320 	 * de certificados
321 	 */
322 	public String getNRPPseudonym() {
323 		return getNRP();
324 	}
325 	
326 	/**
327 	 * Método que obtiene el NRP/NIP del Empleado Público.
328 	 * 
329 	 * @return NRP/NIP del Empleado Público
330 	 */
331 	public String getNRP() {
332 		
333 		logger.debug ("[CertificadoEmpleadoPublico.getNRP]::Entrada");
334 		
335 		try {
336 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_NRP) != null) {
337 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_NRP);
338 			} 
339 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_NRP) != null) {
340 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_NRP);
341 			} 
342 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_NRP) != null) {
343 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_NRP);
344 			} 
345 
346 			return getSubjectAlternativeNameElement(OID_SAN_VERSION_1 + "." + SUFIJO_OID_SAN_NRP);
347 			 
348 		} catch (CertificateFieldException e) {
349 			logger.info ("[CertificadoEmpleadoPublico.getNRP]::No se puede obtener el nrp/nip del empleado público", e);
350 			return null;
351 		}
352 	}
353 	
354 	/**
355 	 * Método que obtiene el CIF de la entidad suscriptora del certificado.
356 	 * 
357 	 * @return CIF de la entidad suscriptora del certificado
358 	 */
359 	public String getEntityCIF() {
360 		
361 		logger.debug ("[CertificadoEmpleadoPublico.getCIFEntidad]::Entrada");
362 		
363 		try {
364 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD) != null) {
365 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD);
366 			} 
367 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD) != null) {
368 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD);
369 			} 
370 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD) != null) {
371 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD);
372 			} 
373 
374 			return getSubjectAlternativeNameElement(OID_SAN_VERSION_1 + "." + SUFIJO_OID_SAN_CIF_ENTIDAD);
375 		} catch (CertificateFieldException e) {
376 			logger.info ("[CertificadoEmpleadoPublico.getCargo]::No se puede obtener el nombre de la entidad suscriptora", e);
377 			return null;
378 		}
379 	}
380 	
381 	/**
382 	 * Método que obtiene el nombre de la entidad suscriptora del certificado.
383 	 * 
384 	 * @return Nombre de la entidad suscriptora del certificado
385 	 */
386 	public String getEntityName() {
387 		
388 		logger.debug ("[CertificadoEmpleadoPublico.getNombreEntidad]::Entrada");
389 		
390 		try {
391 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD) != null) {
392 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD);
393 			} 
394 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD) != null) {
395 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD);
396 			} 
397 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD) != null) {
398 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD);
399 			} 
400 
401 			return getSubjectAlternativeNameElement(OID_SAN_VERSION_1 + "." + SUFIJO_OID_SAN_NOMBRE_ENTIDAD);
402 		} catch (CertificateFieldException e) {
403 			logger.info ("[CertificadoEmpleadoPublico.getCargo]::No se puede obtener el nombre de la entidad suscriptora", e);
404 			return null;
405 		}
406 	}
407 	
408 	/**
409 	 * Devuelve la Unidad, dentro de la Administración, en la que está incluida el suscriptor
410 	 * del certificado.
411 	 * 
412 	 * @return Organization Unit del titular del certificado.
413 	 */
414 	public String getOrganizationalUnit() {
415 		
416 		logger.debug ("[CertificadoEmpleadoPublico.getOrganizationalUnit]::Entrada");
417 
418 	    try {
419 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_UNIDAD) != null) {
420 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_4 + "." + SUFIJO_OID_SAN_UNIDAD);
421 			} 
422 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_UNIDAD) != null) {
423 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_3 + "." + SUFIJO_OID_SAN_UNIDAD);
424 			} 
425 			if (getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_UNIDAD) != null) {
426 				return getSubjectAlternativeNameElement(OID_SAN_VERSION_2 + "." + SUFIJO_OID_SAN_UNIDAD);
427 			} 
428 
429 			return getSubjectAlternativeNameElement(OID_SAN_VERSION_1 + "." + SUFIJO_OID_SAN_UNIDAD);
430 		} catch (CertificateFieldException e) {
431 			logger.info ("[CertificadoEmpleadoPublico.getCargo]::No se puede obtener la unidad del empleado público", e);
432 			return null;
433 		}
434 	}
435 	
436 	/**
437 	 * El certificado se encuentra en un dispositivo PKCS#11
438 	 * 
439 	 * @return Cierto si el certificado se encuentra en un dispositivo PKCS#11
440 	 */
441 	public boolean isInPkcs11Device () {
442 		logger.debug ("[CertificadoEmpleadoPublico.isInPkcs11Device]::Entrada");
443 		
444 		for (String policyOID : getPolicyOIDs()) {
445 			if (policyOID.startsWith(POLICY_IN_PKCS11_DEVICE)) {
446 				return true;
447 			}
448 		}
449 		
450 		return false;
451 	}
452 	
453 	/**
454 	 * El certificado se encuentra en un dispositivo software (PKCS#12)
455 	 * 
456 	 * @return Cierto si el certificado se encuentra en un dispositivo software (PKCS#12)
457 	 */
458 	public boolean isInSoftwareDevice () {
459 		logger.debug ("[CertificadoEmpleadoPublico.isInSoftwareDevice]::Entrada");
460 		
461 		for (String policyOID : getPolicyOIDs()) {
462 			if (policyOID.startsWith(POLICY_IN_SOFTWARE_DEVICE)) {
463 				return true;
464 			}
465 		}
466 		
467 		return false;
468 	}
469 	
470 	/**
471 	 * El certificado se encuentra en la nube
472 	 * 
473 	 * @return Cierto si el certificado se encuentra en la nube
474 	 */
475 	public boolean isInCloud () {
476 		logger.debug ("[CertificadoEmpleadoPublico.isInCloud]::Entrada");
477 		
478 		for (String policyOID : getPolicyOIDs()) {
479 			if (policyOID.startsWith(POLICY_IN_CLOUD)) {
480 				return true;
481 			}
482 		}
483 		
484 		return false;
485 	}
486 	
487 	/**
488 	 * Método que indica si el certificado es válido para el cifrado de datos: NO
489 	 * 
490 	 * @return Cierto si el certificado es válido para el cifrado de datos
491 	 */
492 	public boolean isCipherCertificate() {
493 		return false;
494 	}
495 
496 	/**
497 	 * Método que indica si el certificado es válido para la firma digital:SI
498 	 * 
499 	 * @return Cierto si el certificado es válido para la firma digital
500 	 */
501 	public boolean isSigningCertificate() {
502 		return true;
503 	}
504 	
505 	/**
506 	 * Obtiene la lista de certificados de CA y raíz que conforman las posibles cadenas
507 	 * de confianza de los certificados de esta clase. 
508 	 */
509 	public static CAList getCAList() throws CertificateCANotFoundException {
510 		
511 		//-- Añadir los certificados de test y de explotación
512 		List lCACertificates = getCAListExlotation();
513 		lCACertificates.addAll(getCAListTest());
514 		
515 		CAList caList;
516 		try {
517 			caList = new CAList (lCACertificates);
518 		} catch (NormalizeCertificateException e) {
519 			//-- Si algún certificado no puede ser normalizado lo pasamos como que no
520 			//-- se ha podido cargar
521 			logger.info ("[CertificadoEmpleadoPublico.getCAList]::Alguno de los certificados de las CA no ha podido ser " +
522 					"normalizado a lo esperado por el proveedor criptográfico de Arangi", e);
523 			throw new CertificateCANotFoundException ("Alguno de los certificados de las CA no ha podido ser " +
524 					"normalizado a lo esperado por el proveedor criptográfico de Arangi", e);
525 		};
526 		
527 		//-- Añadir el fichero para validar los certificados de test
528 		try {
529 			caList.setValidationXML(ArangiUtil.loadFile("file/validation_data_accv_test.xml"));
530 		} catch (ValidationXMLException e) {
531 			//-- Si no se ha podido parsear el fichero de validación lo pasamos como que
532 			//-- no se han podido cargar los certificados de las CA
533 			logger.info ("[CertificadoEmpleadoPublico.getCAList]::No ha sido posible parsear el fichero de validación XML", e);
534 			throw new CertificateCANotFoundException ("No ha sido posible parsear el fichero de validación XML", e);
535 		} catch (ResourceNotLoadedException e) {
536 			//-- Si no se encuentra pasaremos sin él, sólo que no funcionarán los certificados de test
537 			logger.info ("[CertificadoEmpleadoPublico.getCAList]::No ha sido posible obtener el fichero de validación XML", e);
538 		}
539 		
540 		return caList;
541 	}
542 
543 	//-- Métodos protected
544 	
545 	/**
546 	 * Usado por la clase CertificateFactory para dar de alta la clase en la lista
547 	 * de tipos de certificados.
548 	 * 
549 	 * @return OID base de la política
550 	 */
551 	protected static String[] getBasePolicies () {
552 		return new String[] { 
553 				POLICY_IN_PKCS11_DEVICE, // certificados en tarjeta
554 				POLICY_IN_SOFTWARE_DEVICE, // certificados en software
555 				POLICY_IN_CLOUD // certificados en la nube 
556 		};
557 	}
558 
559 	//-- Métodos privados
560 	
561 	/*
562 	 * Obtiene la lista de certificados de CA y raíz que conforman las posibles cadenas
563 	 * de confianza de los certificados de explotación de esta clase. 
564 	 */
565 	private static List getCAListExlotation() throws CertificateCANotFoundException {
566 		
567 		//-- Añadir los certificados de explotación
568 		List lCACertificates = new ArrayList ();
569 		X509Certificate certificate = ArangiUtil.loadCertificate("certificate/ACCV-CA2");
570 		setExplotationCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
571 		lCACertificates.add(certificate);
572 		
573 		certificate = ArangiUtil.loadCertificate("certificate/ROOT_CA");
574 		setExplotationCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
575 		lCACertificates.add(certificate);
576 		
577 		//-- Nueva CA
578 		certificate = ArangiUtil.loadCertificate("certificate/ACCV-CA120-SHA256");
579 		setExplotationCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
580 		lCACertificates.add(certificate);
581 		
582 		certificate = ArangiUtil.loadCertificate("certificate/ACCVRAIZ1");
583 		setExplotationCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
584 		lCACertificates.add(certificate);
585 		
586 		return lCACertificates;
587 	}
588 	
589 	/*
590 	 * Obtiene la lista de certificados de CA y raíz que conforman las posibles cadenas
591 	 * de confianza de los certificados de test de esta clase. 
592 	 */
593 	private static List getCAListTest() throws CertificateCANotFoundException {
594 		
595 		//-- Añadir los certificados de test y de explotación
596 		List lCACertificates = new ArrayList ();
597 		X509Certificate certificate = ArangiUtil.loadCertificate("certificate/TEST_SUBCA_WINDOWS3");
598 		setTestCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
599 		lCACertificates.add(certificate);
600 		
601 		certificate = ArangiUtil.loadCertificate("certificate/TEST_ROOT_EJBCA");
602 		setTestCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
603 		lCACertificates.add(certificate);
604 		
605 		certificate = ArangiUtil.loadCertificate("certificate/ACCVCATEST120");
606 		setTestCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
607 		lCACertificates.add(certificate);
608 		
609 		certificate = ArangiUtil.loadCertificate("certificate/ROOTEJB4TEST");
610 		setTestCACertificates.add(Certificate.getSubjectKeyIdentifier(certificate));
611 		lCACertificates.add(certificate);
612 		
613 		return lCACertificates;
614 	}
615 
616 	/*
617 	 * Obtiene el nombre completo que hay en la extensión Subject Alternative Name como
618 	 * entrada del LDAP. El array tendrá 3 elementos: nombre, apellido 1 y apellido 2
619 	 */
620 	private String [] getNombreCompleto () {
621 		
622 		String nombreCompleto;
623 		try {
624 			nombreCompleto = getSubjectAlternativeNameElement(OID_ID_AT_COMMONNAME);
625 		} catch (CertificateFieldException e) {
626 			logger.info ("[CertificadoEmpleadoPublico.getNombreCompleto]::No ha sido posible obtener el nombre completo del ciudadano");
627 			return null;
628 		}
629 		if (nombreCompleto == null || nombreCompleto.length() == 0) {
630 			logger.info ("[CertificadoEmpleadoPublico.getNombreCompleto]::No ha sido posible obtener el nombre completo del ciudadano");
631 			return null;
632 		}
633 		return nombreCompleto.split("\\|");
634 
635 	}
636 
637 	
638 	
639 
640 }