【发布时间】:2024-04-28 02:25:02
【问题描述】:
我目前正在编写一个小型 Android 库,它应该能够与远程 JavaEE 服务器进行安全通信。它将使用HttpsURLConnection 并在服务器端调用特定的servlet(因为我只提供android 库我不知道服务器端的实现)。这种通信应该尽可能安全(没有什么是 100% 安全的)。因此,我不想完全依赖服务器和客户端之间的协议协商——只是希望他们会选择当前的 TLS 版本。如果服务器不支持安全协议,则连接应该是不可能的(例如,我不想支持 SSL3.0 或更低版本)。
我知道我可以通过编写自己的SSLSocketFactory 来定义密码套件。但也很高兴知道应用程序将选择哪个安全提供程序(了解我的应用程序的通信是否受到特定于提供程序的安全问题的影响)。绝对可以添加一个新的提供者。
但是还有一种方法可以强制 java 仅使用我选择的提供程序 xy(充气城堡或太阳除外)吗?也许是自己实现的 OpenSSL 提供程序?
更新:我在 oracles provider documentation 中找到了以下语句:
“程序可以简单地请求实现特定服务(例如 DSA 签名算法)的特定类型的对象(例如 Signature 对象)并从已安装的提供者之一获取实现。如果需要,相反,程序可能会向特定提供者请求实施。”
和下面的例子:
md = MessageDigest.getInstance("MD5", "ProviderC");
因此可以定义应该为 MessageDigest 使用哪个提供程序。但是 HttpsURLConnection 功能是否有相同的选项?
编辑:经过更多研究,我发现在Security 中可以在特定位置添加提供程序。
public static int insertProviderAt(myProvider, position)
将我自己的提供者添加到第一个位置就足够了吗?
【问题讨论】: