考虑以下示例代码,它使用
我正在针对真实世界的EV证书进行测试。代码现在可以与
但即使是在Paypal.com上,信任锚点getCAName返回null,那么我怎么知道它是针对哪个CA进行验证的,以便我可以查找正确的EV策略?
TrustManager
记录出站连接是否使用有效证书(但在所有情况下都接受连接):import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;
public class CertChecker implements X509TrustManager {
private final X509TrustManager defaultTM;
public CertChecker() throws GeneralSecurityException {
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init((KeyStore)null);
defaultTM = (X509TrustManager) tmf.getTrustManagers()[0];
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
if (defaultTM != null) {
try {
defaultTM.checkServerTrusted(certs, authType);
System.out.println("Certificate valid");
} catch (CertificateException ex) {
System.out.println("Certificate invalid: " + ex.getMessage());
}
}
}
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
public X509Certificate[] getAcceptedIssuers() { return null;}
public static void main(String[] args) throws Exception {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] {new CertChecker()}, new SecureRandom());
SSLSocketFactory ssf = (SSLSocketFactory) sc.getSocketFactory();
((SSLSocket)ssf.createSocket(args[0], 443)).startHandshake();
}
}
在checkClientTrusted
方法中,我需要做什么来检查该证书是扩展验证证书(现代浏览器中的绿色地址栏)还是普通证书(黄色地址栏)?
编辑:
我正在尝试使一个CertPathValidator
工作,但不知何故,我只得到有关证书不是CA证书的异常... 有什么想法吗?
编辑2:使用PKIXParameters
而不是PKIXBuilderParameters
private boolean isEVCertificate(X509Certificate[] certs, String authType) {
try {
CertPath cp = new X509CertPath(Arrays.asList(certs));
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(new File(System.getProperty("java.home"), "lib/security/cacerts")), null);
PKIXParameters cpp = new PKIXParameters(ks);
cpp.setRevocationEnabled(false);
CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
PKIXCertPathValidatorResult res = (PKIXCertPathValidatorResult) cpv.validate(cp, cpp);
System.out.println(res.getTrustAnchor().getCAName());
System.out.println(res.getPolicyTree().getValidPolicy());
System.out.println(cp);
return false;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
我正在针对真实世界的EV证书进行测试。代码现在可以与
www.paypal.com
一起使用(也就是说,它不会抛出异常),但无法与banking.dkb.de
一起使用。:(但即使是在Paypal.com上,信任锚点getCAName返回null,那么我怎么知道它是针对哪个CA进行验证的,以便我可以查找正确的EV策略?
PKIXBuilderParameters
进行验证;通常我会只使用PKIXParameters
(目标已知)。此外,你使用的证书链是通过“真正”的CA发行的,还是通过你自己签名的测试CA发行的?如果是后者,我会担心各种扩展。它们非常棘手,很难正确地满足PKIX验证器的要求。 - ericksonhttps://banking.dkb.de/dkb/
。 - ericksonhttps://banking.dkb.de/
相关的问题。实际上这是他们服务器的配置错误:他们发送了其中一个中间证书两次,如果您直接使用它,则会产生无效的证书链。当我使用我的isEV
方法时,我实际上使用了一个CertPathBuilder
,并将从服务器接收到的整个链传递给它。该构建器能够创建正确的链路,忽略服务器错误发送的不必要证书。如果这是正确的,那么 EV 测试本身不应该失败,而应该是路径验证失败。 - erickson