2016-02-05 2 views
1

У меня есть leaf certificate. Использование openssl я вижу поля:Получить адрес родителя сертификата (JAVA)

Authority Information Access: 
       CA Issuers - URI:http://pki...parentCert.crt 
       OCSP - URI:http://ocsp...com/ 

Как получить этот родительский URL используя JAVA?

Я использую bouncyCastle и стандартный андроид libs. Я попробовал x509Certificate.getAlternativeNames и т. Д.

Мне нужно получить все родительские сертификаты онлайн и проверить их.

+0

Если я понял ваш вопрос, что вам нужно, это проверить цепочку сертификатов, правильно? –

+0

Да, но у меня нет всей цепи сертификатов. У меня есть только сертификат листа, который содержит ссылку на родителя. – Rainmaker

ответ

1

Я наконец нашел решение! Если кто-то застрял в такой беде, это будет полезно. Этот код печатает расширение доступа к информации о полномочиях.

import sun.security.util.ObjectIdentifier; 
import sun.security.x509.X509CertImpl; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

class readCert{ 

    public boolean isExtAuthorityInfoAccess(Extension ext){ 
     Pattern re = Pattern.compile("\\bcaIssuers\\b",Pattern.CASE_INSENSITIVE); 
     Matcher m = re.matcher(ext.toString()); 
     if (m.find()) { 
      return true; 
     } else { 
      return false; 
     } 
    }; 

    public static List<String> getAuthorityInfoAccesssUrls(String text) 
    { 
     List<String> containedUrls = new ArrayList<String>(); 
     Pattern pattern = Pattern.compile(
       "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" 
         + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" 
         + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*[email protected]!:/{};']*)", 
       Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 
     Matcher urlMatcher = pattern.matcher(text); 
     while (urlMatcher.find()) 
     { 
      containedUrls.add(text.substring(urlMatcher.start(0), 
        urlMatcher.end(0))); 
     } 
     return containedUrls; 
    }; 

    public static void main(String[] args) { 

     readCert rc = new readCert(); 

     try { 
      File file = new File("yourcert.crt"); 
      byte[] encCert = new byte[(int) file.length()]; 
      FileInputStream fis = new FileInputStream(file); 
      fis.read(encCert); 
      fis.close(); 

      InputStream in = new ByteArrayInputStream(encCert); 
      CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
      X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in); 

      X509CertImpl impl = (X509CertImpl)cert; 
      int extnum = 0; 
      if (cert.getNonCriticalExtensionOIDs() != null) { 
       for (String extOID : cert.getNonCriticalExtensionOIDs()) { 
        Extension ext = impl.getExtension(new ObjectIdentifier(extOID)); 
        if (ext != null) { 
         if (rc.isExtAuthorityInfoAccess(ext)) { 
          System.out.println(rc.getAuthorityInfoAccesssUrls(ext.toString())); 
          // System.out.println("#"+(++extnum)+": "+ ext.toString()); 
          // CA ISSUERS ARE HERE 
         } 
        } 
       } 
      } 
     } catch ( Exception e) { 
      e.printStackTrace(); 
      }; 
    } 
} 
+0

«Это будет немного» означает что? – EJP

+0

Этот код дает ссылку на родительский сертификат. – Rainmaker

+0

это полезно) – Rainmaker

Смежные вопросы