Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中进行相互SSL身份验证_Java_Ssl_Mutual Authentication - Fatal编程技术网

如何在java中进行相互SSL身份验证

如何在java中进行相互SSL身份验证,java,ssl,mutual-authentication,Java,Ssl,Mutual Authentication,我想用java代码进行相互SSL身份验证,但没有成功,我有key.pem和cert.pem文件来进行身份验证,我用Curl进行了尝试 curl-X POST-d'{Channel:..}'-H内容类型:application/json-H Auth1:**-H Auth2:**-k https://********/webservices/json/Default.aspx-cert cert.pem-key key.pem 它工作得很好,然后我尝试创建java程序引用 但服务器返回缺少的证书。

我想用java代码进行相互SSL身份验证,但没有成功,我有key.pem和cert.pem文件来进行身份验证,我用Curl进行了尝试

curl-X POST-d'{Channel:..}'-H内容类型:application/json-H Auth1:**-H Auth2:**-k https://********/webservices/json/Default.aspx-cert cert.pem-key key.pem

它工作得很好,然后我尝试创建java程序引用 但服务器返回缺少的证书。我也试着用这段代码创建p12、crt和jks文件,正如上面的链接所说,但仍然得到相同的错误证书丢失。 这是工作节点的示例:

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();

请在这方面帮助我。

我只是想回忆一些事情,也许可以完成你的清单。我不能给出一个完整的例子。我假定您同时控制客户端和服务器代码。或者至少是客户端代码,以及服务器配置的完全调优

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

1-确保服务器端在serverhello中发送接受客户端证书或要求客户端证书。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-一旦您可以信任您的客户端行为,您可以尝试连接到https服务器,如tomcat或jetty我不知道您使用的是什么,然后通过java客户端在sslsocket上发送一个粗略的GET


6-当这起作用时,现在您可以将sslsocketfactory传递给许多http[s]堆栈smtp、HttClient,甚至核心jdk httpurlconnection。

我认为您需要Intermediate证书文件将所有证书连接到一个PEM文件中,如cat intermediate-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作为密钥库使用密码。它应该会起作用

谢谢你的回复。我们无法控制服务器。所以我们无法检查它是否接受我们的jks文件。我们可以直接将pem文件发送到服务器吗?我已经用node.js检查过了,它也正在通过直接在请求中发送pem文件与nodeJS一起工作。请查找附件中的nodeJS代码以供参考。我已经编辑了我的帖子,并在那里添加了nodeJS示例。请检查一下