一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 利用Java實現mTLS調用

利用Java實現mTLS調用

2022-03-11 00:47banq Java教程

這篇文章主要介紹使用 Java作為客戶端 與受 mTLS 保護的服務交互。為了對我們的 Java 客戶端進行 ssl 配置,我們需要先設置一個 SSLContext。這簡化了事情,因為 SSLContext 可用于各種 http 客戶端,接下來我們一起進入下面文章了解具體內

本文將使用 Java作為客戶端 與受 mTLS 保護的服務交互。

為了對我們的 Java 客戶端進行 ssl 配置,我們需要先設置一個 SSLContext。這簡化了事情,因為 SSLContext 可用于各種 http 客戶端。

由于我們有客戶端公鑰和私鑰,我們需要將私鑰從 PEM 格式轉換為 DER。

?
1
openssl pkcs8 -topk8 -inform PEM -outform PEM -in /path/to/generated/client.key -out /path/to/generated/client.key.pkcs8 -nocrypt

下一步是將客戶端密鑰加載到 Java 代碼中并創建一個 KeyManagerFactory:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
String privateKeyPath = <font>"/path/to/generated/client.key.pkcs8"</font><font>;
String publicKeyPath = </font><font>"/path/to/generated/client.crt"</font><font>;
 
<b>final</b> byte[] publicData = Files.readAllBytes(Path.of(publicKeyPath));
<b>final</b> byte[] privateData = Files.readAllBytes(Path.of(privateKeyPath));
 
String privateString = <b>new</b> String(privateData, Charset.defaultCharset())
        .replace(</font><font>"-----BEGIN PRIVATE KEY-----"</font><font>, </font><font>""</font><font>)
        .replaceAll(System.lineSeparator(), </font><font>""</font><font>)
        .replace(</font><font>"-----END PRIVATE KEY-----"</font><font>, </font><font>""</font><font>);
 
byte[] encoded = Base64.getDecoder().decode(privateString);
 
<b>final</b> CertificateFactory certificateFactory = CertificateFactory.getInstance(</font><font>"X.509"</font><font>);
<b>final</b> Collection<? <b>extends</b> Certificate> chain = certificateFactory.generateCertificates(
        <b>new</b> ByteArrayInputStream(publicData));
 
Key key = KeyFactory.getInstance(</font><font>"RSA"</font><font>).generatePrivate(<b>new</b> PKCS8EncodedKeySpec(encoded));
 
KeyStore clientKeyStore = KeyStore.getInstance(</font><font>"jks"</font><font>);
<b>final</b> <b>char</b>[] pwdChars = </font><font>"test"</font><font>.toCharArray();
clientKeyStore.load(<b>null</b>, <b>null</b>);
clientKeyStore.setKeyEntry(</font><font>"test"</font><font>, key, pwdChars, chain.toArray(<b>new</b> Certificate[0]));
 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(</font><font>"SunX509"</font><font>);
keyManagerFactory.init(clientKeyStore, pwdChars);

在上面的片段中

  • 我們從文件中讀取字節。
  • 我們從公鑰創建了一個證書鏈。
  • 我們使用私鑰創建了一個密鑰實例。
  • 使用鏈和密鑰創建了一個密鑰庫
  • 創建了一個 KeyManagerFactory

現在我們已經創建了一個 KeyManagerFactory 我們可以使用它來創建一個 SSLContext

由于使用自簽名證書,我們需要使用接受它們的 TrustManager。在此示例中,信任管理器將接受服務器提供的所有證書。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TrustManager[] acceptAllTrustManager = {
                <b>new</b> X509TrustManager() {
                    <b>public</b> X509Certificate[] getAcceptedIssuers() {
                        <b>return</b> <b>new</b> X509Certificate[0];
                    }
 
                    <b>public</b> <b>void</b> checkClientTrusted(
                            X509Certificate[] certs, String authType) {
                    }
 
                    <b>public</b> <b>void</b> checkServerTrusted(
                            X509Certificate[] certs, String authType) {
                    }
                }
        };

然后ssl上下文初始化。

?
1
2
SSLContext sslContext = SSLContext.getInstance(<font>"TLS"</font><font>);
sslContext.init(keyManagerFactory.getKeyManagers(), acceptAllTrustManager, <b>new</b> java.security.SecureRandom());

客戶端代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HttpClient client = HttpClient.newBuilder()
                                     .sslContext(sslContext)
                                     .build();
 
 
 
       HttpRequest exactRequest = HttpRequest.newBuilder()
                                     .uri(URI.create(<font>"https://127.0.0.1"</font><font>))
                                     .GET()
                                     .build();
 
       <b>var</b> exactResponse = client.sendAsync(exactRequest, HttpResponse.BodyHandlers.ofString())
                                 .join();
       System.out.println(exactResponse.statusCode());

我們將收到一個 404 代碼,這意味著我們的請求成功進行了 mTLS 握手。

注意:如果服務器端是使用本地 Nginx 服務,我們需要禁用主機名驗證。

?
1
2
<b>final</b> Properties props = System.getProperties();
props.setProperty(<font>"jdk.internal.httpclient.disableHostnameVerification"</font><font>, Boolean.TRUE.toString());

在其他客戶端中,這可能需要設置一個接受所有連接的 HostVerifier

?
1
2
3
4
5
HostnameVerifier allHostsValid = <b>new</b> HostnameVerifier() {
    <b>public</b> <b>boolean</b> verify(String hostname, SSLSession session) {
        <b>return</b> <b>true</b>;
    }
};

到此這篇關于利用Java實現mTLS調用的文章就介紹到這了,更多相關Java實現mTLS調用內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.jdon.com/57481

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 黄a 大片a v 永久免费 | 99这里精品 | 亚洲国产精品久久人人爱 | 日韩av线观看 | 肉文np高h| 亚洲国产精品综合欧美 | 韩国丽卡三级作品 | 教练你好大轻点漫 | 国产免费精彩视频 | 成年人福利视频 | 四虎永久成人免费 | 亚洲国产精品福利片在线观看 | 免费在线观看小视频 | 国产成人小视频在线观看 | 日本激情网| 四虎黄色影视 | 免费国产好深啊好涨好硬视频 | 国产成人咱精品视频免费网站 | 国产中文视频 | 倩女还魂在线观看完整版免费 | 九九大香尹人视频免费 | 亚洲欧洲日产国码天堂 | 草莓在线 | 2020年新四虎免费 | 国产无套在线播放 | 成人国产精品 | 欧美sex另类孕妇 | xxxx性欧美极品另类 | 亚洲女性色尼古综合网 | 日韩欧美推理片免费看完整版 | 精品久久洲久久久久护士免费 | 暗卫调教女主肉高h | 日韩在线一区二区三区免费视频 | 欧美一区二区三区四区在线观看 | 亚洲 欧美 国产 综合久久 | 羞羞视频免费观 | 日本妇人成熟免费不卡片 | 狠狠色婷婷 | 小柔的性放荡羞辱日记动漫 | 满城尽带黄金甲大胸片 | 久草在在线免视频在线观看 |