我正在尝试从Android手机连接到以Python实现的SSL服务器。我对证书server.crt
进行了自签名,并想在Android应用程序中使用此证书。
如何在Java中执行此操作?在Python中,可以通过以下方式完成:
sock = socket.socket(socket.AF_INET6)
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile = 'server.crt')
conn = context.wrap_socket(sock, server_hostname = HOST)
conn.connect((HOST, PORT))
我当前的Java代码如下:
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(HOST, PORT);
如何扩展它以使其使用证书?预先感谢!
答案 0 :(得分:1)
默认情况下,Java使用cacerts文件,该文件存储在受信任的证书颁发机构中。该文件位于jre / lib / security / cacerts。您可以在此处添加它。另外,您可以通过Java加密选项指定其他CA存储。
如果要用代码完成,可以。但这并不是IMO的正确方法。实现接口X509TrustManager
。然后是这样的:
X509TrustManager[] arr = new YourX509TrustManager []{new YourTrustManager()};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), arr, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());