我有一个PEM格式的自签名客户端证书,通过SSL Socket与服务器建立连接。该证书如下所示:
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。我使用Not-Yet-Commons-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中摆脱这个?