【问题标题】:Using a specific Security Provider in Java在 Java 中使用特定的安全提供程序
【发布时间】: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)

将我自己的提供者添加到第一个位置就足够了吗?

【问题讨论】:

    标签: java android security ssl


    【解决方案1】:

    经过数小时的研究,我终于知道如何设置应首选的提供商。在 Oracle 的提供者文档中,关于 Installing Providers 的部分中提到了它:

    security.provider.n=masterClassName

    这声明了一个提供者,并且 指定其偏好顺序 n。优先顺序是 在哪些提供者中搜索请求的算法(如果没有 要求提供特定的供应商)。顺序是从1开始的:1是最多的 首选,其次是 2,依此类推。”

    无论如何,我决定不实施和注册我自己的提供者。真的是很多开销。我想我会通过使用 OpenSSL 或其他方式在 c++ 中手动保护套接字。

    您可能还会发现有用的链接:

    • JuiCE Apache OpenSSL JCE 提供程序(2007 年退休)。你绝对不应该使用他们的实现,它绝对已经过时了。但是查看代码将清楚实现自己的提供者需要做多少工作。无论如何,您还需要一个 JSSE 提供程序。

    • Sun Provider源代码,可以让你了解SUN如何集成加密功能(JCE和JSSE Provider)

    • OWASP Tutorial for using JSSE - Java 安全套接字扩展。其中显示了如何使用提供程序。

    • JSSE Reference Guide 提供更多有用信息

    编辑:只有在应用程序中实现所有请求的服务(或引擎)时,才能确保使用了您的提供程序。如果您调用服务提供商未提供的功能,java 将选择下一个提供该服务的可用(根据隐式优先顺序)服务提供商(您可能不会注意到它)。

    【讨论】: