【问题标题】:Issue in checking server certificate in checkServerTrusted在 checkServerTrusted 中检查服务器证书时出现问题
【发布时间】:2015-01-28 14:48:14
【问题描述】:

我指的是Validate X.509 certificate against CA in Java这个帖子。

我对@9​​87654323@ 的实现如下:

@Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) throws  CertificateException{
                 InputStream inStream;
                try {
                        inStream = new FileInputStream("E:\\Desktop\\cert\\domain.crt");
                        CertificateFactory cf = CertificateFactory.getInstance("X.509");
                        X509Certificate Mycert = (X509Certificate)cf.generateCertificate(inStream);
                        inStream.close();      

                        if (certs == null || certs.length == 0 || authType == null
                                || authType.length() == 0) {
                            throw new IllegalArgumentException("null or zero-length parameter");
                        }

                         for (X509Certificate cert : certs) {
                             cert.verify(Mycert.getPublicKey());
                         }


                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    throw new CertificateException("error in validating certificate" , e);
                }

            }

文件 domain.crt 在打开网站后从浏览器中导出。证书路径类似于 。

如果我在记事本中打开这个文件,只有一个 BEGIN CERTIFICATEEND CERTIFICATE 是他们的,所以它不是证书链。

如果我调试代码,那么在for loop @ LOC cert.verify(Mycert.getPublicKey()); 在第一个 cert[0] 证书中我得到异常为java.security.SignatureException: Signature does not match.

我哪里做错了?

【问题讨论】:

    标签: java x509certificate


    【解决方案1】:

    尝试根据单个公钥验证链中的所有证书是没有意义的。他们中的大多数都不会被它签名,因此该过程必然会失败,并向调用者抛出异常。

    您需要查看在此方法中您应该执行的操作。请参阅 Javadoc。您正在尝试建立从该链到可信根证书的证书路径。

    在这种情况下,受信任的根证书可能是您从文件中加载的那个。

    因此你应该做的是:

    1. 在链中查找该证书,如果没有找到
    2. 对照此公钥验证链中的最后一个证书,因为它是最高签名者,也是您唯一需要信任的签名者。其余的都受到链中各自继承者的信任,并且它们的继承者都不是这个受信任的根证书,由 (1)。
    3. 如果证书在链中找到,验证之前的证书。即由此证书签名的证书,使用此公钥。

    我不清楚您是否还需要使用下一个公钥验证链中的每个证书,除了最后一个,但它不会受到伤害。

    编辑您还应该执行this answer中的建议。

    【讨论】:

    • 我看到我在 X509Certificate[] certs 中只有 2 个证书,所以根据第二点,您想说检查 certs[1].verify(Mycert.getPublicKey()) 没问题,我说对了吗?
    • 正确。但是我想知道是否可以安全地假设证书按规定的顺序呈现。您可能需要重新排序。
    • 我尝试过使用certs[1].verify(Mycert.getPublicKey()),但这也是在抛出java.security.SignatureException: Signature does not match.。表示 certs[0] 和 certs[1] 都抛出异常。
    • 所以这两个证书都没有使用您的域证书签名。你有任何理由不相信吗?
    • 文件 domain.crt 是从 mozila 浏览器导出的,因为附件中有问题的证书路径取决于我的域,即 url.esb.com 在这种情况下,我遇到了前面评论中所说的异常。现在我尝试将证书导出到 COMODO RSA Domain Validation Secure Server CA 证书路径(就在域之前),如果我用 certs[0] 检查它会成功,但不能用 certs[1]
    猜你喜欢
    • 1970-01-01
    • 2022-09-25
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多