【问题标题】:SSL Sockets - Java and Certificates?SSL 套接字 - Java 和证书?
【发布时间】:2017-06-18 06:27:38
【问题描述】:

我正在尝试在 Android 应用和 Python API 之间实现 SSL 套接字。

下面的代码...

SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
Socket s = ssf.createSocket("10.0.2.2", 5001);
DataOutputStream myDataOut = new DataOutputStream(s.getOutputStream());
myDataOut.writeUTF("Hello Server");
myDataOut.flush();
myDataOut.close();
s.close();

如您所见,不起作用:

590.0750 - Establishing connection to ('127.0.0.1', 50888)
590.0970 - Error while connecting
590.0970 - Error information: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:590)

我相信不是因为我没有指定证书。 查看客户端的 Python 工作示例:

import socket, ssl, pprint

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

ssl_sock = ssl.wrap_socket(s,
                           ca_certs="server.crt",
                           cert_reqs=ssl.CERT_REQUIRED)

ssl_sock.connect(('localhost', 5001))

print repr(ssl_sock.getpeername())
print ssl_sock.cipher()
print pprint.pformat(ssl_sock.getpeercert())

ssl_sock.write("Hello from the client...")

如何像在 Python 中一样在 Java 中指定证书?

【问题讨论】:

  • 您可以使用 jvm 参数 -Djavax.net.debug=ssl * 来调试 Java 中的 ssl 问题。所以你可以看到客户端和服务器之间真正发生了什么。在您的情况下,我认为您的服务具有 *localhost 的证书,并且在您的 java 程序中您使用 ip。如果您在 java 中使用带有证书的 ip,请小心,因为您必须使用主机名作为 CN。将 ip 地址作为 DNS 别名放在 ssl v3 扩展中。

标签: java android sockets ssl


【解决方案1】:

我理解你的意思是正确的,这个answer 的相关问题可能对你来说很有趣。它描述了指定认证的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2021-01-19
    • 2013-04-15
    • 2015-05-08
    • 2017-05-08
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多