【问题标题】:How to add a server’s certificate to the client in Java / Android Studio如何在 Java / Android Studio 中将服务器的证书添加到客户端
【发布时间】:2019-02-12 01:00:25
【问题描述】:

我正在尝试从 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);

如何扩展它以使其使用证书?提前致谢!

【问题讨论】:

标签: java sockets android-studio ssl ssl-certificate


【解决方案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());

【讨论】:

  • 感谢您的回答!但是,如果我使用第一个选项,是否可以将证书与 Android 中的应用程序一起提供?
  • 修改cacerts 总是表明应用程序设计不佳(特别是因为它在Android 上没有多大意义,因为它需要root 权限)。因此,请停止将其建议为第一个解决方案!发布的代码也错过了加载信任库的相关部分。
  • @Robert cacerts 是 JRE 范围内受信任的证书颁发机构的默认位置。因此,它是放置受信任证书的完全有效位置。如果这就是糟糕的应用程序设计的意思,那么服务器端应用程序可能比 Android 应用程序更好。对于服务器端应用程序,这是公认的做法。
  • 和@MarkusK96,我的做法是将证书与您的应用程序一起提供。也许您的应用程序有一个可以放置证书的目录?我不是 Android 开发人员,但这似乎合乎逻辑,可以让您阅读证书并使用 X509TrustManager。由于它是您应用程序包的一部分,因此您不需要 Robert 提到的 root 权限。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 2016-05-24
  • 2014-09-05
  • 2013-01-23
  • 2019-10-14
  • 1970-01-01
  • 2017-10-18
  • 2015-10-26
相关资源
最近更新 更多