我已经创建了Java signed applet,如果我将自己的 Java(JRE 8)安全级别设置为 并将其网站URL添加到例外站点列表中,则它可以完美运行。

但是,如果我们不在例外站点列表中添加站点URL,则Java安全例外如下所述:add url in exception site list

我已经使用第三方证书创建了一个签名的applet。

这是创建签名的applet之后的清单文件:

是否可以通过在创建签名的applet或任何脚本,Java代码时在清单文件中添加一些更改来避免这些安全性阻止弹出窗口,而无需在异常站点列表中添加站点url来避免这些弹出窗口?

还是从Java 强制要求的真的是,我们必须在例外站点列表中添加站点URL以避免这种阻止错误。

基本上可以通过清单文件或任何Java代码在异常站点列表中添加我们的url吗?

如果我想使用已签名的证书对applet进行签名,那么它必须是代码签名证书吗?通配符或ssl证书不起作用?

尽管我已经用通配符证书签署了applet,但是却遇到了自签名applet阻止问题。

最佳答案

您的应用程序被认为是自签名的,因为您已使用非代码签名证书进行了签名。自签名应用程序被此讨厌的弹出窗口阻止:

如果您使用由受信任的证书颁发机构签名的代码签名证书签名,则可以防止此弹出窗口。然后,用户将获得一种看起来更美观的确认对话框,该对话框列出了您作为应用程序发布者的姓名:

另请参见Oracle在security dialogs上的文档,以获取对话框的说明以及出现这些对话框的原因和时间。

请查看working with Signed RIAs上的文档,尤其是23.2“Signing RIAs”,以获得有关如何创建代码签名证书来签署applet的信息。

第二个不错的链接是http://www.oracle.com/technetwork/java/javase/tech/java-code-signing-1915323.html#5

-更新-

是什么使证书真正成为代码签名证书?

X.509证书可能包含密钥用法字段(KU)和extended key usage fields(EKU)。这些字段(如果存在)将限制证书的有效使用。 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标识)。

最后,当checkRemainingExtensions方法遇到其他相关的关键EKU时,该方法会失败。

因此,我希望您的通配符SSL证书指定至少一个不是代码签名的EKU,因此Java插件不会将其识别为有效的代码签名证书。

07-25 22:10
查看更多