我有一个 PEM 文件提供给我,并被告知在建立连接到 c++ 服务器以进行某些 API 调用的 SSL 套接字时需要它。有谁知道我如何读取 PEM 文件并进行连接?我还得到了释义密码。
2 回答
听起来 PEM 文件是您用来登录服务器的客户端证书。如果它是客户端证书,并且听起来确实如此,那么您可能还需要一个 ca 证书文件来验证服务器证书以建立连接。
CA 证书需要进入信任库,您的客户端证书需要进入密钥库。在 Java 中,这两个都是 JKS(尽管它对 PKCS12 的支持有限。)JRE 以及每个用户都有默认的密钥库/信任库位置。您还可以在代码中为这些文件指定外部位置,如下例所示。commons-ssl库貌似可以直接支持PEM,不需要JKS,不过我没用过。
Java 中这些密钥库的默认密码是“changeit”,不带引号。
此页面显示您必须将 PEM 读入您的密钥库/信任库。这是另一个例子。
正确设置信任库和密钥库后,您需要将以下JSSE 系统属性传递给 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 示例。此外,这是SSLSocket的 Java api 。这也是一个不使用任何 apache commons的示例。
您需要一个处理 SSL 的库。正如 John Ellinwood 所指出的,某些框架(例如 Java 2 SE)提供了这些内置功能,而其他框架则需要使用 3rd 方库。
C 开发人员经常直接使用 openssl,但它不能说是容易的,在使用 C++ 时有几个“陷阱”很容易陷入。
我建议您使用支持 SSL 的 C++ 网络库,例如 QT 的网络库或 Poco NetSSL。有关一些教程文档,请参见此处,有关 API 文档,请参见此处 - 您可能想查看直接采用 PEM 文件的initializeClient 。