【问题标题】:How to do mutual SSL authentication in java如何在java中进行相互SSL身份验证
【发布时间】:2020-02-29 12:49:45
【问题描述】:

我想使用 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"

它工作正常,然后我尝试创建 java 程序引用 Send https request in java using .pem file 但服务器返回“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();

请帮帮我。

【问题讨论】:

    标签: java ssl mutual-authentication


    【解决方案1】:

    我认为您需要“internediate-cert”文件将所有证书连接到一个 PEM 文件中,例如 cat "internediate-cert.pem" "codika_cert.pem" "Key.pem" > full-chain.keycert.pem 然后使用别名和密码生成 PKCS12(.p12) 密钥库 Like pkcs12 -export -in "full-chain.keycert.pem" -out full-chain.keycert.p12 -name alias -noiter -nomaciter 然后使用 full-chain.keycert.p12 作为 KeyStore 和密码。它应该工作。

    【讨论】:

      【解决方案2】:

      我只是想试着回忆一些事情来完成你的清单。我不能举一个完整的例子。我假设您同时控制客户端和服务器代码。或者至少是客户端代码,以及服务器配置的全面调整。

      0-使用wireshark查看发生了什么。

      1-确保您的服务器端在 serverhello 中发送 accept-client-cert 或 requires-client-cert。 Curl 可能只是因为服务器没有“要求”它,而只是请求它。

      2-确保服务器信任您的客户端证书签名者。这意味着如果您在测试时要制作自签名客户端证书,有时会破解服务器的证书颁发机构 (CA) 存储。

      3-使用wireshark,观察ssl/tls 对话框并验证clienthello 和serverhello 是否符合预期(主要是如果serverhello 确实请求/要求客户端身份验证并且客户端甚至尝试发送它)。如果有的话,那是很有教育意义的。

      4-使用自下而上的 jsse 教程编写琐碎的代码。制作代码 kata 以查看密钥库/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)。

      【讨论】:

      • 感谢您的回复。我们无法控制服务器。所以我们不检查它是否接受我们的 jks 文件。我们可以将 pem 文件直接发送到我用 node.js 检查过的服务器吗?它也可以通过直接在请求中发送 pem 文件来与 nodeJS 一起工作。请找到附加的nodeJS代码以供参考
      • 我已经编辑了我的帖子并在那里添加了 NodeJS 示例。请检查一下
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多