【问题标题】:java.security.cert.CertificateException: Unable to initializejava.security.cert.CertificateException:无法初始化
【发布时间】:2016-11-04 08:39:09
【问题描述】:

您好,我尝试针对另一个证书验证一个证书,并在读取第一个证书表单文件时出错:

//Get Public Key
BasicX509Credential publicCredential = new BasicX509Credential();
File publicKeyFile = new File("keys/azurecert.cer");

if (publicKeyFile.exists()) {
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    InputStream fileStream = new FileInputStream(publicKeyFile);
    X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(fileStream);
            fileStream.close();

azurecert.cer 由我生成,其内容是从 azures (adfs) federationmetadata.xml 复制粘贴的。这是个问题吗?

<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
    <X509Data>
        <X509Certificate>
            MIIC4jCC....
        </X509Certificate>
    </X509Data>
</KeyInfo>

我把它写成这样的格式:

—–--BEGIN CERTIFICATE--—–  
MIIDBTCCAe2gAwIBAgIQPLxWKJFunNyLetteErs/DAtQPLxWKJFunNyLMMFsdioT
MSswKQYDVQQDEyJhY2NvdW50cy5hFunNyLetteErsndpbmRvd3MubmV0XHhsStcm
....
----END CERTIFICATE----

但结果是:

java.security.cert.CertificateException: Unable to initialize, java.io.IOException: extra data given to DerValue constructor

在线:

certificateFactory.generateCertificate(inputStream2)

有人可以帮忙吗?

【问题讨论】:

    标签: java certificate digital-signature saml-2.0 opensaml


    【解决方案1】:

    确保您有正确的标题。而不是—–BEGIN CERTIFICATE—–--END CERTIFICATE-- 使用

    -----BEGIN CERTIFICATE-----
    
    -----END CERTIFICATE-----
    

    或者,您可以读取二进制格式的证书:删除 BEGIN CERTIFICATE 和 END CERTIFICATE 标签并解码 base64

    【讨论】:

    • 哦,是的,这是一个问题,在这个过程中出了点问题......我已经更新了问题
    • 您的代码是正确的。证书的内容似乎有问题。 stackoverflow.com/questions/11621414/…。尝试另存为二进制.crt,正如我在答案中所写,然后双击(Windows)打开它,或者使用openssl导入/导出(见链接)。如果内容可以公开,复制到问题里,我去看看
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2020-01-22
    • 2017-03-26
    • 2019-01-05
    • 2018-03-22
    • 2015-06-30
    • 2012-12-21
    • 2014-06-24
    相关资源
    最近更新 更多