- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有关如何使用 Java 处理自签名证书的问题已被多次询问,并且通常会提供实现。但是,我不确定这些实现是否会给我所寻求的安全/信任。
我的情况如下:我有一个客户端程序连接到我们的服务器应用程序。这两个我们都可以完全控制。我们的客户端使用 https 将流发布到我们服务器上的 URL,然后服务器响应。目前(这就是我要修复的问题)服务器有一个自签名证书。 Java 不喜欢这样,并且仅用于测试,我们几乎完全忽略证书而完全信任任何证书。
我对 SSL 知之甚少。我的老板说我们可以使用我们的自签名证书,只要我们不进行加密,它就会很安全。关键公众。这对我来说听起来是正确的,但是很多帖子都说自签名证书自动容易受到中间人攻击。这是否意味着 SSL 发送 crypt. key 连同证书?
既然我们控制了两端,我们是否应该只用 key 自己加密我们的数据,并在最后使用我们的 key 解密?还是有理由使用 SSL?
最佳答案
不要盲目地信任任何证书(这会使连接容易受到 MITM 攻击),而是将您的 Java 客户端配置为信任该特定证书。自签名证书本身并不会使 SSL/TLS 连接容易受到 MITM 攻击,它们只是使它们的分发和信任评估更加特定于此特定部署(即您必须手动配置)。
您至少可以通过 3 种方式完成此操作(选择对您来说最简单的一种,我建议要点 #2):
lib/security/cacerts
)。这将使使用此 JRE 运行的所有应用程序都信任此证书。lib/security/cacerts
的本地副本)并让这个特定的应用程序使用这个信任库。这可以使用 javax.net.ssl.trustStore
来完成系统属性。SSLContext
用 X509TrustManager
初始化配置为信任该证书:手动编写的证书或来自 TrustManagerFactory
的信任管理器通过加载包含该特定证书的本地 keystore 进行初始化(与之前的方法一样)。您将在 JSSE Reference Guide 中找到有关所有这些的更多详细信息.
(This answer to a similar question 应该为您提供正确执行所有这些操作的详细信息,特别是 keytool -import ...
。)
关于encryption - 需要有关自签名 SSL 和 Java 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11978010/
我是一名优秀的程序员,十分优秀!