簡體   English   中英

如何在java中進行相互SSL認證

[英]How to do mutual SSL authentication in java

我想使用 java 代碼進行相互 SSL 身份驗證,但我沒有成功 我有key.pemcert.pem文件來進行身份驗證我已經嘗試過使用 Curl

curl -X POST -d '{ "Channel": "....}' -H "Content-Type: application/json" -H "Auth1: ***" -H "Auth2: ***" -k https://******/webservices/JSON/Default.aspx --cert "cert.pem" --key "Key.pem"

並且它工作正常然后我嘗試使用.pem文件在java中創建java程序引用發送https請求但服務器返回“CERT_MISSING”。 我也嘗試過使用此https://www.naschenweng.info/2018/02/01/java-mutual-ssl-authentication-2-way-ssl-authentication/這段代碼創建 p12、crt 和 jks 文件,如上鏈接所述但仍然收到相同的錯誤“CERT_MISSING”。 這是有效的 NodeJS 示例:

var https = require("https");
var fs = require("fs");

var jsonData = {
    "Channel": ....
}

var options = {
    hostname: "****",
    port: 443,
    path: '/webservices/JSON/Default.aspx',
    method: 'POST',
    timeout: this.TimeOut,
    headers: {'Content-Type':'application/json',"Auth1": "****","Auth2": "*****"},
    json: true,
    key: fs.readFileSync('Key.pem'),
    cert: fs.readFileSync('cert.pem')
}

var req = https.request(options, function(res) {
    res.on('data', function(data) {
        var response = JSON.parse(data)
            console.log(response)

            req.end();
    });
});
req.on('error', function(e) {
    console.log("ERROR:");

    })


req.write(JSON.stringify(jsonData));
req.end();

請幫助我。

我認為您需要“internediate-cert”文件將所有證書連接到一個 PEM 文件中,例如cat "internediate-cert.pem" "codika_cert.pem" "Key.pem" > full-chain.keycert.pem然后生成 PKCS12( .p12) 帶有別名和密碼的密鑰庫 像pkcs12 -export -in "full-chain.keycert.pem" -out full-chain.keycert.p12 -name alias -noiter -nomaciter然后使用full-chain.keycert.p12作為帶密碼的密鑰庫。 它應該工作。

我只是想試着回憶一些事情來完成你的清單。 我不能舉一個完整的例子。 我假設您同時控制客戶端和服務器代碼。 或者至少是客戶端代碼,以及服務器配置的全面調整。

0-使用wireshark看看發生了什么。

1-確保您的服務器端在 serverhello 中發送 accept-client-cert 或 requires-client-cert。 Curl 可能工作只是因為服務器不是“要求”它,只是請求它。

2-確保服務器信任您的客戶端證書簽名者。 這意味着如果您在測試時制作自簽名客戶端證書,有時會破解服務器的證書頒發機構 (CA) 存儲。

3-使用wireshark,觀察ssl/tls 對話框並驗證clienthello 和serverhello 是否符合預期(主要是如果serverhello 確實請求/需要客戶端身份驗證,並且客戶端甚至嘗試發送它)。 如果有的話,那是很有教育意義的。

4 使用 jsse 教程自下而上編寫瑣碎的代碼。 制作代碼 kata 以查看 keystore/castore 是否在那里,包含您期望的內容。 然后繼續進行安全的 [server]socketfactory 設置、keymanager、trustmanager 和 hostnameverifier(有或沒有有人敢建議的后兩者的危險繞過)。 設置好這 4 個部分后,您就完成了 99%,您的 ssl/tls 套接字應該可以工作了。 通常仍會阻止您進行 ssl/tls 連接的少數事情是不兼容的密碼套件或 tls 版本,或日期無效的證書。 由於您同時控制客戶端和服務器,因此這應該不是問題。

5-一旦您可以信任您的客戶端行為,您可以嘗試連接到像 tomcat 或 jetty 這樣的 https 服務器(我不知道您使用的是什么),並在您的 java 客戶端的 sslsocket 上發送一個粗略的 GET。

6-當它起作用時,現在您可以將您的 sslsocketfactory 傳遞給許多 http[s] 堆棧(smtp、httplient,甚至核心 jdk httpurlconnection)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM