[英]Opening a SSL socket using a pem certificate
我正在尝试使用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密钥库中?
那是一个单独的程序。
http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html
-importcert {-alias别名} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name { -providerArg provider_arg}} {-v} {-保护} {-Jjavaoption}
从文件cert_file读取证书或证书链(其中,后者以PKCS#7格式的答复或X.509证书序列提供),并将其存储在别名标识的密钥库条目中。 如果未提供文件,则从stdin中读取证书或证书链。
keytool可以导入X.509 v1,v2和v3证书,以及由该类型的证书组成的PKCS#7格式的证书链。 必须以Internet RFC 1421标准定义的二进制编码格式或可打印的编码格式(也称为Base64编码)提供要导入的数据。 在后一种情况下,编码必须在开头以“ ----- BEGIN”开头的字符串为界,在结尾处以“ ----- END”开头的字符串为界。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.