为什么我需要CA证书文件从Java与服务器建立SSL连接?

为什么我需要CA证书文件从Java与服务器建立SSL连接?,java,ssl,ssl-certificate,pem,Java,Ssl,Ssl Certificate,Pem,我有一个PEM格式的自签名客户端证书,可以通过SSL套接字与服务器连接。此证书如下所示: client.pem -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- -----BEGIN ENCRYPTED PRIVATE KEY----- ... -----END ENCRYPTED PRIVATE KEY----- 在Python中,我的客户机代码只需要此PEM文件,并且运行良好: context = ssl.SSLContex

我有一个PEM格式的自签名客户端证书,可以通过SSL套接字与服务器连接。此证书如下所示:

client.pem

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----
在Python中,我的客户机代码只需要此PEM文件,并且运行良好:

context = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
context.load_cert_chain('client.pem', password='password')
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock = context.wrap_socket(sock)
sock.connect(('localhost', 2007))
...
我必须把这段代码翻译成Java。我使用尚不通用的SSL库编写了工作代码,但结果证明我还需要CA.crt。如果没有它,这段代码根本不起作用

SSLClient client = new SSLClient();
client.setEnabledProtocols(new String[] { "SSLv3" });
client.addTrustMaterial( TrustMaterial.DEFAULT );
client.addTrustMaterial( new TrustMaterial( "CA.crt" ) );
client.setKeyMaterial( new KeyMaterial( "client.pem", "password".toCharArray() ) );
SSLSocket sslsocket = (SSLSocket) client.createSocket("localhost", 2007);
...

为什么Java需要这个CA证书,而Python不需要它?如何在Java中消除这个问题?

KeyMaterial可能会忽略PEM文件中嵌入的CA证书。