我正在寻找Java 代码签名证书,所以我的Java小程序不会抛出这种可怕的安全警告。 然而,我发现所有给他们收费的地方(在我看来)收费太多,比如每年超过200美元。 在进行研究时,代码签名证书似乎与SSL证书几乎完全相同。
我的主要问题是:是否可以购买SSL证书,但是用它来签署Java小程序?
简短的回答:不,他们是不同的。
答案很长:它是相同类型的证书,它使用相同的加密软件,但证书上有标志,表明允许使用的是什么。 代码签名和Web服务器是不同的用途。
当我在Firefox(等)中导入新的CA证书时,我可以选择使用我信任的证书:
所以对我来说答案是:是的,它们是一样的。 此外,为什么不用OpenSSL生成自己的(在Unix上使用man openssl,man x509,man req等)? 您是想安静地发出警告, 还是希望其他您从未见过的人信任您的代码? 如果您不需要其他用户将信任链接到与其浏览器,操作系统等捆绑在一起的锚CA,则使用OpenSSL生成您自己的。
并询问“我如何使用OpenSSL生成自己的证书?” 如果后者是你的选择。
X.509证书可能包括密钥用法字段 (KU)和扩展密钥用法字段 (EKU)。 描述如何为RIA创建签名的Oracle技术说明创建了一个没有任何密钥使用标记的证书,这样可以正常工作(如果可以让受信任的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。
但
最后, checkRemainingExtensions
方法检查剩余的关键EKU。 允许存在的唯一其他关键EKU是
如果找到任何其他关键EKU,则返回false。
Thawte 在这里提供代码签名证书。 我想其他证书颁发机构也提供这项服务。 您还可以使用Java keytool创建自签名证书。