【发布时间】:2011-10-01 13:12:00
【问题描述】:
假设我有这样的东西(客户端代码):
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
SSLContext sslc = SSLContext.getInstance("TLS");
sslc.init(null, trustAllCerts, null);
SocketFactory sf = sslc.getSocketFactory();
SSLSocket s = (SSLSocket) sf.createSocket("127.0.0.1", 9124);
此代码功能齐全,但我真的不知道如何根据我在 pem 文件中可用的一个具体 CA 证书来验证服务器的证书。
所有证书都由我的自签名 CA 签名,这是我需要验证的 CA(仅针对这个)。
感谢每一个答案。
编辑:
回应 jglouie(非常感谢您 - 无法投票赞成您的答案)。
我创建了解决方案:
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType)
throws CertificateException {
InputStream inStream = null;
try {
// Loading the CA cert
URL u = getClass().getResource("tcp/cacert.pem");
inStream = new FileInputStream(u.getFile());
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate ca = (X509Certificate) cf.generateCertificate(inStream);
inStream.close();
for (X509Certificate cert : certs) {
// Verifing by public key
cert.verify(ca.getPublicKey());
}
} catch (Exception ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
inStream.close();
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
};
【问题讨论】:
-
您好,我正在尝试为
checkServerTrusted实施您的解决方案我有我的.crt 文件,其中包含在打开网站后从浏览器导出的完整证书链。但在for循环到verifypublic 我得到了异常。 -
我的基本问题是pem文件是什么?如何生成它?它包含什么私钥信息或公钥信息。?对不起,我问的问题太基本了..
标签: java ssl x509certificate x509 x509trustmanager