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

我正在四处寻找一个Java 代码签名证书,所以我的Java小程序不会抛出这样的可怕的安全警告。 然而,我发现所有提供给他们的地方(我认为)收费太多,每年超过200美元。 在进行研究时,代码签名证书看起来几乎与SSL证书完全一样。

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

简答:不,他们不一样。

长答案:这是相同types的证书,它使用相同的encryption软件,但证书具有标志,指示允许使用什么。 代码签名和Web服务器是不同的用途。

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

  • 签署服务器
  • 标志码(如你的小程序)
  • 签署电子邮件证书

所以对我来说,答案是:是的,他们是一样的。 此外,为什么不用OpenSSL (Unix下的man openssl,man x509,man req等)生成你自己的呢? 你想只是安静的警告, 或者你想要你从来没有见过的其他人相信你的代码? 如果您不需要其他用户将信任链接到与其浏览器,操作系统等捆绑在一起的锚定CA,则使用OpenSSL生成您自己的。

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

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

X.509证书可以包括密钥使用字段 (KU's)和扩展密钥使用字段 (EKU's)。 描述如何创buildRIA签名的Oracle技术说明创build了一个没有任何密钥使用标志的证书,这很好(如果你能得到一个可信的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”)和
  • 科目名称 (oid 2.5.29.17)

如果发现其他重要的EKU,则返回false。