【问题标题】:Can an unsigned applet talk to a CA-certified SSL server?未签名的小程序可以与 CA 认证的 SSL 服务器通信吗?
【发布时间】:2011-03-02 01:21:07
【问题描述】:

我们有一个未签名的小程序与流服务器(不是 HTTPS,只是套接字套接字,但这并不重要)对话。使用普通的 TCP/IP 一切都很好,但是当我尝试照常使用 SSL 时:

SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(host, port);

// initiate the handshake (blocks)
sslsocket.getSession();

我在握手过程中遇到异常。为了便于开发和测试,我作为应用程序运行,但仍然出现异常。

将证书添加到密钥库可以解决此问题,但我们希望部署到数千个客户端,无需人工干预。

已经在网上搜索了好几天 - 每次提到都以“将证书添加到密钥库”结尾,但通常与自签名证书有关。在这种情况下,我们有一个 pukka 证书(一个试用版,但在 Java 的 CA 列表中 - 具体来说是数字证书)。

简而言之,Applet 是否可以将 SSL 与具有 CA 签名证书的服务器进行通信,而无需将该证书添加到密钥库?

想到的一个想法是在包含小程序的 JAR 中添加证书或密钥库。未签名的小程序可以读取和安装这样的证书/密钥库吗?

谢谢,

【问题讨论】:

  • 有点晚了......如果这仍然没有解决,你能发布你的异常堆栈跟踪吗? (我会感兴趣这里的问题是什么。)

标签: java ssl applet


【解决方案1】:

将 SSL 与证书一起使用的想法是,我(在本例中为小程序)可以确定我在说谁 - 没有中间人试图拦截我。为此,我有必要已经拥有我信任的人的一些证书,该人反过来证明服务器的身份。

此证书可以位于 Java 插件的密钥库(或 JRE 或用户密钥库)中,或者您可以为自己的密钥库提供 SSL 引擎的可信密钥,如下所示(来自my project 的源代码副本,因此与德国 cmets):

public class SSLHelper
{

   ...

    /**
     * Initialisiert die Client-SocketFactory.
     */
    private void initClient()
        throws KeyStoreException, NoSuchAlgorithmException,
               KeyManagementException, IOException,
               CertificateException
    {
        // die Namen für getInstance() sind aus diesem Dokument:
        //   http://java.sun.com/javase/6/docs/technotes/guides/security/StandardNames.html
        KeyStore keystore = KeyStore.getInstance("jks");
        keystore.load(SSLHelper.class
                      .getResourceAsStream("client-keystore.jks"),
                      null);
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
        tmf.init(keystore);
        SSLContext kontext = SSLContext.getInstance("TLS");
        kontext.init(null, tmf.getTrustManagers(), null);

        clientFactory = kontext.getSocketFactory();
    }
}

这样,SSL 客户端可以将发送的证书与给定密钥库中的证书进行比较,如果有些匹配,则接受连接。 (我们在此处提供了我们的私有 CA 的自签名证书,该证书也对服务器密钥进行了签名。)

当然,这只是转移了基本问题:现在您必须确保您的小程序(即 jar 中的密钥库)在执行前没有被中间人修改,而不是确保每个人都有已安装正确的证书。因此,您应该只使用 HTTPS(并且从 HTTPS 页面)交付您的小程序,以获得最大的安全性。

【讨论】:

  • 非常感谢 - 我似乎误会了什么。我们有一个由商业 CA (digicert) 签署的证书,他们非常有帮助。它适用于浏览器,就像浏览器的根 CA 列表中一样。根据 -Djavax.net.debug=all 它也在 Java 的列表中,所以如果可以找到证书链,那么肯定不需要将其添加到密钥库吗?是的,小程序页面和小程序是通过 HTTPS 交付的。我相当确定我已经正确设置了证书链。如果我有,最终用户是否能够在没有任何干预的情况下下载和运行小程序 - 包括 SSLsocket?
【解决方案2】:

我没有遇到过部署“将小程序与 SSL 对话到具有 CA 签名证书的服务器”的情况,但我遇到过类似的情况,即部署需要签名以允许操作的 Java Webstart 应用程序脱离沙箱(在客户端机器上写入和读取文件);我们必须将其部署给数十个客户。

如果我没记错的话,这个过程并不难(你可以google一下)。您可以创建自己的证书,但有些人会对有关“未知来源”签名的证书的警告感到恼火。

最好使用众所周知的 CA 机构,例如 VeriSign 或 Thawte。 CA 的价格差异很大,尽管它们提供相同的东西:证书。

威瑞信是所有 CA 中最著名的,也是最昂贵的。如果您与他们联系,他们将帮助您并指导您完成整个过程,并提供出色的技术支持。例如,他们提供有关适当的加密强度、如何在您的小程序、服务器中安装等信息。此外,您可以将他们的徽标放在您的网站上,他们会向您发送 T 恤、漂亮的日历和其他好东西每年:)

其他供应商(例如 Thawte)比 Verisign 便宜得多(有时是一半或更少)。我没有和他们合作过,所以我不知道他们的服务质量如何。

顺便说一句:域和子域与证书匹配非常重要。如果您请求域 www.mydomain.com 的证书并尝试从 www2.mydomain.com 加载小程序,它将无法正常工作。 Verisign 和其他公司为多个或无限的子域提供特别的价格。

我希望这会有所帮助。保重,

路易斯

【讨论】:

  • 谢谢。出于兴趣,Mark Shuttleworth 创办了 Thawte 并将其卖给了威瑞信——这就是他的财富来源!请参阅en.wikipedia.org/wiki/Mark_Shuttleworth - 所以 Verisign 和 Thawte 是一回事,但后者的品牌声望较低;-) 我们从 digisign 获得了证书 - 它们更便宜且非常有用。在服务器上安装证书没有问题。当我连接浏览器时,没有出现警告对话框 - CA 位于浏览器的受信任根集合中。它也在 Java 的受信任 CA 列表中 - 它与调试选项一起出现 -Djavax.net.debug=all
猜你喜欢
  • 2018-11-29
  • 2014-06-07
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
相关资源
最近更新 更多