web-dev-qa-db-fra.com

Comment ajouter un certificat SSL auto-signé à l'exemple d'application jHipster?

J'ai créé un exemple d'application jHipster. Maintenant, je veux ajouter un certificat SSL auto-signé et tester en local pour avoir accès à https. Comment y parvenir?

31
Raj

Ces instructions s'appliquent à toutes les applications Spring Boot sur lesquelles JHipster est basé. J'ai testé cela sur un projet JHipster 2.7 nouvellement généré.

Vous devez effectuer ces étapes lors du démarrage à partir de zéro:

  1. Générer un certificat auto-signé
  2. Ajoutez les propriétés SSL à votre application.properties ou application.yml comme mentionné dans la documentation Spring Boot
  3. (Facultatif) Redirigez HTTP vers HTTPS

Génération d'un certificat auto-signé

Vous devez d'abord générer votre certificat auto-signé dans votre répertoire de projet, cela peut être fait avec keytool, qui est un script utilitaire fourni par Java:

keytool -genkey -alias Tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650
Enter keystore password:  
Re-enter new password:
What is your first and last name?
  [Unknown]:  
What is the name of your organizational unit?
  [Unknown]:  
What is the name of your organization?
  [Unknown]:  
What is the name of your City or Locality?
  [Unknown]:  
What is the name of your State or Province?
  [Unknown]:  
What is the two-letter country code for this unit?
  [Unknown]:  
Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
  [no]:  yes

J'ai choisi le mot de passe mypassword c'est donc celui que j'utiliserai à l'étape suivante. Une fois cette opération terminée, vous verrez un keystore.p12 dans votre répertoire actuel.

Ajoutez les propriétés SSL à votre application.properties ou application.yml comme mentionné dans la documentation Spring Boot

Vous devez maintenant ajouter les propriétés du connecteur HTTPS pour Tomcat. Vous pouvez trouver les fichiers de propriétés (yml) dans src/main/resources/ et vous devez mettre à jour le application.yml (ou si c'est uniquement pour le développement dans application-dev.yml avec les propriétés suivantes:

server:
  ssl:
    key-store: keystore.p12
    key-store-password: mypassword
    keyStoreType: PKCS12
    keyAlias: Tomcat

Vous pouvez maintenant empaqueter votre application avec Maven (ou Gradle si vous l'avez choisi pour votre application JHipster) en utilisant mvn clean package et exécutez l'application en utilisant mvn spring-boot: run . Vous pouvez maintenant accéder à votre application sur https: // localhost: 808

Par souci de simplicité, je n'ai pas changé le port, mais idéalement, vous devriez également le changer dans les fichiers de propriétés, mais je l'ai laissé de côté car ils sont déjà définis dans application-dev.yml et application-prod.yml donc il faudrait le changer dedans ou le retirer et le mettre dans le général application.yml


(Facultatif) Ajouter une redirection HTTP vers HTTPS

Vous ne pouvez activer qu'un seul protocole via le application.properties, donc quand vous faites cela comme ci-dessus, seul HTTPS fonctionnera. Si vous voulez que HTTP fonctionne aussi et que vous redirigez vers HTTPS, vous devez ajouter un @Configuration classe comme ci-dessous

@Bean
  public EmbeddedServletContainerFactory servletContainer() {
    TomcatEmbeddedServletContainerFactory Tomcat = new      TomcatEmbeddedServletContainerFactory() {
        @Override
        protected void postProcessContext(Context context) {
          SecurityConstraint securityConstraint = new SecurityConstraint();
          securityConstraint.setUserConstraint("CONFIDENTIAL");
          SecurityCollection collection = new SecurityCollection();
          collection.addPattern("/*");
          securityConstraint.addCollection(collection);
          context.addConstraint(securityConstraint);
        }
      };

    Tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
    return Tomcat;
  }

  private Connector initiateHttpConnector() {
    Connector connector = new Connector("org.Apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    connector.setPort(8080);
    connector.setSecure(false);
    connector.setRedirectPort(8443);

    return connector;
  }

Cette réponse est essentiellement une copie de mon article de blog sur le même sujet: http://www.drissamri.be/blog/Java/enable-https-in-spring-boot/

70
Driss Amri

Pour étendre la réponse brillante de Driss Amri sur la façon de réactiver BrowserSync.

Si vous choisissez de ne pas prendre en charge http, ou si http est redirigé vers https, BrowserSync ne fonctionnera pas. Pour le faire fonctionner à nouveau, peu de changements sont nécessaires dans:

  1. gulp/config.js , apiPort et uri à:

    apiPort: 8443, 
    uri: 'https://localhost:',
    
  2. gulp/serve.js : ajoutez options.rejectUnauthorized = false; dans proxyRoutes pour que le nœud ne se plaint pas du certificat auto-signé:

    proxyRoutes.map(function (r) {
        var options = url.parse(baseUri + r);
        options.route = r;
        options.preserveHost = true;
        options.rejectUnauthorized = false;
        return proxy(options);
    }));
    
  3. vous pouvez également laisser BrowserSync diffuser le contenu sur https également. Je le recommande avec Spring Social pour éviter des ennuis. Ajoutez simplement https: true dans browserSync appelez dans gulp/serve.js:

    browserSync({
        open: true,
        port: config.port,
        server: {
            baseDir: config.app,
            middleware: proxies
        },
        https: true
    });
    

    BrowserSync servira désormais le contenu avec un certificat auto-signé livré avec. Il est possible de réutiliser celui créé pour Spring Boot, plus d'informations sur page d'accueil de BrowserSync .

5
Michal Foksa

Pour ceux qui utilisent webpack au lieu de gulp, vous pouvez compléter Driss Amri's réponse avec deux changements:

modifiez le proxy.conf.json :

{
    "*": {
        "target": "https://localhost:8443",
        "secure": true
    }
}

cela redirigera les demandes d'API vers la nouvelle adresse https. Ensuite, modifiez également le fichier webpack, par exemple ici un exemple modifié webpack.dev.js :

module.exports = webpackMerge(commonConfig({ env: ENV }), {
devtool: 'eval-source-map',
devServer: {
    contentBase: './target/www',
    proxy: [{
        context: [
            /* jhipster-needle-add-entity-to-webpack - JHipster will add entity api paths here */
            '/api',
            '/management', ...
            '/auth'
        ],
        target: 'https://127.0.0.1:8443',
        /* set secure to false here, otherwise self-signed certification cause DEPTH_ZERO_SELF_SIGNED_CERT proxy errors */
        secure: false
    }]
},
1
A. Masson