我有真正的证书“salientrisk.crt”和“salientrisk.key”,服务器配置为具有这些证书的 SSL 服务器,现在在客户端,如果我有相同的证书,那么只有它应该能够与其他人握手明智的是它应该失败,它不应该允许客户端连接到服务器。
如何使用公钥/私钥在客户端和服务器之间进行握手。
问题是,如果我在这里传递自签名证书,那么它也可以正常工作,这是我不想要的。
我在主类中使用了以下代码:
SSLContext sslContext = null;
try{
sslContext = SSLContext.getInstance("SSL");
ServerTrustManager serverTrustManager = new ServerTrustManager();
sslContext.init(null, new TrustManager[]{serverTrustManager}, null);
}catch(Exception e){
logger.error("Error while getting SSL context", e);
}
=================================================
package com.common.restclient;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
public class ServerTrustManager implements X509TrustManager{
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
// TODO Auto-generated method stub
X509Certificate cert=null;
try (InputStream inStream = new FileInputStream("SSLCertificate/salientrisk.crt")) {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
cert = (X509Certificate)cf.generateCertificate(inStream);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cert.checkValidity();
cert.getIssuerUniqueID();
cert.getSubjectDN();
}
@Override
public X509Certificate[] getAcceptedIssuers() {
// TODO Auto-generated method stub
return null;
}
}
最佳答案
您服务器中的 key 对可能也是自签名的,并且您尝试测试的 key 对具有相同的父证书 ca
关于java - 如何在 java 客户端禁用自签名证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35425043/