如何建立对中介颁发的 X.509 证书的信任?

Posted

技术标签:

【中文标题】如何建立对中介颁发的 X.509 证书的信任?【英文标题】:How can I establish trust in a X.509 certificate issued by an intermediary? 【发布时间】:2011-01-14 21:28:34 【问题描述】:

我有一个经过数字签名的 XML 文档。我使用 XML 数字签名 API 来验证签名。但此文档是一个 SAML 2.0 断言,将用于单点登录到我们的 Web 应用程序。因此,我需要建立对用于签署 XML 文档的 X.509 证书的信任。

我用来尝试建立这种信任的代码是:

String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar);
FileInputStream is = new FileInputStream(filename);
KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
String password = "changeit";
keystore.load(is, password.toCharArray());

PKIXParameters params = new PKIXParameters(keystore);
params.setRevocationEnabled(false);

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
CertPath certPath = certFactory.generateCertPath(Arrays.asList(signatureCertificate));

CertPathValidator certPathValidator = CertPathValidator.getInstance(CertPathValidator.getDefaultType());
CertPathValidatorResult result = certPathValidator.validate(certPath, params);

PKIXCertPathValidatorResult pkixResult = (PKIXCertPathValidatorResult) result;
TrustAnchor ta = pkixResult.getTrustAnchor();
X509Certificate cert = ta.getTrustedCert();

当运行对certPathValidator.validate() 的调用时,会抛出带有消息Path does not chain with any of the trust anchorsCertPathValidatorException

检查证书,它说它是由OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign,OU=VeriSign International Server CA - Class 3,OU=VeriSign\, Inc.,O=VeriSign Trust Network 颁发的。 这不是 JDK 的 cacerts 密钥库中的信任锚之一。

但是,使用 IE 检查类似证书的信任链,我发现 www.verisign.com/CPS Incorp. 是由 VeriSign Class 3 Public Primary CA 颁发的,这似乎是 JDK 的 cacerts 密钥库中的信任锚之一。

我的问题:如何让 Java 验证此证书?

【问题讨论】:

【参考方案1】:

将颁发 CA 的公共证书插入到 cacert 密钥库中。

edit:您可以使用 keytool 或其他工具之一。文章介绍keytool的使用:keytool-Key and Certificate Management Tool

【讨论】:

谢谢。这可能是一个愚蠢的问题,但是我怎样才能获得颁发者的 X.509 证书呢? verisign.com/support/roots.html - 注册表下方是一个下载所有 Verisigns 根证书的链接。 太好了,谢谢。我需要的证书不在那个网站上,但我可以使用 Google 找到它。再次感谢。 你能给出一个“傻瓜式”解释如何获得颁发CA的公共证书吗?我正在使用envmgr.com/LabelService/EwsLabelService.asmx 的证书我已将其下载到我的电脑并确认它会在 Jdk1.7 中引发“不链接”错误,但我不确定如何从这里开始。【参考方案2】:

正是 xelco 所说的 - 添加中间 CA:

OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign,OU=VeriSign International Server CA - Class 3,OU=VeriSign\, Inc.,O=VeriSign Trust Network

到 JDK 的密钥库。你可以使用keytool来做。

原因:一般在对 XML 消息进行签名时,签名中只包含签名证书。 X509 证书就像单链表。最终实体指向其发行者。发行者指向它的发行者,直到你到达一个指向自身的自签名根 CA。要根据 PKIX 验证证书,验证器需要能够构建从最终实体到自签名根的整个 CA 链,因此链的每个部分(最终实体除外)都必须在您的证书存储中。

【讨论】:

【参考方案3】:

我有更好的解决方案。我找到了可以运行并为我们做所有事情的 java 服务。

Java: http://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

【讨论】:

代码示例,否则没有帮助。并仔细检查这是否已被要求。

以上是关于如何建立对中介颁发的 X.509 证书的信任?的主要内容,如果未能解决你的问题,请参考以下文章

将新的受信任 CA 添加到 Azure 上的证书颁发机构证书存储区

ssl

联盟链系列 - 用Openssl颁发X.509证书

“.net4.5安装错误 无法建立到信任根颁发机构的证书链”是啥意思?

数字证书

联盟链系列 - 中间CA颁发证书