我試圖了解如何配置 Web 客戶端。我所擁有的是一個作業卷曲,我無法通過(任何)Java HTTP 客戶端將其轉換為有效的 HTTPS 請求。卷曲是:
curl -s --cert $CERTIFICATE --key $KEY https.url
其中 $CERTIFICATE 是一個.crt
檔案,其中包含:
----BEGIN CERTIFICATE----
....
----END CERTIFICATE-----
$KEY 是一個.key
檔案,其中包含:
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
我想將此 curl 轉換為有效的 JAVA 請求。目前,我正在以這種方式配置 Spring WebClient:
private WebClient getWebClient() throws SSLException {
SslContext sslContext = SslContextBuilder.forClient().keyManager(
Paths.get(properties.getCrtFile()).toFile(),
Paths.get(properties.getKeyFile()).toFile(),
properties.getCertKeyPassword()).build();
HttpClient httpClient = HttpClient.create().secure(t -> t.sslContext(sslContext));
return WebClient
.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient)).build();
}
但是當我使用 webclient 發出請求時,它回傳一個錯誤:
exception: File does not contain valid private key:
知道錯誤在哪里嗎?
uj5u.com熱心網友回復:
這就是我解決問題的方法:
- 驗證
.cert
和.key
檔案是否有效:
openssl x509 -noout -modulus -in certFile.crt | openssl md5
#> (stdin)= 7f1a9c4d13aead7fd4a0f241a6ce8
和
openssl rsa -noout -modulus -in certKey.key | openssl md5
#> (stdin)= 7f1a9c4d13aead7fd4a0f241a6ce8
- 將我的
.cert
和.key
檔案轉換成PCKS12
Java可以理解的。(請記住,我的證書和密鑰檔案采用 PEM 格式,如問題中所述)。我使用了以下命令:
openssl pkcs12 -export -in certFile.crt -inkey keyFile.key -out cert.p12
此步驟將提示您輸入密碼。我們將在將證書讀入 KeyStore 時使用此密碼。
- 通過讀取證書創建 SSLContext:
private SslContext getSSLContext() {
try (FileInputStream keyStoreFileInputStream = new
FileInputStream("pathTop12CertificateFile")) {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(keyStoreFileInputStream,"password".toCharArray());
KeyManagerFactory keyManagerFactory =
KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keyStore, "password".toCharArray());
return SslContextBuilder.forClient()
.keyManager(keyManagerFactory)
.build();
} catch (Exception e) {
log.error("An error has occurred: ", e);
}
return null;
}
- 使用這個 SSLContext 構建一個 Spring WebClient:
private WebClient getWebClient() {
HttpClient httpClient = HttpClient.create().secure(sslSpec -> sslSpec.sslContext(getSSLContext()));
ClientHttpConnector clientHttpConnector = new ReactorClientHttpConnector(httpClient);
return WebClient
.builder()
.clientConnector(clientHttpConnector)
.build();
}
現在我們可以使用 WebClient 來發出我們的 HTTP 請求。
uj5u.com熱心網友回復:
根據您提供的詳細資訊,我了解到SslContextBuilder
無法理解您的密鑰型別。
嘗試使用以下命令將非加密密鑰轉換為 PKCS8。
openssl pkcs8 -topk8 -nocrypt -in pkcs1_key_file -out pkcs8_key.pem
此外,請參閱https://netty.io/4.0/api/io/netty/handler/ssl/util/InsecureTrustManagerFactory.html中的示例,該示例無需驗證即可接受所有 X.509 證書,包括那些自簽名的證書。
也在https://groups.google.com/forum/#!topic/grpc-io/5uAK5c9rTHw討論
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/507063.html