如何为在浏览器中使用的Java小程序签名?

40

我正在尝试在我的网站上部署一个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”错误)。这在所有浏览器上都发生。
我是否漏掉了什么步骤?
6个回答

29

3个简单的步骤

  1. keytool -genkey -keystore myKeyStore -alias me

  2. keytool -selfcert -keystore myKeyStore -alias me

  3. jarsigner -keystore myKeyStore jarfile.jar me


1
“-keystore myKeyStore”是可选的,不是吗?我已经用这种方式签署了我的小应用程序,但我的剪贴板问题仍然存在。然而,这是我在网上找到的最好的小应用程序签名(jarsigning)教程。 :) - user unknown

7
也许是因为您在jar文件外部打开了一些.class文件,所以没有显示警告。我尝试过这样做,但它仍然显示了证书警告,在一个简单的情况下,它实际上防止我从具有分离类的JAR中访问类。也许你特定的设置或文件组织导致了这种行为。如果您可以更详细地描述,我们可以更好地帮助您(或者,尝试将所有这些.class文件放入另一个已签名的Jar并将其添加到归档文件“...,anotherJar.jar”中)。

我解决了。问题在于我的jar文件没有以我引用类文件的方式进行编译。现在它可以工作了。谢谢! - user107312

1

这里有一种方法可以对您的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

1

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

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

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


我相信使用电子邮件证书进行代码签名的问题已经得到解决。 - Tom Hawtin - tackline
Thawte已经停止了个人电子邮件证书和Web of Trust(WOT)认证系统。 - Massimo

1
你提到了:

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

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


我正在从我的本地系统打开。你是说如果它在本地打开,安全对话框不会出现吗?如果是这样,有没有办法让它在本地显示?这将使测试我的项目变得更加容易。同时,我会在Web服务器上尝试一下,看看是否存在这个问题。 - user107312
从 Web 服务器访问仍然无法正常工作。我只需要我的 .class 文件、.jar 文件和 .html 文件,对吗?我需要与证书相关的任何文件吗? - user107312

-1

编辑:此答案已经过时。JDK9将明确弃用小程序。在撰写本文时(2017年1月1日),您应该签署小程序,但不给予它们任何额外的特权,然后转向更现代的技术。

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

如果只需要复制和粘贴文本,则JTextComponent应该允许这样做。

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

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


根据我的要求,这份代码必须经过签名。我检查了我的jar文件并且显示一切正常。我的class文件标记为smk:签名已验证,条目已列在清单中,并且至少在密钥库中找到了一个证书。META-INF文件夹看起来也没问题。我的控制面板设置也是正确的。我可以正常查看其他自签名小程序。 - user107312
3
公平地说,签署小应用程序(以及处理证书的一般流程)可能是一个相当让人烦恼的过程。这并不意味着发帖者在代码方面“不知道自己在做什么”…… - Neil Coffey
似乎在安全方面“知道自己在做什么”的人数相当有限。 - Tom Hawtin - tackline
1
@Tom 顺便问一下,JTextComponent 是如何允许未签名的小程序复制和粘贴文本的?是否可以创建一个 MyTextComponent,使其允许未签名的小程序复制和粘贴文本? - Pacerier
2
任何能够像 OP 一样出色和清晰地提出问题的人,显然都知道自己在做什么。 - tadasajon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接