Я создал образец приложения jHipster. Теперь я хочу добавить самоподписанный SSL-сертификат и проверить локально, чтобы иметь доступ к https. Как этого добиться?
Как добавить самоподписанный SSL-сертификат в пример приложения jHipster?
Ответы (3)
Эти инструкции применимы ко всем приложениям Spring Boot, на которых основан JHipster. Я проверил это на недавно сгенерированном JHipster 2.7 проект.
При запуске с нуля необходимо выполнить следующие шаги:
- Генерация самоподписанного сертификата
- Добавьте свойства SSL в ваш application.properties или application.yml, как указано в Документация по Spring Boot
- (Необязательно) Перенаправить HTTP на HTTPS
Генерация самоподписанного сертификата
Сначала вам нужно сгенерировать свой самозаверяющий сертификат в каталоге вашего проекта, это можно сделать с помощью keytool
, который является служебным скриптом, предоставляемым 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 Boot
Теперь вам нужно добавить свойства коннектора 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/
Чтобы расширить Driss Amri блестящий ответ о том, как снова включить BrowserSync
.
Если вы решите не поддерживать http или если http будет перенаправлен на https, BrowserSync
не будет работать. Чтобы он снова заработал, необходимо внести несколько изменений в:
gulp/config.js,
apiPort
иuri
для:apiPort: 8443, uri: 'https://localhost:',
gulp/serve.js: добавьте
options.rejectUnauthorized = false;
вproxyRoutes
, чтобы узел не жаловался на самоподписанный сертификат: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.
Для тех, кто использует веб-пакет вместо gulp, вы можете заполнить Ответ Дрисса Амри с двумя изменениями:
измените proxy.conf.json:
{
"*": {
"target": "https://localhost:8443",
"secure": true
}
}
это перенаправит запросы API на новый адрес https. Затем измените также файл веб-пакета, например, здесь модифицированный пример 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
}]
},