1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
46
47
48
49
50
51
52 public class CertificadoEmpleadoPublico extends CertificadoPersona implements CertificadoEmpleado {
53
54
55
56
57 static Logger logger = Logger.getLogger(CertificadoEmpleadoPublico.class);
58
59
60
61
62 public static final String POLICY_IN_PKCS11_DEVICE = "1.3.6.1.4.1.8149.3.13";
63
64
65
66
67 public static final String POLICY_IN_SOFTWARE_DEVICE = "1.3.6.1.4.1.8149.3.18";
68
69
70
71
72 public static final String POLICY_IN_CLOUD = "1.3.6.1.4.1.8149.3.24";
73
74
75
76
77 public static final String OID_SAN_VERSION_1 = "1.3.6.1.4.1.99999.1.4.4.4";
78
79
80
81
82 public static final String OID_SAN_VERSION_2 = "1.3.6.1.4.1.14862.1.4.4.2";
83
84
85
86
87 public static final String OID_SAN_VERSION_3 = "2.16.724.1.3.5.3.2";
88
89
90
91
92 public static final String OID_SAN_VERSION_4 = "2.16.724.1.3.5.7.2";
93
94
95
96
97 public static final String SUFIJO_OID_SAN_CARGO = "11";
98
99
100
101
102 public static final String SUFIJO_OID_SAN_CIF_ENTIDAD = "3";
103
104
105
106
107 public static final String SUFIJO_OID_SAN_NOMBRE_ENTIDAD = "2";
108
109
110
111
112 public static final String SUFIJO_OID_SAN_UNIDAD = "10";
113
114
115
116
117 public static final String SUFIJO_OID_SAN_NRP = "5";
118
119
120
121
122 public static final String ALIAS_PKCS11 = "EPN1";
123
124
125
126
127 private static HashSet setExplotationCACertificates = new HashSet();
128
129
130
131
132 private static HashSet setTestCACertificates = new HashSet();
133
134
135
136
137
138
139
140
141
142
143
144 public CertificadoEmpleadoPublico(X509Certificate certificate) throws CertificateCANotFoundException, NormalizeCertificateException {
145 super(certificate, getCAList());
146 }
147
148
149
150
151
152
153
154
155
156
157
158
159 public CertificadoEmpleadoPublico(File fileCertificate) throws CertificateCANotFoundException, NormalizeCertificateException, FileNotFoundException {
160 super(fileCertificate, getCAList());
161 }
162
163
164
165
166
167
168
169
170
171
172
173 public CertificadoEmpleadoPublico(InputStream isCertificate) throws CertificateCANotFoundException, NormalizeCertificateException {
174 super(isCertificate, getCAList());
175 }
176
177
178
179
180
181
182
183
184
185
186
187 public CertificadoEmpleadoPublico(byte[] contenidoCertificado) throws CertificateCANotFoundException, NormalizeCertificateException {
188 super(contenidoCertificado, getCAList());
189 }
190
191
192
193
194
195
196
197
198 public boolean isTestCertificate () {
199 logger.debug("[CertificadoEmpleadoPublico.isTestCertificate]::Entrada");
200 return setTestCACertificates.contains(getIssuerKeyIdentifier());
201 }
202
203
204
205
206
207
208 public String getName () {
209 return getElementSubject(X509Name.GIVENNAME);
210 }
211
212
213
214
215
216
217 public String getFirstSurname () {
218
219 logger.debug ("[CertificadoEmpleadoPublico.getFirstSurname]::Entrada");
220
221 return getNombreCompleto()[1].trim();
222 }
223
224
225
226
227
228
229 public String getSecondSurname () {
230
231 logger.debug ("[CertificadoEmpleadoPublico.getSecondSurname]::Entrada");
232
233 String[] nombreCompleto = getNombreCompleto();
234
235
236 if (nombreCompleto == null || nombreCompleto.length < 3) {
237 return "";
238 }
239
240 return nombreCompleto[2].trim();
241 }
242
243
244
245
246
247
248 public String getSurnames () {
249
250 logger.debug ("[CertificadoEmpleadoPublico.getSurnames]::Entrada");
251
252 return getFirstSurname() + " " + getSecondSurname();
253 }
254
255
256
257
258
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
271
272
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
287 return (String) ((AlternativeNameElement) altNames.get(0)).getValue();
288 }
289
290
291
292
293
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
320
321
322 public String getNRPPseudonym() {
323 return getNRP();
324 }
325
326
327
328
329
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
356
357
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
383
384
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
410
411
412
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
438
439
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
455
456
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
472
473
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
489
490
491
492 public boolean isCipherCertificate() {
493 return false;
494 }
495
496
497
498
499
500
501 public boolean isSigningCertificate() {
502 return true;
503 }
504
505
506
507
508
509 public static CAList getCAList() throws CertificateCANotFoundException {
510
511
512 List lCACertificates = getCAListExlotation();
513 lCACertificates.addAll(getCAListTest());
514
515 CAList caList;
516 try {
517 caList = new CAList (lCACertificates);
518 } catch (NormalizeCertificateException e) {
519
520
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
528 try {
529 caList.setValidationXML(ArangiUtil.loadFile("file/validation_data_accv_test.xml"));
530 } catch (ValidationXMLException e) {
531
532
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
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
544
545
546
547
548
549
550
551 protected static String[] getBasePolicies () {
552 return new String[] {
553 POLICY_IN_PKCS11_DEVICE,
554 POLICY_IN_SOFTWARE_DEVICE,
555 POLICY_IN_CLOUD
556 };
557 }
558
559
560
561
562
563
564
565 private static List getCAListExlotation() throws CertificateCANotFoundException {
566
567
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
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
591
592
593 private static List getCAListTest() throws CertificateCANotFoundException {
594
595
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
618
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 }