java - 通过默认 SSLSocketFactory 创建的 Socket 发送密码是否安全?
问题描述
不假思索,我通过使用JavaSocket
默认创建的连接发送了一个密码。SSLSocketFactory
对于SSLSocketFactory.getDefault()
,文档说明如下:
返回默认的 SSL 套接字工厂。第一次调用此方法时,
ssl.SocketFactory.provider
会检查安全属性。如果它不为 null,则加载并实例化具有该名称的类。如果成功并且对象是 的实例SSLSocketFactory
,则将其设为默认 SSL 套接字工厂。否则,此方法返回
SSLContext.getDefault().getSocketFactory()
. 如果该调用失败,则返回一个不工作的工厂。
我确信 Java 并没有试图欺骗我,但由于这是我第一次这样做,我想确保它是我可以依赖的密码加密的东西。
编辑:在服务器响应中“Set-Cookie”的属性数据的末尾,它显示“HttpOnly”,然后是“Secure”。我假设这意味着服务器已经确认连接是安全的,但我不是 100% 确定。
解决方案
当您通过 default 创建套接字SSLSocketFactory
并且不使用相关系统和安全属性配置任何其他内容时,将使用与您的 Java 运行时捆绑的一组证书颁发机构。忽略一些细节,这是在您的 JRE 安装中找到的信任库,位于lib/security/cacerts
. 这些证书包括那些被广泛接受的证书颁发机构的证书,类似于您的浏览器可能使用的列表。
因此,如果您连接的服务器使用通过这些知名机构之一颁发的证书,则该证书将被验证,否则连接将失败。
这可确保受信任的权威机构认证您所连接的一方的身份。只要他们的私钥没有被盗,您就可以依赖证书中绑定的名称。
但是,您需要验证主机名以确保服务器提供的证书与您期望的主机名匹配。这在您使用该类时会自动发生URL
,但您需要在直接HostNameVerifier
使用时显式设置SSLSocket
。
最后,即使您知道自己在与谁交谈,您仍然必须对您向他们披露的信息进行判断。不过,这不是技术问题。
推荐阅读
- javascript - 以 60fps 运行功能
- reactjs - 下一个/动态中的悬念选项使用无效
- amazon-s3 - 如何自动导出架构并将其上传到 S3 存储桶并删除 AWS oracle RDS 中的旧转储
- java - 我缺少什么来完成 Coursier scala 开发环境设置?
- mysql - Golang正确发送带有状态的json响应的方法
- python - 拉丁字符的 Python Unicode 转换
- c++ - 不显示任何输出
- javascript - gridstack 没有得到最合适的行(0)和第二行(1)
- java - 如何在 Apache Camel 中创建 Excel (.xlsx) 文件?
- c++ - 自制数组减少中的性能异常