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.base.certificate.validation;
22
23 import java.io.File;
24 import java.io.FileNotFoundException;
25 import java.io.InputStream;
26 import java.net.URL;
27 import java.security.cert.X509Certificate;
28 import java.util.ArrayList;
29 import java.util.Arrays;
30 import java.util.Date;
31 import java.util.Iterator;
32 import java.util.List;
33 import java.util.StringTokenizer;
34
35 import org.apache.log4j.Logger;
36
37 import es.accv.arangi.base.certificate.Certificate;
38 import es.accv.arangi.base.exception.certificate.CertificateCANotFoundException;
39 import es.accv.arangi.base.exception.certificate.CertificateFieldException;
40 import es.accv.arangi.base.exception.certificate.InvalidCRLException;
41 import es.accv.arangi.base.exception.certificate.NormalizeCertificateException;
42 import es.accv.arangi.base.util.validation.ValidationResult;
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 public class ValidateCertificate extends Certificate {
102
103
104
105
106 private static Logger logger = Logger.getLogger(ValidateCertificate.class);
107
108
109
110
111 private X509Certificate issuerCertificate;
112
113
114
115
116 CAList caList;
117
118
119
120
121 ValidationXML validationXML;
122
123
124
125
126 ValidatingTrace trace = new ValidatingTrace();
127
128
129
130
131 OCSPClient ocsp;
132
133
134
135
136 CRL crl;
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 public ValidateCertificate(X509Certificate certificate, CAList caList) throws CertificateCANotFoundException, NormalizeCertificateException{
152 super (certificate);
153 initialize (caList, null, null, null);
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167
168 public ValidateCertificate(File fileCertificate, CAList caList) throws CertificateCANotFoundException, NormalizeCertificateException, FileNotFoundException{
169 super (fileCertificate);
170 initialize (caList, null, null, null);
171 }
172
173
174
175
176
177
178
179
180
181
182
183
184 public ValidateCertificate(InputStream is, CAList caList) throws CertificateCANotFoundException, NormalizeCertificateException{
185 super (is);
186 initialize (caList, null, null, null);
187 }
188
189
190
191
192
193
194
195
196
197
198
199
200 public ValidateCertificate(byte[] contenidoCertificado, CAList caList) throws CertificateCANotFoundException, NormalizeCertificateException{
201 super (contenidoCertificado);
202 initialize (caList, null, null, null);
203 }
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218 public ValidateCertificate(X509Certificate certificate, CAList caList, ValidatingTrace trace) throws CertificateCANotFoundException, NormalizeCertificateException{
219 super (certificate);
220 initialize (caList, null, null, trace);
221
222 }
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240 public ValidateCertificate(X509Certificate certificate, CAList caList, OCSPClient ocsp, CRL crl) throws CertificateCANotFoundException, NormalizeCertificateException{
241 super (certificate);
242 initialize (caList, ocsp, crl, null);
243 }
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262 public ValidateCertificate(X509Certificate certificate, CAList caList, OCSPClient ocsp, CRL crl, ValidatingTrace trace) throws CertificateCANotFoundException, NormalizeCertificateException{
263 super(certificate);
264 initialize (caList, ocsp, crl, null);
265 }
266
267
268
269
270
271
272 public CAList getCertificationChainAsCAList () {
273 ValidateCertificate[] arrayCertificates = getCertificationChain();
274 CAList caList = new CAList();
275 for (int i = 0; i < arrayCertificates.length; i++) {
276 caList.addCACertificate(arrayCertificates[i].toX509Certificate());
277 }
278
279 return caList;
280 }
281
282
283
284
285
286
287 public int validate () {
288 this.trace = new ValidatingTrace();
289 return validate (this.trace);
290 }
291
292
293
294
295
296
297
298
299
300 public int validate (Date validationDate) {
301 this.trace = new ValidatingTrace();
302 return validate (validationDate, this.trace);
303 }
304
305
306
307
308
309
310
311
312 public int validate (ValidatingTrace externalTrace) {
313 this.trace = externalTrace;
314 return validate (new Date(), this.trace);
315 }
316
317
318
319
320
321
322
323
324
325
326 public int validate (Date validationDate, ValidatingTrace externalTrace) {
327
328 logger.debug ("[ValidateCertificate.validate] :: Start :: " + Arrays.asList(new Object[] { validationDate, externalTrace }));
329
330
331 this.trace = externalTrace;
332 if (this.trace == null) { this.trace = new ValidatingTrace(); }
333
334
335 try {
336 if (isSelfSigned()) {
337
338 if (certificate.getNotBefore().after(validationDate)) {
339 logger.debug ("[ValidateCertificate.validate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
340 " will not active until " + dateFormat.format(certificate.getNotBefore()) + ".");
341 trace.add(certificate, "Certificate will not active until " + dateFormat.format(certificate.getNotBefore()));
342 return ValidationResult.RESULT_CERTIFICATE_NOT_ACTIVE;
343 }
344 if (certificate.getNotAfter().before(validationDate)) {
345 logger.debug ("[ValidateCertificate.validate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
346 " has expired in " + dateFormat.format(certificate.getNotBefore()) + ".");
347 trace.add(certificate, "Certificate has expired in " + dateFormat.format(certificate.getNotBefore()));
348 return ValidationResult.RESULT_CERTIFICATE_NOT_ACTIVE;
349 }
350
351 logger.debug ("[ValidateCertificate.validate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
352 " is valid and self signed. End of validation process.");
353 trace.add(certificate, "Certificate is self signed, end of chain validation ");
354 return ValidationResult.RESULT_VALID;
355 }
356 } catch (NormalizeCertificateException e1) {
357
358 }
359
360
361 int result = validateCertificate (validationDate);
362 if (result != ValidationResult.RESULT_VALID) {
363
364 logger.debug ("[ValidateCertificate.validate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
365 " is not valid. Result=" + result);
366 return result;
367 }
368
369
370 ValidateCertificate issuer;
371 try {
372 issuer = new ValidateCertificate (this.issuerCertificate, this.caList, this.ocsp, this.crl);
373 } catch (CertificateCANotFoundException e) {
374 logger.debug ("[ValidateCertificate.validate] :: Certificate with issuerDN=" + certificate.getIssuerDN().toString() +
375 " not belong to the list of trusted CAs.");
376 trace.add(certificate, "Certificate issuer is not in the chain validation: " + this.issuerCertificate.getSubjectDN().toString());
377 return ValidationResult.RESULT_CERTIFICATE_NOT_BELONGS_TRUSTED_CAS;
378 } catch (Exception e) {
379 logger.debug ("[ValidateCertificate.validate] :: Error creating Certificate with subject DN=" +
380 certificate.getSubjectDN().toString() + ".", e);
381 trace.add(certificate, "Load issuer certificate (" + this.issuerCertificate.getSubjectDN().toString() +") launch an exception: " + e.getMessage());
382 return ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED ;
383 }
384 result = issuer.validate(validationDate, trace);
385 if (result != ValidationResult.RESULT_VALID) {
386 logger.debug ("[ValidateCertificate.validate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
387 " has a chain validation not valid. Result=" + result);
388 trace.add(certificate, "Validation response" + result + ": " + CertificateValidator.getString (result));
389 return ValidationResult.RESULT_CERTIFICATE_CHAIN_VALIDATION_INVALID;
390 }
391
392
393 logger.debug ("[ValidateCertificate.validate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
394 " and its chain validation are valid.");
395 trace.add(certificate, "Validation response" + result + ": " + CertificateValidator.getString (result));
396 return ValidationResult.RESULT_VALID;
397 }
398
399
400
401
402
403
404 public ValidateCertificate getIssuerCertificate () {
405
406 logger.debug ("[ValidateCertificate.getIssuerCertificate] :: Start");
407
408 try {
409 return new ValidateCertificate (this.issuerCertificate, this.caList, this.ocsp, this.crl);
410 } catch (Exception e) {
411
412
413 logger.info("[ValidateCertificate.getIssuerCertificate]::No se ha podido obtener el emisor del certificado", e);
414 return null;
415 }
416 }
417
418
419
420
421
422
423
424 public List<ValidateCertificate> getCertificationChainAsList () {
425
426 logger.debug ("[ValidateCertificate.getCertificationChainAsList] :: Start");
427
428 List certificateChain = new ArrayList ();
429 ValidateCertificate certificate = this;
430 while (true) {
431 ValidateCertificate issuer = certificate.getIssuerCertificate();
432 if (issuer.equals(certificate)) {
433 break;
434 }
435 certificateChain.add (issuer);
436 certificate = issuer;
437 }
438
439 return certificateChain;
440 }
441
442
443
444
445
446
447
448 public List<ValidateCertificate> getCompleteCertificationChainAsList () {
449
450 logger.debug ("[ValidateCertificate.getCompleteCertificationChain] :: Start");
451
452 List certificateChain = new ArrayList ();
453 ValidateCertificate certificate = this;
454 certificateChain.add(certificate);
455 while (true) {
456 ValidateCertificate issuer = certificate.getIssuerCertificate();
457 if (issuer.equals(certificate)) {
458 break;
459 }
460 certificateChain.add (issuer);
461 certificate = issuer;
462 }
463
464 return certificateChain;
465 }
466
467
468
469
470
471
472
473 public ValidateCertificate[] getCertificationChain () {
474
475 logger.debug ("[ValidateCertificate.getCertificationChain] :: Start");
476
477 return (ValidateCertificate[])getCertificationChainAsList().toArray(new ValidateCertificate[0]);
478 }
479
480
481
482
483
484
485
486 public ValidateCertificate[] getCompleteCertificationChain () {
487
488 logger.debug ("[ValidateCertificate.getCertificationChain] :: Start");
489
490 return (ValidateCertificate[])getCompleteCertificationChainAsList().toArray(new ValidateCertificate[0]);
491 }
492
493
494
495
496
497
498
499 public X509Certificate[] getCompleteCertificationChainAsX509Array () {
500
501 logger.debug ("[ValidateCertificate.getCompleteCertificationChainAsX509Array] :: Start");
502
503 List<ValidateCertificate> lChain = getCompleteCertificationChainAsList();
504 X509Certificate[] arrayCertificates = new X509Certificate[lChain.size()];
505 int i = 0;
506 for (Iterator<ValidateCertificate> iterator = lChain.iterator(); iterator.hasNext();) {
507 ValidateCertificate validateCertificate = iterator.next();
508 arrayCertificates[i] = validateCertificate.toX509Certificate();
509 i++;
510 }
511
512 return arrayCertificates;
513 }
514
515
516
517
518
519
520
521
522 public List<List<ValidateCertificate>> getCertificationChainSeveralIssuers () {
523
524 logger.debug ("[ValidateCertificate.getCertificationChainSeveralIssuers] :: Start");
525
526 List<List<ValidateCertificate>> result = new ArrayList<List<ValidateCertificate>>();
527
528
529 List<ValidateCertificate> l = new ArrayList<ValidateCertificate>();
530 l.add(this);
531 result.add(l);
532
533
534 List<List<X509Certificate>> chain = caList.getCertificatesChain(this.certificate);
535 for(List<X509Certificate> lista : chain) {
536 l = new ArrayList<ValidateCertificate>();
537 for(X509Certificate x509Certificate : lista) {
538 try {
539 l.add(new ValidateCertificate(x509Certificate, caList));
540 } catch (Exception e) {
541
542 logger.info("No se puede pasar a ValidateCertificate \n" + x509Certificate, e);
543 }
544 }
545 result.add(l);
546 }
547 return result;
548 }
549
550
551
552
553
554
555
556
557
558
559
560
561
562 public OCSPClient[] getOCSPClients () {
563
564 logger.debug ("[ValidateCertificate.getOCSPClients]::Entrada");
565
566 List lOCSPClients = new ArrayList ();
567
568
569 if (this.validationXML != null) {
570 String issuerCommonName = getCommonNameOrDN (this.issuerCertificate);
571
572
573 if (this.validationXML.getOCSPList(issuerCommonName) != null &&
574 !this.validationXML.getOCSPList(issuerCommonName).isEmpty()) {
575
576 for (Iterator iterator = this.validationXML.getOCSPList(issuerCommonName).iterator(); iterator
577 .hasNext();) {
578
579 lOCSPClients.add (iterator.next());
580
581 }
582
583
584 if (!lOCSPClients.isEmpty()) {
585 return (OCSPClient[]) lOCSPClients.toArray(new OCSPClient[0]);
586 }
587 }
588 }
589
590
591 return super.getOCSPClients();
592
593 }
594
595
596
597
598
599
600
601
602 public ValidatingTrace getTrace () {
603 return this.trace;
604 }
605
606
607
608
609
610
611
612
613
614 public CRL getCRL() throws CertificateFieldException, InvalidCRLException {
615
616 logger.debug("[ValidateCertificate.getCRL]:: Init");
617
618
619 String crlURLs [] = null;
620 try {
621 crlURLs = getCrlUrls();
622 } catch (CertificateFieldException e) {
623 trace.add(certificate, "Cannot read CRL Distribution Point URL from certificate");
624 throw e;
625 }
626
627 if (crlURLs == null || crlURLs.length == 0) {
628 logger.debug ("[ValidateCertificate.getCRL_URLs] :: CRL Distribution Point URL is not found in certificate");
629 trace.add(certificate, "CRL Distribution Point URL is not found in certificate");
630 throw new CertificateFieldException ("CRL Distribution Point URL is not found in certificate");
631 }
632
633 return getCRL (crlURLs);
634 }
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650 private int validateCertificate (Date validationDate) {
651
652 logger.debug ("[ValidateCertificate.validateCertificate] :: Start :: " + validationDate);
653
654
655 if (certificate.getNotBefore().after(validationDate)) {
656 logger.debug ("[ValidateCertificate.validateCertificate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
657 " will not active until " + dateFormat.format(certificate.getNotBefore()) + ".");
658 trace.add(certificate, "Certificate will not active until " + dateFormat.format(certificate.getNotBefore()));
659 return ValidationResult.RESULT_CERTIFICATE_NOT_ACTIVE;
660 }
661 if (certificate.getNotAfter().before(validationDate)) {
662 logger.debug ("[ValidateCertificate.validateCertificate] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
663 " has expired in " + dateFormat.format(certificate.getNotBefore()) + ".");
664 trace.add(certificate, "Certificate has expired in " + dateFormat.format(certificate.getNotBefore()));
665 return ValidationResult.RESULT_CERTIFICATE_NOT_ACTIVE;
666 }
667
668 int result = ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED;
669
670
671
672
673
674 try {
675 result = validateWithValidationXML (validationDate);
676 }catch (Exception e) {
677 trace.add(certificate, "Error validating with a validation XML");
678 logger.debug ("[ValidateCertificate.validateCertificate] :: Error validating with a validation XML", e);
679 }
680
681 if (result == ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED) {
682
683 try {
684 result = validateWithOCSPInformation (validationDate);
685 }catch (Exception e) {
686 trace.add(certificate, "Error validating with OCSP");
687 logger.debug ("[ValidateCertificate.validateCertificate] :: Error validating with OCSP", e);
688 }
689 }
690
691 if (result == ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED) {
692
693 try {
694 result = validateWithCRLInformation (validationDate);
695 }catch (Exception e) {
696 trace.add(certificate, "Error validating with CRL");
697 logger.debug ("[ValidateCertificate.validateCertificate] :: Error validating with CRL", e);
698 }
699 }
700
701 if (result != ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED) {
702 logger.debug ("[ValidateCertificate.validateCertificate] :: Certificate validated :: result=" + result);
703 return result;
704 }
705
706 logger.debug ("[ValidateCertificate.validateCertificate] :: Cannot validate certificate");
707 trace.add(certificate, "Certificate cannot be validated");
708 return ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED ;
709 }
710
711
712
713
714
715
716
717
718 private int validateWithValidationXML(Date validationDate) {
719
720 logger.debug("[ValidateCertificate.validateWithValidationXML]:: Init :: " + validationDate);
721
722
723 if (this.validationXML != null) {
724 String issuerCommonName = getCommonNameOrDN (this.issuerCertificate);
725
726
727 if (this.validationXML.getOCSPList(issuerCommonName) != null &&
728 !this.validationXML.getOCSPList(issuerCommonName).isEmpty()) {
729
730 for (Iterator iterator = this.validationXML.getOCSPList(issuerCommonName).iterator(); iterator
731 .hasNext();) {
732
733 OCSPClient ocsp = (OCSPClient) iterator.next();
734 logger.debug ("[ValidateCertificate.validateWithValidationXML] :: validating in OCSP " + ocsp.getURL());
735 try {
736 int result = ocsp.validate(this, getIssuerCertificate(), validationDate);
737 trace.add(certificate, "OCSP (" + ocsp.getURL() + ") returns response " + result + ": " + CertificateValidator.getString (result));
738 this.ocsp = ocsp;
739 return result;
740 } catch (Exception e) {
741 logger.debug ("[ValidateCertificate.validateWithValidationXML] :: Cannot validate certificate in OCSP " + ocsp.getURL(), e);
742 trace.add(certificate, "OCSP (" + ocsp.getURL() + ") launch an exception: " + e.getMessage());
743 }
744 }
745
746 }
747
748
749 if (this.validationXML.getCRLList(issuerCommonName) != null &&
750 !this.validationXML.getCRLList(issuerCommonName).isEmpty()) {
751
752 try {
753 CRL crl = getCRL((String[]) this.validationXML.getCRLList(issuerCommonName).toArray(new String [0]));
754
755 int result = validateInCRL (crl, validationDate);
756 trace.add(certificate, "CRL returns response " + result + ": " + CertificateValidator.getString (result));
757 this.crl = crl;
758 return result;
759 } catch (Exception e) {
760 logger.debug ("[ValidateCertificate.validateWithCRLInformation] :: Cannot validate certificate in CRL", e);
761 trace.add(certificate, "Manage CRL throws an exception: " + e.getMessage());
762 }
763
764 }
765
766 }
767
768 return ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED;
769 }
770
771
772
773
774
775
776
777
778
779 private int validateWithOCSPInformation(Date validationDate) {
780
781 logger.debug("[ValidateCertificate.validateWithOCSPInformation]:: Init :: " + validationDate);
782
783
784 String urlsOCSP [] = null;
785 try {
786 urlsOCSP = getOcspUrls();
787 } catch (Exception e) {
788 trace.add(certificate, "Cannot read OCSP URL from certificate");
789 }
790
791
792 if ((urlsOCSP == null || urlsOCSP.length == 0) && this.ocsp != null) {
793 trace.add(certificate, "Using OCSP from child certificate: " + ocsp.getURL());
794 try {
795 int result = this.ocsp.validate(this, getIssuerCertificate(), validationDate);
796 trace.add(certificate, "OCSP (" + ocsp.getURL() + ") returns response " + result + ": " + CertificateValidator.getString (result));
797
798
799 if (result != ValidationResult.RESULT_CERTIFICATE_UNKNOWN) {
800 logger.debug ("[ValidateCertificate.validateWithOCSPInformation] :: Certificate with subject DN=" + certificate.getSubjectDN().toString() +
801 " has a result in OCSP " + this.ocsp.getURL() + " = " + result);
802 return result;
803 }
804 } catch (Exception e) {
805 logger.debug ("[ValidateCertificate.validateWithOCSPInformation] :: Cannot validate certificate in OCSP " + this.ocsp.getURL(), e);
806 trace.add(certificate, "OCSP (" + ocsp.getURL() + ") launch an exception: " + e.getMessage());
807 }
808 } else {
809
810 if (urlsOCSP != null) {
811 for (int i=0;i<urlsOCSP.length;i++) {
812 try {
813 OCSPClient ocsp = new OCSPClient (new URL (urlsOCSP[i]));
814 int result = ocsp.validate(this, getIssuerCertificate(), validationDate);
815 trace.add(certificate, "OCSP (" + ocsp.getURL() + ") returns response " + result + ": " + CertificateValidator.getString (result));
816 this.ocsp = ocsp;
817 return result;
818 } catch (Exception e) {
819 logger.debug ("[ValidateCertificate.validateWithOCSPInformation] :: Cannot validate certificate in OCSP " + urlsOCSP[i], e);
820 trace.add(certificate, "OCSP (" + urlsOCSP[i] + ") launch an exception: " + e.getMessage());
821 }
822 }
823 }
824 }
825
826 return ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED;
827 }
828
829
830
831
832
833
834
835
836
837 private int validateWithCRLInformation(Date validationDate) {
838
839 logger.debug("[ValidateCertificate.validateWithCRLInformation]:: Init :: " + validationDate);
840
841
842 CRL crl = null;
843 try {
844 crl = getCRL();
845 } catch (Exception e) {
846 logger.debug ("[ValidateCertificate.validateWithCRLInformation] :: cannot obtain a CRL");
847 }
848
849
850 if (crl == null && this.crl != null) {
851 trace.add(certificate, "Using CRL from child certificate");
852 crl = this.crl;
853 }
854
855
856 if (crl != null) {
857 try {
858 int result = validateInCRL (crl, validationDate);
859 trace.add(certificate, "CRL returns response " + result + ": " + CertificateValidator.getString (result));
860 this.crl = crl;
861 return result;
862 } catch (Exception e) {
863 logger.debug ("[ValidateCertificate.validateWithCRLInformation] :: Cannot validate certificate in CRL", e);
864 trace.add(certificate, "Manage CRL throws an exception: " + e.getMessage());
865 }
866 }
867
868 return ValidationResult.RESULT_CERTIFICATE_CANNOT_BE_VALIDATED;
869 }
870
871
872
873
874
875
876
877
878 private int validateInCRL (CRL crl, Date validationDate) throws Exception {
879
880 logger.debug("[ValidateCertificate.validateInCRL]:: Init :: " + Arrays.asList(new Object [] { crl, validationDate }));
881
882
883 if (crl == null) {
884 logger.debug("[ValidateCertificate.validateInCRL] :: CRL is a null value");
885 throw new Exception ("CRL is a null value");
886 }
887
888
889 Date revocationDate = crl.getRevocationDate(this);
890 if (revocationDate != null && (revocationDate.before(validationDate) || revocationDate.equals(validationDate))) {
891 return ValidationResult.RESULT_CERTIFICATE_REVOKED;
892 } else {
893 return ValidationResult.RESULT_VALID;
894 }
895 }
896
897
898
899
900
901
902
903
904 private CRL getCRL(String[] crlURLs) throws InvalidCRLException {
905
906 logger.debug("[ValidateCertificate.getCRL]:: Init :: " + crlURLs);
907
908 if (crlURLs != null) {
909 for (int i=0;i<crlURLs.length;i++) {
910 try {
911 trace.add(certificate, "Get CRL from " + crlURLs[i]);
912 logger.debug("[ValidateCertificate.getCRL]:: Get CRL from " + crlURLs[i]);
913
914 return new CRL (new URL (crlURLs[i]), this.caList);
915
916 } catch (Exception e) {
917 logger.debug("[ValidateCertificate.getCRL]:: Error getting CRL from " + crlURLs [i]);
918 trace.add(certificate, "Get CRL (" + crlURLs[i] + ") launch an exception: ");
919 }
920 }
921
922
923 logger.debug ("[ValidateCertificate.getCRL_URLs] :: Cannot get the CRL from any URL in the certificate");
924 trace.add(certificate, "Cannot get any " + crl);
925 throw new InvalidCRLException ("Cannot get the CRL from any URL in the certificate");
926 }
927
928
929 logger.debug ("[ValidateCertificate.getCRL_URLs] :: Cannot get the CRL's URL in the certificate");
930 trace.add(certificate, "Cannot get the CRL's URL in the certificate");
931 throw new InvalidCRLException ("Cannot get the CRL's URL in the certificate");
932 }
933
934
935
936
937
938 private void initialize (CAList caList, OCSPClient ocsp, CRL crl, ValidatingTrace trace) throws CertificateCANotFoundException, NormalizeCertificateException{
939
940 if (caList == null) {
941 logger.info ("[ValidateCertificate.initialize] :: La lista de CAs es nula");
942 caList = new CAList ();
943 }
944
945
946 this.caList = caList;
947 this.validationXML = caList.getValidationXML();
948 this.ocsp = ocsp;
949 this.crl = crl;
950 if (trace != null) {
951 this.trace = trace;
952 }
953
954
955 if (!isSelfSigned()) {
956
957 if (!caList.isOwned(certificate)) {
958
959 logger.info ("[ValidateCertificate.validate] :: Falta alguno de los certificados de la cadena de certificación en la lista de certificados de CA");
960 throw new CertificateCANotFoundException ("Falta alguno de los certificados de la cadena de certificación en la lista de certificados de CA");
961 }
962
963
964 try {
965 new ValidateCertificate (caList.getCACertificate(certificate), caList);
966 } catch (NormalizeCertificateException e) {
967 logger.info ("[ValidateCertificate.validate] :: Alguno de los certificados de la cadena de certificación no ha podido ser normalizado", e);
968 throw new CertificateCANotFoundException ("Alguno de los certificados de la cadena de certificación no ha podido ser normalizado", e);
969 }
970
971
972 this.issuerCertificate = caList.getCACertificate(certificate);
973 } else {
974
975
976 if (!caList.contains(this.certificate)) {
977 logger.info ("[ValidateCertificate.validate] :: El certificado es autofirmado y no pertenece a la lista de CAs permitidas");
978 throw new CertificateCANotFoundException ("El certificado es autofirmado y no pertenece a la lista de CAs permitidas");
979 }
980
981
982 this.issuerCertificate = this.certificate;
983 }
984 }
985
986
987
988
989
990
991
992 private static String getCommonNameOrDN(X509Certificate certificate) {
993
994 String dn = certificate.getSubjectDN().toString();
995 StringTokenizer st = new StringTokenizer (dn, ",");
996 while (st.hasMoreTokens()) {
997 String token = st.nextToken().trim();
998 if (token.startsWith("CN=")) {
999 return token.substring(3);
1000 }
1001 }
1002
1003 return dn;
1004 }
1005
1006
1007
1008 }