Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java/Android Studio中将服务器证书添加到客户端_Java_Sockets_Android Studio_Ssl_Ssl Certificate - Fatal编程技术网

如何在Java/Android Studio中将服务器证书添加到客户端

如何在Java/Android Studio中将服务器证书添加到客户端,java,sockets,android-studio,ssl,ssl-certificate,Java,Sockets,Android Studio,Ssl,Ssl Certificate,我正在尝试从Android手机连接到用Python实现的SSL服务器。我自己签署了一个certificate server.crt,并希望在Android应用程序中使用此证书 如何在Java中实现这一点?在Python中,这可以通过以下方式完成: sock = socket.socket(socket.AF_INET6) context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile = 'server.crt') con

我正在尝试从Android手机连接到用Python实现的SSL服务器。我自己签署了一个certificate 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);
X509TrustManager[] arr = new YourX509TrustManager []{new YourTrustManager()};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), arr, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

如何扩展它,使其使用证书?提前谢谢

Java默认使用cacerts文件,该文件是存储可信证书颁发机构的地方。它位于jre/lib/security/cacerts。你可以把它加在那里。此外,还可以通过Java加密选项指定不同的CA存储

如果你想在代码中实现它,你可以。但在我看来,这并不是正确的方法。实现X509TrustManager接口。然后像这样:

SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) factory.createSocket(HOST, PORT);
X509TrustManager[] arr = new YourX509TrustManager []{new YourTrustManager()};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), arr, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

谢谢你的回答!但是,如果我使用第一个选项,是否有可能在Android中与应用程序一起交付证书?修改cacerts总是一个糟糕应用程序设计的指标,尤其是在Android上,因为它需要根权限,所以没有多大意义。因此,请停止建议将其作为第一个解决方案!此外,发布的代码也遗漏了加载信任存储的相关部分。@Robert cacerts是JRE范围内受信任证书颁发机构的默认位置。因此,它是放置可信证书的完全有效的位置。如果这就是你所说的糟糕的应用程序设计,那么服务器端应用程序可能比Android应用程序更好。对于服务器端应用程序,这是公认的做法。而@MarkusK96,我的做法是将证书与您的应用程序一起发送。也许你的应用程序有一个可以放置证书的目录?我不是Android开发人员,但这似乎是合乎逻辑的,允许您阅读证书并使用X509TrustManager。因为它是你的应用程序包的一部分,所以你不需要像Robert提到的那样进行根烫发