Java代码签名证书与SSL证书相同吗?

时间:2008-09-17 01:14:49

标签: java ssl certificate code-signing

我正在寻找Java code signing证书,因此我的Java小程序不会抛出这种可怕的安全警告。然而,我发现所有给他们收费的地方(在我看来)收费太多,比如每年超过200美元。在进行研究时,代码签名证书似乎与SSL证书几乎完全相同。

我遇到的主要问题是:是否可以购买SSL证书,但是用它来签署Java小程序?

4 个答案:

答案 0 :(得分:38)

简短的回答:不,他们是不同的。

答案很长:它是同一种证书,它使用相同的加密软件,但证书上有标志,表明允许使用的是什么。代码签名和Web服务器是不同的用途。

答案 1 :(得分:4)

当我在Firefox(等)中导入新的CA证书时,我可以选择使用我信任的证书:

  • 签署服务器
  • 签署代码(与您的小程序一样)
  • 签署电子邮件证书

所以对我来说答案是:是的,它们是一样的。此外,为什么不用OpenSSL生成自己的(man openssl,man x509,man req等,在Unix上)?您是否只想安静地忽略警告您是否希望其他您从未见过的人信任您的代码?如果您不需要其他用户将信任链接到与其浏览器,操作系统等捆绑在一起的锚CA,那么请使用OpenSSL生成您自己的。

并询问“我如何使用OpenSSL生成自己的证书?”如果后者是你的选择。

答案 2 :(得分:1)

Thawte提供代码签名证书here。我想其他证书颁发机构也提供这项服务。您还可以使用Java keytool创建自签名证书。

答案 3 :(得分:1)

X.509证书可能包括key usage fields(KU)和extended key usage fields(EKU)。 Oracle tech note describing how to create sign your RIA's创建一个没有任何密钥使用标记的证书,这样可以正常工作(如果可以让受信任的CA签名)

但是越来越多,CA发布了具有这些关键用法字段的证书。如果存在,这些字段限制证书的使用。 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);
    }

    if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_SSL_CLIENT)) {
        throw new ValidatorException
            ("Netscape cert type does not permit use for SSL client",
            ValidatorException.T_EE_EXTENSIONS, cert);
    }

    // do not check Netscape cert type for JCE code signing checks
    // (some certs were issued with incorrect extensions)
    if (variant.equals(Validator.VAR_JCE_SIGNING) == false) {
        if (!SimpleValidator.getNetscapeCertTypeBit(cert, NSCT_CODE_SIGNING)) {
            throw new ValidatorException
                ("Netscape cert type does not permit use for code signing",
                ValidatorException.T_EE_EXTENSIONS, cert);
        }
        exts.remove(SimpleValidator.OID_NETSCAPE_CERT_TYPE);
    }

    // remove extensions we checked
    exts.remove(SimpleValidator.OID_KEY_USAGE);
    exts.remove(SimpleValidator.OID_EXTENDED_KEY_USAGE);

    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。唯一允许存在的其他关键EKU是

  • 基本约束(oid“2.5.29.19”)和
  • subject alt name (oid 2.5.29.17)

如果找到任何其他关键EKU,则返回false。