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

如何为浏览器中使用的Java小程序签名?,java,browser,applet,certificate,self-signed,Java,Browser,Applet,Certificate,Self Signed,我正在尝试在我的网站上部署一个Java小程序。我还需要签名,因为我需要访问剪贴板。我已经学习了所有我能找到的签名教程,但没有任何成功。以下是我迄今为止所做的工作: 用NetBeans编写了一个applet。它在小程序查看器中运行良好 用它制作了一个.jar文件 通过执行以下操作创建证书: 用jarsigner签名如下: 创建了一个包含以下内容的html文件: 当我打开那个html文件时,我从未得到过安全确认对话框(从而得到“java.security.AccessControlE

我正在尝试在我的网站上部署一个Java小程序。我还需要签名,因为我需要访问剪贴板。我已经学习了所有我能找到的签名教程,但没有任何成功。以下是我迄今为止所做的工作:

  • 用NetBeans编写了一个applet。它在小程序查看器中运行良好
  • 用它制作了一个.jar文件
  • 通过执行以下操作创建证书:
  • 用jarsigner签名如下:
  • 创建了一个包含以下内容的html文件:

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


我遗漏了一个步骤吗?

编辑:这个答案是历史性的。JDK9显然会反对小程序。在撰写本文时(2017年1月1日),您应该签署小程序,但不给它们任何额外的特权,然后过渡到更先进的技术

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

JTextComponent
应允许复制和粘贴文本(如果足够)

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


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

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

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

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

你提到:

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


您是从本地文件系统打开该文件,还是通过指向承载HTML文件和小程序jar的web服务器的URL打开该文件?这可能就是您没有收到任何警告的原因。

可能是因为您正在jar文件之外打开一些.class文件

这样,它可能不会显示警告。我试着这样做,但它仍然向我显示了证书警告,对于一个简单的例子,它实际上阻止我使用分离的类从JAR访问类


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

以下是一种对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
3个简单的步骤

  • keytool-genkey-keystoremykeystore-alias me

  • keytool-selfcert-keystoremykeystore-alias me

  • jarsigner-keystore myKeyStore jarfile.jar me


  • 根据我的要求,代码必须签名。我检查了我的jar文件,它说一切正常。我的类文件标记为smk:签名已验证,条目列在清单中,并且在密钥库中至少找到一个证书。META-INF文件夹看起来也不错。我的控制面板中的设置也很好。我可以很好地查看其他自签名的小程序。公平地说,对小程序进行签名(以及通常使用证书)可能是一个相当烦人的过程。这并不一定意味着海报在代码方面“不知道他们在做什么”……在安全方面“知道他们在做什么”的人数似乎相当少。@Tom顺便问一下,JTextComponent是如何允许复制和粘贴未签名小程序的文本的?有没有可能创建一个MyTextComponent,允许为未签名的小程序复制和粘贴文本?任何能写出像OP一样出色和清晰的问题的人,很清楚他们在做什么。我相信使用电子邮件证书进行代码签名的问题已经解决。Thawte已经停止使用个人电子邮件证书和我从本地系统打开的信任网(WOT)认证系统。你是说如果安全对话框在本地打开,它将不会显示?如果这是真的,有没有办法让它在本地显示?这将使测试我的项目更加容易。同时,我将在web服务器上试用它,看看这是否是问题所在。当从web服务器访问时,它仍然不起作用。我只需要.class文件、.jar文件和.html文件,对吗?我需要任何与证书相关的文件吗?我已经修复了。问题是我的jar文件的编译方式与我引用类文件的编译方式不同。现在可以了。谢谢
    -keystoremykeystore
    甚至是可选的,不是吗?这样,我的小程序就被签名了,但我的剪贴簿问题仍然存在。然而,最好的应用程序签名(jarsigning)-我在网上找到的教程。:)
    jarsigner "C:\my path\myJar.jar" myKeyName
    
    <html>
      <body>
    <applet code="my/path/name/myApplet.class" archive="../dist/myJar.jar"/>
      </body>
    </html>
    
    #!/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