我创建了一个自签名证书(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/