java - 获取证书父级的 url (JAVA)

标签 java android certificate

我有一个叶证书。使用 openssl 我看到字段:

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

如何使用 JAVA 获取父 URL

我正在使用 bouncyCaSTLe 和标准的 android libs。我尝试了 x509Certificate.getAlternativeNames 等...

我需要在线获取所有家长证书并验证它们。

最佳答案

我终于找到了解决办法! 如果有人陷入这样的麻烦,这将是有用的。 此代码打印权限信息访问扩展。

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}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)",
                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();
          };
    }
}

关于java - 获取证书父级的 url (JAVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35220563/

相关文章:

java - 对象池概念在android中的实现

Java Double获取点/逗号后的所有数字

android - 获取 fragment 动态附加到 <FrameLayout>?

ios - 客户端向我发送了分发证书和登录用户名密码到开发门户,但没有私钥

iphone - 我可以对开发和分发配置文件使用相同的 .pem 文件吗

使用 iText 的 Java PDF 数字签名可见,但不可打印

java - 在 Java 中重写 toString() 的简单方法

java - FileChannel 不写任何东西

android - 显示软键盘时背景布局移动 - android

android - HTTPURLConnection - 使用 FixedLengthStreamingMode 发布带有大文件的多部分/表单数据