【问题标题】:How do I sign a Java applet for use in a browser?如何签署 Java 小程序以在浏览器中使用?
【发布时间】:2010-10-28 20:50:23
【问题描述】:

我正在尝试在我的网站上部署 Java 小程序。我还需要签名,因为我需要访问剪贴板。我已经按照我能找到的所有签名教程进行操作,但没有取得任何成功。这是我到目前为止所做的:

  • 在 NetBeans 中编写了一个小程序。它在小程序查看器中运行良好。
  • 用它制作了一个 .jar 文件。
  • 通过这样做创建了一个证书:
keytool -genkey -keyalg rsa -alias myKeyName
keytool -export -alias myKeyName -file myCertName.crt
  • 使用 jarsigner 签名,如下所示:
jarsigner "C:\my path\myJar.jar" myKeyName
  • 制作了一个包含以下内容的 html 文件:
<html>
  <body>
<applet code="my/path/name/myApplet.class" archive="../dist/myJar.jar"/>
  </body>
</html>

当我打开那个 html 文件时,我从来没有得到安全确认对话框(因此得到“java.security.AccessControlException: access denied”错误)。这发生在所有浏览器上。

我错过了一步吗?

【问题讨论】:

    标签: java browser applet certificate self-signed


    【解决方案1】:

    三个简单的步骤

    1. keytool -genkey -keystore myKeyStore -alias me

    2. keytool -selfcert -keystore myKeyStore -alias me

    3. jarsigner -keystore myKeyStore jarfile.jar 我

    【讨论】:

    • -keystore myKeyStore 甚至是可选的,不是吗?这样我的小程序就被签名了,但我的剪贴板问题仍然存在。然而最好的 appletsigning (jarsigning) - 我在网上找到的教程。 :)
    【解决方案2】:

    也许是因为您在 jar 文件之外打开了一些 .class 文件?

    这样它可能不会显示警告。我尝试这样做,但它仍然向我显示证书警告,并且对于一个简单的情况,它实际上阻止了我从具有分离类的 JAR 访问一个类。

    也许您的特定设置或文件组织会导致该行为。如果您可以更详细地进行布局,我们可以提供更好的帮助(或者更确切地说,尝试将所有这些 .class 文件放在另一个签名的 Jar 中并将其添加到存档“...,anotherJar.jar”)。

    【讨论】:

    • 我修好了。问题是我的 jar 文件的编译方式与我引用类文件的方式不同。现在可以了。谢谢!
    【解决方案3】:

    首先,我建议您获取有效的代码签名证书。您可以从Thawte 获得免费证书。虽然这些证书通常用于 S/MIME,但它们也适用于代码签名。

    第二个选项是将您的自签名证书导入浏览器正在调用的 JRE 的 cacert 文件中。

    接下来要检查的是确保您的浏览器正在运行最新的 jar。一种方法是始终增加您的版本号。另一个选项是清除 Java 小程序缓存。我通常也会清除浏览器的缓存,但这不是必需的。

    【讨论】:

    • 我相信使用电子邮件证书进行代码签名的问题已经修复。
    • Thawte 已停止使用个人电子邮件证书和信任网络 (WOT) 认证系统
    【解决方案4】:

    你提到:

    当我打开那个 html 文件时,我从来没有得到安全确认对话框...

    您是从本地文件系统打开文件,还是通过 URL 访问托管 HTML 文件和 applet jar 的 Web 服务器?这可能就是您没有收到警告的原因。

    【讨论】:

    • 我正在从本地系统打开。你是说如果在本地打开安全对话框就不会出现?如果这是真的,有没有办法让它出现在本地?这将使测试我的项目变得更加容易。同时,我会去网络服务器上试一下,看看是不是这个问题。
    • 从 Web 服务器访问时仍然无法正常工作。我只需要我的 .class 文件、.jar 文件和 .html 文件,对吗?我需要任何与证书相关的文件吗?
    【解决方案5】:

    这是一种对 jar 进行签名的方法,然后检查所有类文件是否已使用您的密钥库进行签名。

    #!/bin/bash
    KEYSTORE=/home/user/NetBeansProjects/sign/keystore
    FILES=`find /home/user/NetBeansProjects/Project/dist/ -name "*.jar"`
    for f in $FILES; 
       do echo password |  /usr/bin/jarsigner -keystore $KEYSTORE -verbose $f myself;
       echo "Signed $f"; 
      /usr/bin/jarsigner -verify -verbose -certs $f | grep X.509 | sort -u;
    done
    

    【讨论】:

      【解决方案6】:

      编辑:这个答案是历史性的。 JDK9 显然会弃用小程序。在撰写本文时(2017 年 1 月 1 日),您应该签署小程序但不授予它们额外的权限,然后过渡到更新的技术。

      我建议您不要签署代码。如果你在玩弄别人的安全,那么你真的应该知道自己在做什么。

      JTextComponent 应该允许复制和粘贴文本,如果这样就足够了。

      jarsigner -verify 将检查您的 jar 是否已签名。您还可以快速查看清单文件和META-INF/ 中的文件。

      信任证书的弹出对话框可能被禁用。在 Sun 的实现中:打开 Java 控制面板;转到高级选项卡;展开安全节点;前两个复选框应该是“允许用户授予对已签名上下文的权限”和“允许用户授予对来自不受信任机构的内容的权限”。

      【讨论】:

      • 根据我的要求,必须对代码进行签名。我检查了我的 jar 文件,它说一切正常。我的类文件标记为 smk:已验证签名,清单中列出了条目,并且在密钥库中找到了至少一个证书。 META-INF 文件夹看起来也不错。我的控制面板中的设置也很好。我可以正常查看其他自签名小程序。
      • 公平地说,签署小程序(以及使用一般的证书)可能是一个相当烦人的过程。就代码而言,这并不一定意味着发布者不“知道他们在做什么”......
      • 在安全方面“知道自己在做什么”的人数似乎很少。
      • @Tom 顺便说一句,JTextComponent 如何允许为未签名的小程序复制和粘贴文本?是否可以创建一个 MyTextComponent 允许为未签名的小程序复制和粘贴文本?
      • 任何能像 OP 一样写出出色而清晰的问题的人,都清楚自己在做什么。
      猜你喜欢
      • 2011-09-23
      • 2014-06-16
      • 2012-05-10
      • 2018-02-16
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2012-08-24
      • 2011-08-04
      相关资源
      最近更新 更多