2008-09-17 2 views
39

Java code signing 인증서를 찾고 있으므로 자바 애플릿이 그러한 무서운 보안 경고를 표시하지 않습니다. 그러나 내가 제안한 모든 장소는 (내 의견으로는) 1 년에 USD200 이상을 청구하는 방식으로 너무 많이 청구됩니다. 조사를하는 동안 코드 서명 인증서는 SSL 인증서와 거의 똑같은 것으로 보입니다.Java 코드 서명 인증서가 SSL 인증서와 동일합니까?

내가 가지고있는 주된 질문은 SSL 인증서를 구입하는 것이 가능하지만 Java 애플릿에 서명하는 데 사용할 수 있습니까?

답변

38

짧은 대답 : 아니오, 그들은 다릅니다.

긴 답변 : 동일한 종류의 인증서이며 동일한 암호화 소프트웨어를 사용하지만 인증서에는 사용이 허용 된 것을 나타내는 플래그가 있습니다. 코드 서명과 웹 서버는 서로 다른 용도로 사용됩니다.

+23

젠체하는 ... 나는 그들이 시장을 분류하고 더 많이 부담 할 수 있도록 그 깃발을 거기에 두는 것이 틀림 없다. – davr

+1

정도. 보안에 도움이됩니다. –

4

내가 (등) 파이어 폭스의 새로운 CA 인증서를 가져 오면 나는 인증서가 내가 믿을 사용하는 선택의 옵션이 있습니다

  • (애플릿 등)
  • 로그인 코드를

    • 로그인 서버를 전자 메일 인증서에 서명

    그래서 나에게 대답은 : 예, 그들은 동일합니다. 게다가, OpenSSL (유닉스에서 openssl, man x509, man req 등)으로 자신 만의 제품을 만들어 보시지 않겠습니까? 또는을 원하는대로 하시겠습니까? 다른 코드를 신뢰할 수있는 사람이 누구입니까? 다른 사용자가 자신의 브라우저, OS 등과 함께 번들로 제공되는 앵커 CA에 대한 신뢰를 맺을 필요가 없다면 OpenSSL을 사용하여 자신의 사이트를 생성 할 수 있습니다.

    그리고 "어떻게 OpenSSL을 사용하여 자체 인증서를 생성합니까?" 후자가 당신의 선택이라면.

  • +2

    그래, 나는 다른 사람들이 애플릿을 신뢰하기를 원하기 때문에이 경우 자체 서명이 도움이되지 않는다. – davr

    1

    Thawte는 코드 서명 인증서 here을 제공합니다. 다른 인증 기관에서도이 서비스를 제공한다고 생각합니다. Java keytool으로 자체 서명 인증서를 만들 수도 있습니다.

    +3

    그래, 그들이 코드 서명 인증서를 제공하지만, 비용이 너무 많이 든다는 것을 안다. 1 년 동안 300 달러! 나는 더 싼 SSL 인증서를 사용하여 $ 30처럼 구입할 수 있기를 바랬다. – davr

    +0

    첫 번째 링크가 고장났다 (404). –

    +0

    고침, 고맙습니다 @PeterMortensen – jtimberman

    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에서 이러한 필드의 존재에 대한 자바 플러그인 검사 :

    /** 
    * 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의이 지정된 경우
    • , 중 (OID 1.3.6.1.5.5.7.3.3로 식별) 또는 EKU 에 서명 EKU 코드는 모든 사용은 (OID 2.5.29.37.0로 식별)를 지정해야합니다 게다가.

    마지막으로 checkRemainingExtensions 메서드는 나머지 중요한 EKU를 검사합니다. 유일한 다른 중요한 EKU의 존재가 될 수 있습니다

    • 기본 제약 (OID "2.5.29.19")와
    • 주체 대체 이름 (OID 2.5.29.17)

    하는 경우 다른 중요한 EKU를 찾으면 거짓을 반환합니다.

    관련 문제