java - 创建从 Java 客户端(在 Android 上)到 Python 服务器的自签名 SSL 套接字

标签 java android python ssl self-signed

我创建了一个自签名证书(server.crt、server.key、server.p12)。我使用这个工作正常的自签名证书获得了 Python-Python SSL 套接字连接。

Python 服务器:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 10023))
s.listen(5)
s_, fromaddr = s.accept()
connstream = ssl.wrap_socket(s_,
                             server_side=True,
                             certfile="server.crt",
                             keyfile="server.key")
data = connstream.read()
...

现在,我希望我的 Android 应用程序能够与我的 Python 服务器通信。我可以获得非 SSL 连接。我不确定如何处理自签名证书。我的理解是我必须将证书存储在 Java 的信任库中。我很难找到使用受信任的证书文件(例如 crt?)在 Android 应用程序中(以编程方式)执行此操作的示例。显然,这种信任的范围仅限于应用程序,并不是永久性的解决方案。

Java 客户端(Android 上):

SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
Socket socket = ssf.createSocket(HOST, PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("hello from java!");
out.flush();
...

当我尝试连接时,我在服务器上收到以下错误:

ssl.SSLError: [Errno 1] _ssl.c:499: error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown

最佳答案

  • 在服务器导出crt文件
  • 从 Android 代码的断言或文件中导入 crt 文件
  • 在 Android 代码中使用 TrustManagerFactory 设置 crt
  • 使用TrustManagerFactory初始化SSLContext

这是对 official document 的引用

关于java - 创建从 Java 客户端(在 Android 上)到 Python 服务器的自签名 SSL 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40478340/

相关文章:

java - 如何在黑莓中的 hfm 中对齐文本字段和按钮字段

android - Google 因后台广告暂停了我的应用

python - ListAPIView 中的 Django Rest Framework 序列化错误

java - Swagger2 @ApiParam 指定类型

java - 为什么JPA实体类不能有自定义实例变量?

java - Spring @Value - 有没有办法分配默认的空 map ?

java - 如何从图库中删除视频?

android - 我怎样才能以一种好的方式签署我的申请?

python - scrapy - 项目加载器 - mysql

python - 将 N 维数组广播到 (N+1) 维数组并对除 1 维之外的所有维求和