2008-09-17 158 views
39

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

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

回答

38

简答:不,他们不一样。

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

+23

该死......我打赌他们把那些旗子放在那里,这样他们就可以分割市场并收取更多的费用 – davr 2008-09-17 16:57:42

+1

在某种程度上。它确实有助于安全。 – 2008-09-18 01:07:24

4

当我输入在Firefox(等)的一个新的CA证书,我有证书使用我信任选择的选项:

  • 登录服务器
  • 注册代码(如您的小程序)
  • 签署电子邮件证书

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

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

+2

是的,我希望其他人信任这个applet,所以在这种情况下自签名并不是真的有用。 – davr 2008-09-17 16:56:03

1

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

1

X.509证书可能包括key usage fields(KU's)和extended key usage fields(EKU's)。 Oracle tech note describing how to create sign your RIA's创建没有任何密钥使用标志的证书,这很好(如果你可以得到一个可信的CA签名)

但是越来越多,CA使用这些密钥使用字段颁发证书。当存在时,这些字段限制证书的使用。这些字段在EndEntityChecker存在Java插件检查:

/** 
* 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”)和
  • 主题Alt名称(OID 2.5.29.17)

如果它发现任何其他关键的EKU,它返回false。