我有一个客户端证书.pem文件,包括私钥和证书。我想使用Feign来调用需要客户端证书的restful api。
我在谷歌上搜索了很多例子,但这些例子告诉我们从jks导入密钥,如下所示:
public class App {
public static void main(String[] args) throws Exception {
SSLFactory sslFactory = SSLFactory.builder()
.withIdentityMaterial("identity.jks", "password".toCharArray())
.withTrustMaterial("truststore.jks", "password".toCharArray())
.build();
Feign.Builder client = Feign.builder()
.client(new Client.Default(sslFactory.getSslSocketFactory(), sslFactory.getHostnameVerifier()));
}
}
但是,我想直接从.pem文件导入证书,因为我没有.jks文件,也不想手动转换,因为.pem文件是通过编程定期从其他服务器获取的。我该怎么做?
我是您在问题中发布的SSLFactory
的库维护人员。在不将pem文件转换为密钥库文件的情况下使用pem文件非常容易。您需要一个extion库来启用该功能。你能添加以下库吗:
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart-for-pem</artifactId>
<version>7.4.5</version>
</dependency>
导入库后,您可以使用以下代码段
public class App {
public static void main(String[] args) throws Exception {
X509ExtendedKeyManager keyManager = PemUtils.loadIdentityMaterial(Paths.get("/path/to/your/certificate-chain.pem"), Paths.get("/path/to/your/private-key.pem"));
X509ExtendedTrustManager trustManager = PemUtils.loadTrustMaterial(Paths.get("/path/to/your/some-trusted-certificate.pem"));
SSLFactory sslFactory = SSLFactory.builder()
.withIdentityMaterial(keyManager)
.withTrustMaterial(trustManager)
.build();
Feign.Builder client = Feign.builder()
.client(new Client.Default(sslFactory.getSslSocketFactory(), sslFactory.getHostnameVerifier()));
}
}
更新
看起来OP想要提供一个pem文件作为标识,该文件包含证书链和私钥作为单个文件。在我最初的回答中,我发布了一个例子,其中需要提供两个单独的文件,但也可以提供一个文件,参见这里的例子:
X509ExtendedKeyManager keyManager = PemUtils.loadIdentityMaterial(Paths.get("/path/to/your/identity.pem"));
如果您的私钥是加密的,您可以提供密码作为第二个参数,如下所示:
X509ExtendedKeyManager keyManager = PemUtils.loadIdentityMaterial(Paths.get("/path/to/your/identity.pem"), "password".toCharArray());
所有可能的用法都可以在PemUtils的单元测试中找到:https://github.com/Hakky54/sslcontext-kickstart/blob/5bcc06a862d654e5e59daa4175c39abe230b8fb6/sslcontext-kickstart-for-pem/src/test/java/nl/altindag/ssl/util/PemUtilsShould.java#L65