我正在开发一个HTTPS服务,它将部署在具有自签名证书的服务器上,并且客户端将接受所有证书 . 我是SSL新手 .
我已经浏览了this post和this post,并了解如何配置信任管理器以接受所有证书 .
如果我理解正确,java客户端将使用服务器的公钥(使用服务器的公共证书安装)来加密要发送到服务器的数据 . 然后服务器使用它的私钥来解密数据 .
我的问题是:
1.在一个常见的场景中,我们在客户端机器的信任库中安装server.cer(java中的cacerts) . java客户端代码如何链接到此已安装的公钥以在与此类服务器通信时加密数据?谁在这里进行SSL加密?它是Java API还是我必须在将数据发送到服务器之前在我的客户端代码中处理加密?
2.如上述一篇文章所述,我们可以让客户接受所有证书 . 加密和解密如何在这种情况下工作?客户端如何知道用于加密的公钥,因为我们没有在客户端的信任库中安装任何特定于服务器的密钥?
我正在寻找更多技术细节 .
1 回答
显然 . 你_浪费时间 . 您也可以根本不使用SSL . 客户端应接受此证书和所有CA证书,而不是所有证书 . 如上所述,您的系统容易受到中间人攻击 .
你没有 . 它没有 . 证书用于验证服务器的身份,但SSL加密通过秘密协商的会话密钥对称,与证书中的公钥无关 .
没有 .
通常通过
javax.net.ssl.trustStore
属性,但它不再用于加密,仅用于身份验证 .是 . 它由
HttpsURLConnection
使用javax.net.ssl.SSLSocket.
完成没有 .
你可以,但它根本不安全,不应该这样做 .
如上所述,你在这里有一个误解,但当你接受所有证书时,你不知道你在跟谁说话,所以任何加密都是毫无意义的 . 不要这样做 .