繁体   English   中英

使用Pem证书打开SSL套接字

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM