2008-09-17 11 views
39

Tôi đang tìm kiếm một chứng chỉ Java code signing vì vậy các ứng dụng Java của tôi không ném lên những cảnh báo bảo mật đáng sợ như vậy. Tuy nhiên, tất cả những nơi tôi đã tìm thấy cung cấp cho họ phí (theo ý kiến ​​của tôi) cách quá nhiều, như hơn 200 USD mỗi năm. Trong khi thực hiện nghiên cứu, chứng chỉ ký mã dường như gần giống hệt như chứng chỉ SSL.Chứng chỉ ký mã Java có giống với chứng chỉ SSL không?

Câu hỏi chính tôi có: có thể mua chứng chỉ SSL nhưng sử dụng nó để ký các ứng dụng Java không?

Trả lời

38

Câu trả lời ngắn gọn: Không, chúng khác nhau.

Câu trả lời dài: Đó là cùng một loại chứng chỉ và sử dụng cùng một phần mềm mã hóa, nhưng chứng chỉ có cờ cho biết nó được phép sử dụng cho mục đích gì. Mã ký và máy chủ web được sử dụng khác nhau.

+23

Darn ... và tôi đặt cược họ đặt những lá cờ đó chỉ để họ có thể phân đoạn thị trường và tính phí nhiều hơn – davr

+1

Ở một mức độ. Nó không giúp đỡ với an ninh mặc dù. –

4

Khi tôi nhập một chứng chỉ CA mới trong Firefox (vv) Tôi có tùy chọn lựa chọn mà giấy chứng nhận sử dụng tôi tin tưởng:

máy chủ Đăng
  • đang Đăng (như applet của bạn)
  • Đăng ký chứng chỉ email

Vì vậy, với tôi câu trả lời là: Có, chúng giống nhau. Hơn nữa, tại sao không tạo của riêng bạn với OpenSSL (người đàn ông openssl, người đàn ông x509, người đàn ông req, vv trên Unix)? Bạn có muốn chỉ im lặng các cảnh báo hoặc bạn có muốn khác những người mà bạn chưa bao giờ gặp để tin tưởng mã của mình không? Nếu bạn không cần những người dùng khác tin tưởng vào chuỗi neo của CA kèm theo trình duyệt, hệ điều hành, v.v. của họ, thì hãy sử dụng OpenSSL để tạo của riêng bạn.

Và hỏi "Làm cách nào để sử dụng OpenSSL để tạo chứng chỉ của riêng tôi?" nếu sau này là sự lựa chọn của bạn.

+2

Vâng tôi muốn người khác tin tưởng vào applet, vì vậy tự ký không thực sự hữu ích trong trường hợp này. – davr

1

Thawte cung cấp chứng chỉ ký mã here. Tôi tưởng tượng các Tổ chức phát hành chứng chỉ khác cũng cung cấp dịch vụ này. Bạn cũng có thể tạo chứng chỉ tự ký, với Java keytool.

+3

Vâng tôi biết họ cung cấp giấy chứng nhận ký mã, nhưng chúng có giá quá nhiều - $ 300 cho một năm! Tôi hy vọng tôi có thể sử dụng chứng chỉ SSL rẻ hơn mà bạn có thể nhận được nhiều hơn như $ 30 – davr

+0

Liên kết đầu tiên bị hỏng ngay bây giờ (404). –

+0

Đã sửa lỗi, cảm ơn @PeterMortensen – jtimberman

1

Chứng chỉ X.509 có thể bao gồm key usage fields (KU) và extended key usage fields (EKU). Oracle tech note describing how to create sign your RIA's tạo chứng chỉ không có cờ sử dụng chính, chỉ hoạt động tốt (nếu bạn có thể nhận được CA tin cậy để ký)

Nhưng ngày càng nhiều, chứng chỉ phát hành của CA với các trường sử dụng chính này. Khi có mặt, các trường này hạn chế việc sử dụng chứng chỉ. Kiểm tra java plugin cho sự hiện diện của các trường này trong 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); 
} 

phương pháp Séc xem xét như sau:

/** 
* 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); 
} 

Vì vậy, nếu không có KU hoặc EKU được chỉ định, KU hoặc EKU checker hạnh phúc trả về true.

Nhưng

  • nếu KU của được quy định, các chữ ký số KU nên một trong số họ.
  • nếu bất kỳ của EKU được quy định, hoặc mã EKU (được xác định bởi 1.3.6.1.5.5.7.3.3 oid) hoặc EKU bất kỳ việc sử dụng (được xác định bởi 2.5.29.37.0 oid) nên được chỉ định cũng.

Cuối cùng, phương pháp checkRemainingExtensions kiểm tra EKU còn lại quan trọng. Các chỉ khác quan trọng EKU của phép có mặt là

  • trở ngại cơ bản (oid "2.5.29.19") và
  • đề alt tên (oid 2.5.29.17)

Nếu nó tìm thấy bất kỳ EKU quan trọng nào khác, nó trả về false.