我创建了Java signed applet
,如果我设置 Java(JRE 8)安全级别 高 ,它就能完美运行在例外网站列表中添加网站网址。
但是如果我们不在异常站点列表中添加站点URL,则会发现java安全异常,如下所述:add url in exception site list
我使用第三方证书创建了一个签名的小程序。
创建签名小程序后,这是我的清单文件:
是否有任何选项可用于避免这些安全阻止弹出窗口,方法是在创建签名applet或任何脚本时添加清单文件中的一些更改,java代码以避免这些弹出窗口而不在异常站点中添加站点URL列出?
或者Java 是否强烈要求我们必须在异常网站列表中添加网站网址以避免此类阻止错误。
基本上是否有任何选项可用于通过清单文件或任何Java代码在异常站点列表中添加我们的URL?
如果我想使用签名证书签署我的applet,那么它是必须的吗?那么它必须是代码签名证书吗?通配符或ssl证书不起作用?
虽然我已经通过通配符证书签署了我的applet,但我正在获得自签名applet块问题。
答案 0 :(得分:3)
您的应用程序被认为是自签名的,因为您已使用不适合代码签名的证书对其进行签名。这个看起来很讨厌的弹出窗口阻止了自签名应用程序:
如果使用由受信任的证书颁发机构签名的代码签名证书进行签名,则可以阻止此弹出窗口。然后,用户将获得一个更好看的确认对话框,其中列出您的名称作为应用程序的发布者:
有关对话框的说明以及它们出现的原因和时间,请参阅Oracle security dialogs上的文档。
请查看working with Signed RIAs上的文档,特别是23.2"签署RIA",以获取有关如何创建代码签名证书以对您的applet进行签名的信息。
第二个不错的链接是http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html#5
- UPDATE -
究竟是什么使证书成为代码签名证书?
X.509证书可能包括密钥用法字段(KU' s)和extended key usage fields(EKU' s)。这些字段(如果存在)限制证书的有效使用。 java插件会检查这些字段是否存在。
我找到了执行此检查的EndEntityChecker的源代码。
/**
* Check whether this certificate can be used for code signing.
* @throws CertificateException if not.
*/
private void checkCodeSigning(X509Certificate cert)
throws CertificateException {
Set<String> exts = getCriticalExtensions(cert);
if (checkKeyUsage(cert, KU_SIGNATURE) == false) {
throw new ValidatorException
("KeyUsage does not allow digital signatures",
ValidatorException.T_EE_EXTENSIONS, cert);
}
if (checkEKU(cert, exts, OID_EKU_CODE_SIGNING) == false) {
throw new ValidatorException
("Extended key usage does not permit use for code signing",
ValidatorException.T_EE_EXTENSIONS, cert);
}
[...]
checkRemainingExtensions(exts);
}
检查方法如下:
/**
* Utility method checking if the extended key usage extension in
* certificate cert allows use for expectedEKU.
*/
private boolean checkEKU(X509Certificate cert, Set<String> exts,
String expectedEKU) throws CertificateException {
List<String> eku = cert.getExtendedKeyUsage();
if (eku == null) {
return true;
}
return eku.contains(expectedEKU) || eku.contains(OID_EKU_ANY_USAGE);
}
请注意,如果未指定KU或EKU,则KU或EKU检查器返回true。但是如果指定了KU,则数字签名 KU应该是其中之一。同样,如果指定了任何EKU,则EKU 代码签名(由oid 1.3.6.1.5.5.7.3.3标识)或EKU 任何用法 (也应由oid 2.5.29.37.0确定)。
最后,当遇到其他相关的关键EKU时,checkRemainingExtensions
方法会出现问题。
因此,我希望您的通配符SSL证书至少指定一个不是代码签名的EKU,因此不会被java插件识别为有效的代码签名证书。
答案 1 :(得分:1)
或者JAVA真的强制要求我们必须在异常站点列表中添加站点URL以避免这种阻塞错误。
基本上是的。最终用户可以禁用securoty弹出窗口,但您无法通过应用程序执行此操作。如果您查看Oracle文档"Avoiding security dialogs"。明确指出,securoty popup是一种预期的行为:
Java Runtime会自动警告用户可能出现的安全敏感问题。如果您确信您使用的应用程序是安全的,则可以绕过安全对话框以简化用户体验。 如果Java applet / webstart应用程序已签名,则会弹出证书安全警告对话框,用户必须单击“运行”按钮才能授予应用程序代码的所有权限。
如果您阅读了避免弹出窗口的选项,您会发现它们都意味着修改最终用户计算机上的内容。
以下是选项(引自"Avoiding security dialogs"):
用户接受用于签署应用程序的证书,并选中始终信任此发布者的内容复选框。然后,下次将自动授予此应用程序的权限(直到证书过期或从受信任的密钥库中删除)。
可以将证书手动导入JRE可信证书库。要使用Java控制面板导入证书,请选择“安全”选项卡,然后选择“证书”&gt;可信证书。要从命令行将证书导入证书存储区,请使用keytool实用程序(在JRE的bin文件夹中)。
在位于$ {user.home} /.java.policy的Java策略文件中授予AllPermissions,或指向$(JRE_HOME)/ lib / security / java中包含AllPermissions的任何Java策略文件。安全文件。权限可以授予所有应用程序或仅限于特定URL。有关.java.policy的详细信息,请参阅默认策略实现和策略文件语法。
答案 2 :(得分:0)
尝试修改清单,将服务器名称添加到caller-allowable-codebase中。可能您不再需要将您的网站网址添加到例外
<强>更新强>:
这是我的manisfest档案的一个例子:
Manifest-Version: 1.0
Application-Library-Allowable-Codebase: *
Application-Name: myApp
Name: MyName
Permissions: all-permissions
Created-By: 1.7.0_51 (Oracle Corporation)
Caller-Allowable-Codebase: MyServerName
Codebase: *
答案 3 :(得分:-1)
在拥有一个编码人员之后,这可能会显示出有效的结果:
Manifest-Version: 1.4
Application-Library-Allowable-Codebase: *
Permissions: all-permissions
Caller-Allowable-Codebase: **http://yourIp:yourPort/-**
Codebase: *
http://yourIp:yourPort/-末尾的详细信息表示&#34; / - &#34;实现您的所有网站...