【发布时间】:2021-02-15 10:12:32
【问题描述】:
我是设置证书的新手,端点需要 I.CA 颁发的有效证书。我有一个带有密码的 .pfx,可以从 Postman 的端点获取数据。但是,我无法从在 localhost:8080 上运行的本地服务器实现相同的目标。
我使用的是 okhttp 4.7.2 版
这是我正在使用的代码的细分,加载不会导致任何错误,仅用于调整演示代码。我在密钥库中有 38 个提供程序,并且只有我加载的 keystoreSpi 下的证书。密钥和证书都不为空,并且似乎包含证书。端点只返回一个 403 (根据文档意味着授权标头('x-api-key'、'Authorization' 或 'x-client-cert')无效。)因为我与 Postman 确认了 api 密钥和令牌是有效的(令牌流正在工作),它可能只是缺少的证书。但我不知道该请求还缺少什么。
KeyStore keystore = KeyStore.getInstance("PKCS12");
try (InputStream is = Files.newInputStream(Paths.get("filepath\\cert.pfx"))) {
keystore.load(is, "password".toCharArray());
} catch (Exception e) {
LOG.error(e.getMessage());
}
String alias = "myAlias";
Key key = keystore.getKey(alias, "password".toCharArray());
Certificate cert = keystore.getCertificate(alias);
PublicKey publicKey = cert.getPublicKey();
HeldCertificate heldCertificate = new HeldCertificate.Builder()
.keyPair(new KeyPair(publicKey, (PrivateKey) key))
.build();
HandshakeCertificates handshakeCerts = new HandshakeCertificates.Builder()
.addPlatformTrustedCertificates()
.heldCertificate(heldCertificate)
.build();
OkHttpClient client = new OkHttpClient().newBuilder().sslSocketFactory(handshakeCerts.sslSocketFactory(), handshakeCerts.trustManager())
.build();
Request request = new Request.Builder()
.url("https://apiendpoint/name")
.method("GET", null)
.addHeader("x-api-key", "Bearer apiKey")
.addHeader("x-correlation-id", "corId")
.addHeader("Authorization", "Bearer " + accessToken.getAccessToken())
.build();
Response response = client.newCall(request).execute();
编辑
我将 response.handshake().peerPrincipal().getName() 作为 CN 我必须集成的端点的名称。但是 response.handshake().localPrincipal().getName() 为空。如何设置 localPrincipal 以包含我加载的证书。
这是成功的邮递员调用。
【问题讨论】:
标签: java ssl x509certificate okhttp