2008-09-17 162 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。