我当前的 TCP 客户端正在使用org.apache.http.conn.ssl.SSLSocketFactory
我正在迁移到的构建套接字import javax.net.ssl.SSLSocketFactory;
但是,我不确定如何加载存储在我已经拥有的 .p12 文件中的客户端证书的私钥,作为新 SSLSocketFactory 的上下文?
这是我现有的代码,使用已弃用的 SSLSocketFactory:
import org.apache.http.ssl.SSLContexts;
import org.apache.http.conn.ssl.SSLSocketFactory;
String ksPassphrase = "myKSpass";
String pkPassphrase = "myPKpass";
// Get a keystore instance of type PKCS12:
KeyStore keystore = KeyStore.getInstance("PKCS12");
// Load keystore file and password:
keystore.load(new FileInputStream("myFile.p12"), ksPassphrase.toCharArray());
// Create HTTPS connection socket factory context:
SSLContext context = SSLContexts.custom()
.loadKeyMaterial(keystore, pkPassphrase.toCharArray())
.build();
SSLSocketFactory sslScktFactory = new SSLSocketFactory(context);
这是我可以从文档中管理的最佳代码:
import javax.net.ssl.*;
// not sure if this is the pass to KS or private key or, somehow both?
String passphrase = "myPassphrase"
SSLContext context = SSLContext.getInstance("TLS");
KeyManagerFactory keyMngFactory = KeyManagerFactory.getInstance("SunX509");
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream("myFile.jks"), passphrase.toCharArray());
keyMngFactory.init(keyStore, passphrase);
context.init(keyMngFactory.getKeyManagers(), null, null);
SSLSocketFactory sslScktFactory = context.getSocketFactory();
- 我认为问题在于我没有
.custom()
新库下的上下文方法。
新的 SSLSocketFactory 使用什么? - 是不是 JKS 密钥库没有存储在其中的私钥的内部密码(我直到现在才使用 PKCS,不熟悉 JKS 格式),这就是为什么我看不到私钥密码被引用的原因至?