Certificats Java et SSL


J'essaie d'établir une connexion avec un de mes scripts PHP en Java en utilisant le secure socket layer (HTTPS), mais j'ai découvert que pour assurer une sécurité/validité maximale, je dois importer le certificat SSL que mon site Web utilise dans mon application... Quelque chose que je ne sais pas comment faire.

Si cela aide, mon certificat SSL n'est pas auto-signé, plutôt fourni par StartSSL ET j'utilise Eclipse ID.

Quelqu'un Pourrait-il me diriger dans la bonne direction? c'est à dire Ce que les fichiers dont j'ai besoin, où dois-je les importer et de quel code ai-je besoin en Java, etc.?

Author: ROMANIA_engineer, 2011-08-28

5 answers

J'ai découvert que pour assurer la sécurité/validité de maxium, je dois importer le certificat SSL que mon site Web utilise dans mon application

Vous avez partiellement raison lorsque vous faites cette déclaration. Vous n'avez pas besoin d'importer votre certificat SSL. Il suffit que le certificat StartSSL CA soit importé.

De plus, il n'existe pas d'importation de certificat dans une application Java. La prise en charge SSL en Java repose sur le concept de keystores et truststores, et non sur un certificat empaqueté dans votre application. Si vous publiez votre application pour être téléchargée et exécutée par les utilisateurs finaux, il n'est pas nécessaire que vous publiiez votre certificat ou d'ailleurs votre clé privée dans votre application. La clé privée et le certificat associé seront stockés dans un magasin de clés auquel vous seul pouvez accéder.

Les utilisateurs finaux de votre application s'appuieraient sur la prise en charge SSL dans le runtime Java, ce qui permettrait application pour établir des connexions SSL aux sites, une fois le certificat de serveur vérifié. Le runtime Java est livré avec un ensemble par défaut de certificats CA dans un truststore, et la seule condition préalable pour que les connexions SSL soient établies avec succès est que le certificat SSL du serveur soit émis par l'un des CAS dans le truststore. Les certificats de StartSSL ne sont pas présents dans le truststore du runtime Java, au moins à partir de la version 6, et par conséquent:

  • Vous pouvez demander à vos utilisateurs finaux d'effectuer l'activité d'importation du certificat StartSSL CA dans Java truststore. Les liens qui peuvent aider incluent ce fil de discussion StartSSL (seules les 4 premières étapes sont nécessaires pour importer les certificats CA dans un truststore), un projet GitHub et cet article de blog; un avertissement - Je n'ai essayé d'utiliser aucun de ceux-ci et vous devriez l'utiliser à vos propres risques.
  • Ou, vous pourriez initialisez votre application avec votre propre truststore en utilisant les indicateurs de démarrage -Djavax.net.ssl.trustStore=<path_to_truststore> -Djavax.net.ssl.trustStorePassword=<truststore_password> JVM, ou exécutez le code suivant avant d'initialiser les connexions SSL:

    System.setProperty("javax.net.ssl.trustStore","<path_to_truststore>");
    System.setProperty("javax.net.ssl.trustStorePassword","<truststore_password>");
    

    Il s'agit d'une approche viable uniquement si votre application est une application Java SE qui n'est pas une applet (ou une application avec des restrictions similaires sur la façon dont le truststore est spécifié).


Cela aiderait également à lire la documentation Java keytool.

 24
Author: Vineet Reynolds, 2011-08-28 09:44:27

Apparemment, les ingénieurs de mailgun pour une raison quelconque ne veulent pas nous donner des instructions claires sur la façon de résoudre ce problème. C'est ce que j'ai fait

Nous exécutons tomcat8 et nous nous connectons via les services Web jersey à l'API mailgun. J'ai suivi les instructions de ces utilisateurs et cela a bien fonctionné. Espérons que cela aide quelqu'un.

Le 1/22, nous avons mis à jour nos certificats SSL car l'infrastructure PKI de Symantec n'est plus fiable. Certaines anciennes versions de Java n'ont pas le " DigiCert Global Root G2" CA.

, Il existe plusieurs options:

Importez l'autorité de certification "DigiCert Global Root G2" dans votre fichier "cacerts". Mettez à niveau votre JRE vers 8u91 (ou supérieur), qui inclut cette racine. Pour importer le "DigiCert Global Root G2", Vous pouvez télécharger la racine à partir de https://www.digicert.com/digicert-root-certificates.htm . Assurez-vous que vous téléchargez le certificat racine correct.

Une fois le certificat téléchargé, vous devrez l'importer avec une commande comme le suivant:

Keytool-import -trustcacerts -keystore /chemin/vers/fichier cacerts -storepass changeit -noprompt -alias digicert-global-racine-g2 -fichier /chemin/vers/par digicert.CRT Vous devrez définir le chemin d'accès à votre magasin de clés Java et l'emplacement du certificat racine que vous avez téléchargé.


Donc 1. / chemin / vers / digicert.crt est le fichier que vous venez de télécharger. 2. / path / to / cacerts-C'est dans votre chemin JRE. Je "find / - name cacerts-print" cela vous aidera à trouver rapidement tous les cacerts java sur votre système de fichiers. Pour moi, c'est /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/security/cacerts

 2
Author: Will Berger, 2018-01-25 01:27:05

La méthode suivante charge le magasin de clés par défaut (cacerts), vérifie si un certificat est installé et l'installe sinon. Il élimine le besoin d'exécuter manuellement la commande keystore sur n'importe quel serveur.

Il suppose que le mot de passe par défaut du magasin de clés (changeit) est inchangé, mettre à jour CACERTS_PASSWORD sinon. Notez que la méthode enregistre le magasin de clés après avoir ajouté un certificat, donc après avoir été exécuté une fois le certificat sera définitivement dans le magasin.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;

/**
 * Add a certificate to the cacerts keystore if it's not already included
 */
public class SslUtil {
    private static final String CACERTS_PATH = "/lib/security/cacerts";

    // NOTE: DO NOT STORE PASSWORDS IN PLAIN TEXT CODE, LOAD AT RUNTIME FROM A SECURE CONFIG
    // DEFAULT CACERTS PASSWORD IS PROVIDED HERE AS A QUICK, NOT-FOR-PRODUCTION WORKING EXAMPLE
    // ALSO, CHANGE THE DEFAULT CACERTS PASSWORD, AS IT IMPLORES YOU TO!
    private static final String CACERTS_PASSWORD = "changeit";

    /**
     * Add a certificate to the cacerts keystore if it's not already included
     * 
     * @param alias The alias for the certificate, if added
     * @param certInputStream The certificate input stream
     * @throws KeyStoreException
     * @throws NoSuchAlgorithmException
     * @throws CertificateException
     * @throws IOException
     */
    public static void ensureSslCertIsInKeystore(String alias, InputStream certInputStream)
            throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{
        //get default cacerts file
        final File cacertsFile = new File(System.getProperty("java.home") + CACERTS_PATH);
        if (!cacertsFile.exists()) {
            throw new FileNotFoundException(cacertsFile.getAbsolutePath());
        }

        //load cacerts keystore
        FileInputStream cacertsIs = new FileInputStream(cacertsFile);
        final KeyStore cacerts = KeyStore.getInstance(KeyStore.getDefaultType());
        cacerts.load(cacertsIs, CACERTS_PASSWORD.toCharArray());
        cacertsIs.close();

        //load certificate from input stream
        final CertificateFactory cf = CertificateFactory.getInstance("X.509");
        final Certificate cert = cf.generateCertificate(certInputStream);
        certInputStream.close();

        //check if cacerts contains the certificate
        if (cacerts.getCertificateAlias(cert) == null) {
            //cacerts doesn't contain the certificate, add it
            cacerts.setCertificateEntry(alias, cert);
            //write the updated cacerts keystore
            FileOutputStream cacertsOs = new FileOutputStream(cacertsFile);
            cacerts.store(cacertsOs, CACERTS_PASSWORD.toCharArray());
            cacertsOs.close();
        }
    }
}

Utilisez-le comme donc:

SslUtil.ensureSslCertIsInKeystore("startssl", new FileInputStream("/path/to/cert.crt"));
 1
Author: Shane, 2017-07-27 21:58:17

Avez un oeil à l'article suivant: http://stilius.net/java/java_ssl.php Il contient un exemple de code qui peut aider si vous essayez d'accéder à votre script à partir de code.

Notez que vous devez utiliser les propriétés système

javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword

Pour transmettre le certificat SSL à la JVM ou l'importer dans le magasin de clés JRE en utilisant keytool tool

 0
Author: Sergey, 2011-08-28 09:53:01

J'ai découvert que pour assurer la sécurité/validité de maxium, je dois importer le certificat SSL

Non, vous n'avez besoin de cette étape que si vos clients ne font pas déjà confiance au signataire du certificat de serveur, ce qui ne se produit que si le certificat de serveur est auto-signé ou signé, par exemple par une autorité de certification interne.

 0
Author: user207421, 2011-08-29 10:24:28