如何使用 PEM 文件在 Java 中创建 SSL 套接字?

Posted

技术标签:

【中文标题】如何使用 PEM 文件在 Java 中创建 SSL 套接字?【英文标题】:How to use PEM file to create a SSL socket in Java? 【发布时间】:2010-10-17 22:13:05 【问题描述】:

See related question.

我有一个 PEM 文件提供给我,并被告知在建立连接到 c++ 服务器以进行某些 API 调用的 SSL 套接字时需要它。有谁知道我如何读取 PEM 文件并进行连接?我还得到了释义密码。

【问题讨论】:

重复;我认为问题的另一个版本提供的信息更多。 【参考方案1】:

听起来 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。

【讨论】:

Ahmm.. 不错的答案 - 但他实际上问的是 C++,而不是 Java。 其实他把它标记为Java和JKS,也就是Java KeyStore。他想连接到远程服务器,这将使用 SSL 套接字完成。另一边 C++ 与连接机制没有那么相关的事实。【参考方案2】:

您需要一个处理 SSL 的库。正如 John Ellinwood 所指出的,一些框架(例如 Java 2 SE)提供了这些内置功能,而其他框架则需要使用 3rd 方库。

C开发者经常直接使用openssl,但也不能说简单,在使用C++时有几个“陷阱”很容易陷入。

我建议您使用支持 SSL 的 C++ 网络库,例如 QT 的网络库或 Poco NetSSL。有关 API 文档的一些教程文档,请参阅 here and here - 您可能想查看直接采用 PEM 文件的 initializeClient。

【讨论】:

以上是关于如何使用 PEM 文件在 Java 中创建 SSL 套接字?的主要内容,如果未能解决你的问题,请参考以下文章

使用DER格式在Java中创建CSR [重复]

如何使用CRT和PEM文件在SSLcat中实现ssl(SSL_ERROR_NO_CYPHER_OVERLAP)

在 PHP 可读的 javascript 中创建 PEM 密钥对

ssl证书 只有crt文件 但是使用时需要key或pem文件 请问如何转换

ssl证书 只有crt文件 但是使用时需要key或pem文件 请问如何转换

如何从 PEM 编码证书中确定 SSL 证书到期日期?