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?
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:
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.
application.properties
ou application.yml
comme mentionné dans la documentation Spring BootVous 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
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/
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:
gulp/config.js , apiPort
et uri
à:
apiPort: 8443,
uri: 'https://localhost:',
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);
}));
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 .
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
}]
},