Domanda

Sto cercando un Java firma del codice certificato in modo che le mie applet Java non generino avvisi di sicurezza così spaventosi.Tuttavia, tutti i posti che ho trovato che li offrono fanno pagare (secondo me) troppo, come oltre 200 dollari all'anno.Durante le ricerche, un certificato di firma del codice sembra quasi esattamente identico a un file SSL certificato.

La domanda principale che ho:è possibile acquistare un certificato SSL, ma usarlo per firmare applet Java?

È stato utile?

Soluzione

Risposta breve:No, sono diversi.

Risposta lunga:È lo stesso tipo di certificato e utilizza lo stesso software di crittografia, ma il certificato ha flag che indicano per cosa è consentito utilizzarlo.La firma del codice e il server web sono usi diversi.

Altri suggerimenti

Quando importo un nuovo certificato CA in Firefox (ecc.) ho la possibilità di scegliere quale certificato utilizza di cui mi fido:

  • Server di firma
  • Firma il codice (come la tua applet)
  • Firmare certificati e-mail

Quindi per me la risposta è:Sì, sono gli stessi.Inoltre, perché non generarne uno tuo con OpenSSL (man openssl, man x509, man req, ecc.su Unix)?Vuoi semplicemente mettere a tacere gli avvertimenti O vuoi altro persone che non hai mai incontrato per fidarsi del tuo codice?Se non hai bisogno che altri utenti concatenano la fiducia alle CA di ancoraggio in bundle con il loro browser, sistema operativo, ecc., utilizza OpenSSL per generarne una tua.

E chiedi "Come posso usare OpenSSL per generare i miei certificati?" Se quest'ultima è la tua scelta.

Thawte offre certificati di firma del codice Qui.Immagino che anche altre autorità di certificazione offrano questo servizio.Puoi anche creare certificati autofirmati, con Strumento chiave Java.

I certificati X.509 possono includere campi di utilizzo chiave (KU) e campi di utilizzo chiave estesi (EKU).IL Nota tecnica Oracle che descrive come creare la firma delle tue RIA crea un certificato senza alcun flag di utilizzo della chiave, che funziona perfettamente (se riesci a convincere una CA attendibile a firmarlo)

Ma sempre più spesso le CA rilasciano certificati con questi campi di utilizzo chiave.Quando presenti, questi campi limitare l'utilizzo del certificato.Il plugin Java verifica la presenza di questi campi nel file 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);
}

I metodi di controllo sono i seguenti:

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

Pertanto, se non viene specificato alcun KU o EKU, il controllo KU o EKU restituisce felicemente true.

Ma

  • se vengono specificate le KU, il file firma digitale KU dovrebbe essere uno di questi.
  • se sono specificate delle EKU, la EKU firma del codice (identificato da oid 1.3.6.1.5.5.7.3.3) o dall'EKU qualsiasi utilizzo (identificato da oid 2.5.29.37.0) deve essere specificato.

Infine, il checkRemainingExtensions Il metodo controlla le restanti EKU critiche.Le uniche altre EKU critiche autorizzate a essere presenti sono

  • vincoli di base (oid "2.5.29.19") e
  • nome alternativo dell'oggetto (oid 2.5.29.17)

Se trova un altro EKU critico, restituisce false.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top