Я создал пример приложения jHipster. Теперь я хочу добавить самоподписанный сертификат SSL и протестировать локально, чтобы получить доступ к https. Как достичь этого?
Как добавить самоподписанный сертификат SSL в пример приложения jHipster?
Ответ 1
Эти инструкции применимы для всех приложений Spring Boot, на которых основан JHipster. Я тестировал это на недавно созданном проекте JHipster 2.7.
Вам нужно выполнить следующие шаги при запуске с нуля:
- Создание самозаверяющего сертификата
- Добавьте свойства SSL в свои приложения application.properties или application.yml, как указано в Spring Документация для загрузки
- (необязательно) Перенаправление HTTP на HTTPS
Создание самозаверяющего сертификата
Сначала вам нужно сгенерировать свой самозаверяющий сертификат в каталоге проекта, это можно сделать с помощью keytool
, который является утилитой script, предоставляемой 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
Я выбрал пароль mypassword
, так что это тот, который я буду использовать на следующем шаге. Когда вы это сделаете, вы увидите keystore.p12
в своем текущем каталоге.
Добавьте свойства SSL в application.properties
или application.yml
, как указано в Spring Документация по загрузке
Теперь вам нужно добавить свойства соединителя HTTPS для Tomcat. Файлы свойств (yml) можно найти в src/main/resources/
, и вам нужно обновить application.yml
(или если он предназначен только для разработки в application-dev.yml
со следующими свойствами:
server:
ssl:
key-store: keystore.p12
key-store-password: mypassword
keyStoreType: PKCS12
keyAlias: tomcat
Теперь вы можете упаковать свое приложение с помощью Maven (или Gradle, если вы выбрали это для своего приложения JHipster) с помощью mvn clean package
и запустить приложение, используя mvn spring -boot: run. Теперь вы можете получить доступ к своему приложению на https://localhost:8080
Для простоты я не изменил порт, но в идеале вы должны изменить его также в файлах свойств, но я его оставил, так как они уже определены в application-dev.yml
и application-prod.yml
, поэтому вам придется его изменить там или удалите его и поместите в общий application.yml
(необязательно) Добавить перенаправление HTTP на HTTPS
Вы можете включить только один протокол через application.properties
, поэтому, когда вы сделаете это, как описано выше, HTTPS будет работать. Если вы хотите, чтобы HTTP тоже работал и перенаправлялся на HTTPS, вам нужно добавить класс @Configuration
, как показано ниже
@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;
}
Этот ответ в основном является копией моего сообщения в блоге по тому же вопросу: http://www.drissamri.be/blog/java/enable-https-in-spring-boot/
Ответ 2
Чтобы расширить Дрисс Амри блестящий ответ о том, как повторно включить BrowserSync
.
Если вы решите не поддерживать http, или если http перенаправлен на https, BrowserSync
не будет работать. Чтобы заставить его работать снова, необходимо внести несколько изменений:
-
gulp/config.js,
apiPort
иuri
:apiPort: 8443, uri: 'https://localhost:',
-
gulp/serve.js: добавьте
options.rejectUnauthorized = false;
вproxyRoutes
, чтобы node не жаловался на самоподписанный сертификат:proxyRoutes.map(function (r) { var options = url.parse(baseUri + r); options.route = r; options.preserveHost = true; options.rejectUnauthorized = false; return proxy(options); }));
-
необязательно
BrowserSync
также показывать содержимое по https. Я рекомендую сSpring Social
сохранить некоторые проблемы. Просто добавьтеhttps: true
вBrowserSync
вызов в gulp/serve.js:browserSync({ open: true, port: config.port, server: { baseDir: config.app, middleware: proxies }, https: true });
Теперь BrowserSync будет обслуживать контент с самозаверяющим сертификатом, поставляемым вместе с ним. Можно повторно использовать созданный для
Spring Boot
, больше на домашней странице BrowserSync.
Ответ 3
Для тех, кто использует веб-пакет вместо gulp, вы можете выполнить ответ Дрисса Амри с двумя изменениями:
измените proxy.conf.json:
{
"*": {
"target": "https://localhost:8443",
"secure": true
}
}
это перенаправит запросы API на новый https-адрес. Затем измените также файл webpack, например, пример 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
}]
},