首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDK11 HttpClient相互tls

JDK11 HttpClient相互tls
EN

Stack Overflow用户
提问于 2020-07-22 04:19:46
回答 1查看 1.8K关注 0票数 1

我想用new HttpClient provided in java 11。不清楚如何进行相互TLS (双向身份验证,其中客户端和服务器都提供证书)。

谁能提供一个使用HttpClient的双向TLS的例子?

EN

回答 1

Stack Overflow用户

发布于 2020-07-25 03:41:07

我想通了。创建一个HttpClient,然后传入SSLContext和SSLParameters对象。

将证书/密钥加载到SSLContext中:

代码语言:javascript
复制
 // 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:

代码语言:javascript
复制
SSLParameters sslParam = new SSLParameters();
sslParam.setNeedClientAuth(true);

最后,创建HttpClient:

代码语言:javascript
复制
HttpClient client = HttpClient.newBuilder()
    .sslContext(sslCtx)
    .sslParameters(sslParam)
    .build();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63022464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档