【发布时间】:2017-01-08 03:47:16
【问题描述】:
我正在尝试使用 Java 连接到 ssl 服务器。我已经设法在 Python 中做到这一点,但是我有一个 Java 不支持的 PEM 文件。将其转换为 PKCS12 无效
尝试连接时出错:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我的问题是:你能给我 Java 的等价物吗? (使用其他库也可以)
import ssl
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysslsock = ssl.wrap_socket(mysock, keyfile='mykey.pem', certfile='mycert.pem')
mysslsock.connect(("SOMEHOST", XXXXX))
请注意,服务器需要客户端身份验证。
编辑
这就是我在 Java 中所做的:
我使用 openssl 将我的证书转换为 PKCS12 格式:
openssl pkcs12 -export -out mystore.p12 -inkey mykey.pem -in mycert.pem
然后我就用JDK自带的keytool把它转成JKS了:
keytool -importkeystore -destkeystore mystore.jks -srcstoretype PKCS12 -srckeystore mystore.p12
这是我的 Java 代码:
System.setProperty("javax.net.ssl.keyStore", "mystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(HOST, PORT);
socket.startHandshake(); // That's the line I get the exception
socket.close();
我确定我犯了一些非常愚蠢的错误,因为我没有任何 SSL 经验。
编辑: 可能我弄错了证书,所以它们看起来像这样:
<mykey.pem>
-----BEGIN RSA PRIVATE KEY-----
ljnoabndibnwzb12387uGJBEIUQWBIDAB
....... (Some more lines)
-----END RSA PRIVATE KEY-----
<mycert.pem>
Bag Attributes
localKeyId: XX XX XX XX
subject:...
issuer:...
-----BEGIN CERTIFICATE-----
LAinaw8921hnA.......
.....
-----END CERTIFICATE-----
【问题讨论】:
-
请在问题中包含您的 java 代码。
标签: java python sockets ssl ssl-certificate