【发布时间】:2011-04-30 08:54:33
【问题描述】:
我有一个 PEM 文件提供给我,并被告知在建立连接到 c++ 服务器以进行某些 API 调用的 SSL 套接字时需要它。有谁知道我如何读取 PEM 文件并进行连接?我还得到了释义密码。
【问题讨论】:
-
重复;我认为问题的另一个版本提供的信息更多。
标签: java ssl certificate pem jks
我有一个 PEM 文件提供给我,并被告知在建立连接到 c++ 服务器以进行某些 API 调用的 SSL 套接字时需要它。有谁知道我如何读取 PEM 文件并进行连接?我还得到了释义密码。
【问题讨论】:
标签: java ssl certificate pem jks
听起来 PEM 文件是您用来登录服务器的客户端证书。如果它是客户端证书,并且听起来确实如此,那么您可能还需要一个 ca 证书文件来验证服务器证书以建立连接。
CA 证书需要进入信任库,您的客户端证书需要进入密钥库。在 Java 中,这两个都是 JKS(尽管它对 PKCS12 的支持有限。)JRE 以及每个用户都有默认的密钥库/信任库位置。您还可以在代码中为这些文件指定外部位置,如下例所示。 commons-ssl库貌似可以直接支持PEM,不需要JKS,不过我没用过。
Java 中这些密钥库的默认密码是“changeit”,不带引号。
This page 表明您必须将 PEM 读入您的密钥库/信任库。这里是another example。
正确设置信任库和密钥库后,您需要将以下 JSSE system properties 传递给您的 JVM:
javax.net.ssl.keyStore
javax.net.ssl.keyStoreType
javax.net.ssl.keyStorePassword
javax.net.ssl.trustStore
javax.net.ssl.trustStoreType
javax.net.ssl.trustStorePassword
您可以将它们指定为 JRE 的 -D 参数,或者如下例所示,以编程方式。
一旦你完成了,这里是 commons-ssl example 创建一个套接字。此外,这是SSLSocket 的 Java api。这里还有一个example,它不使用任何 apache commons。
【讨论】:
您需要一个处理 SSL 的库。正如 John Ellinwood 所指出的,一些框架(例如 Java 2 SE)提供了这些内置功能,而其他框架则需要使用 3rd 方库。
C开发者经常直接使用openssl,但也不能说简单,在使用C++时有几个“陷阱”很容易陷入。
我建议您使用支持 SSL 的 C++ 网络库,例如 QT 的网络库或 Poco NetSSL。有关 API 文档的一些教程文档,请参阅 here and here - 您可能想查看直接采用 PEM 文件的 initializeClient。
【讨论】: