【问题标题】:Opening a SSL socket using a pem certificate使用 pem 证书打开 SSL 套接字
【发布时间】: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


【解决方案1】:

您不需要将密钥加载到 Java 密钥库中吗?

这是一个单独的程序。

http://docs.oracle.com/javase/7/docs/technotes/tools/solaris/keytool.html

-importcert {-alias 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} {-protected} {-Jjavaoption}

读取证书或证书链(提供后者 在 PKCS#7 格式的回复或 X.509 证书序列中)来自 文件 cert_file,并将其存储在由别名标识的密钥库条目中。如果 没有给出文件,从标准输入读取证书或证书链。

keytool 可以导入 X.509 v1、v2 和 v3 证书,以及 PKCS#7 由该类型证书组成的格式化证书链。这 要导入的数据必须以二进制编码格式或以 由定义的可打印编码格式(也称为 Base64 编码) 互联网 RFC 1421 标准。在后一种情况下,编码必须有界 以“-----BEGIN”开头的字符串开头,并以 以“-----END”开头的字符串结尾。

【讨论】:

  • 这会导入所有java应用程序信任的证书吗?这就是我一直在使用的命令:“keytool -importkeystore -destkeystore mystore.jks -srcstoretype PKCS12 -srckeystore mystore.p12”
  • 谢谢,但我需要这些命令中的哪一个?对不起,我不明白所有这些键之间有什么区别......
  • 据我了解,您将证书添加到密钥库中,然后您可以在程序中使用它,这是另一个可能有帮助的答案stackoverflow.com/a/1710543/621567
  • 嗯,我仍然收到 sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效认证路径...
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 2014-01-06
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
  • 2013-04-15
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多