java - JDK11 HttpClient 双向 tls

标签 java ssl java-11 java-http-client

我正在寻找使用 new HttpClient provided in java 11 .目前尚不清楚如何进行双向 TLS(2 路身份验证,客户端和服务器都提供证书。)
有人可以提供一个带有 HttpClient 的双向 TLS 示例吗?

最佳答案

弄清楚了。创建一个 HttpClient,然后传入 SSLContext 和 SSLParameters 对象。
将证书/ key 加载到 SSLContext:

 // cert+key data. assuming X509 pem format
final byte[] publicData = your_cert_data; // -----BEGIN CERTIFICATE----- ...
final byte[] privateData = your_key_data; // -----BEGIN PRIVATE KEY----- ...

// parse certificate
final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
final Collection<? extends Certificate> chain = certificateFactory.generateCertificates(
        new ByteArrayInputStream(publicData));

LOG.info("Successfully loaded the client cert certificate chain {}", String.join(" -> ", chain
        .stream()
        .map(certificate -> {
            if (certificate instanceof X509Certificate) {
                final X509Certificate x509Cert = (X509Certificate) certificate;
                return x509Cert.getSubjectDN().toString();
            } else {
                return certificate.getType();
            }
        }).collect(Collectors.toList())));

// parse key
final Key key = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(privateData));

// place cert+key into KeyStore
KeyStore clientKeyStore = KeyStore.getInstance("jks");
final char[] pwdChars = KEYSTORE_PASSWORD.toCharArray(); // use a random string, like from java.security.SecureRandom
clientKeyStore.load(null, null);
clientKeyStore.setKeyEntry(YOUR_SERVICE_NAME, key, pwdChars, chain.toArray(new Certificate[0]));

// initialize KeyManagerFactory
KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509");
keyMgrFactory.init(clientKeyStore, pwdChars);

// populate SSLContext with key manager
SSLContext sslCtx = SSLContext.getInstance("TLSv1.2");
sslCtx.init(keyMgrFactory.getKeyManagers(), null, null);
创建ssl参数,设置needClientAuth为true:
SSLParameters sslParam = new SSLParameters();
sslParam.setNeedClientAuth(true);
最后,创建 HttpClient:
HttpClient client = HttpClient.newBuilder()
    .sslContext(sslCtx)
    .sslParameters(sslParam)
    .build();

关于java - JDK11 HttpClient 双向 tls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63022464/

相关文章:

java - Arrays.asList(int_array).indexOf(int_element) 即使元素存在 java 也返回 -1

java - Oracle Webcenter Spaces 和 Internet Explorer 9

SSL 在深度 1 : Self signed certificates in certificate chain 验证证书错误或警告

java - 进行提取方法重构后,代码变慢了 6 倍

java - Tomcat 没有为其内部日志记录选择 Log4j 配置

单例作用域类方法中的 Java 线程安全

ssl - 网址拦截机器人

Facebook 调试器不使用 SSL 证书抓取页面

java - 如何将方法 StageHelper.getStages() 从 java 1.7 替换为 java 11

java - 可以编译较新的 Java 版本(9、10、11)以在较旧的平台(例如 Java 8)上运行吗?