Как добавить самоподписанный SSL-сертификат в пример приложения jHipster?

Я создал образец приложения jHipster. Теперь я хочу добавить самоподписанный SSL-сертификат и проверить локально, чтобы иметь доступ к https. Как этого добиться?


person Raj    schedule 08.04.2015    source источник


Ответы (3)


Эти инструкции применимы ко всем приложениям Spring Boot, на которых основан JHipster. Я проверил это на недавно сгенерированном JHipster 2.7 проект.

При запуске с нуля необходимо выполнить следующие шаги:

  1. Генерация самоподписанного сертификата
  2. Добавьте свойства SSL в ваш application.properties или application.yml, как указано в Документация по Spring Boot
  3. (Необязательно) Перенаправить 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/

person Driss Amri    schedule 11.04.2015
comment
мне нужно сохранить файл keystore.p12 в пути к классам проекта? - person Raj; 14.04.2015
comment
Я оставил keystore.p12 в корне моего проекта и запустил его с помощью mvn spring-boot:run. Если вы поместите его в свой путь к классам, вы можете изменить свойство хранилища ключей на: key-store: classpath:keystore.p12 - person Driss Amri; 14.04.2015
comment
Если этот ответ помог вам @Raj, примите ответ :-) - person Driss Amri; 14.04.2015
comment
Привет @Driss. теперь я не могу получить доступ к примеру приложения... если я наберу 127.0.0.1:8080/# в браузере, т. е. если я наберу http://, он должен перенаправить меня на https:// - person Raj; 22.04.2015
comment
В настоящее время вы можете активировать только один протокол через свойства приложения. Если вам нужны HTTP и HTTPS, вам нужно будет активировать их программно. Я написал об этом варианте использования в блоге на http://www.drissamri.be/blog/java/enable-https-in-spring-boot/, и здесь я тоже отредактирую ответ - person Driss Amri; 22.04.2015
comment
спасибо .. Это означает, что я могу создать ContainerConfiguration.java в пакете конфигурации примера приложения jHipster и вставить фрагмент кода, упомянутый в блоге? - person Raj; 22.04.2015
comment
Да, просто убедитесь, что вы аннотируете его с помощью @Configuration - person Driss Amri; 22.04.2015
comment
спасибо, я могу запустить свое приложение с https из eclipse, но если я запущу из пакета jar, он выдаст мне ошибку порта, нужно ли мне что-то еще настраивать? - person jesicadev18; 07.06.2017
comment
@DrissAmn В вашем образце показаны keyStoreType и keyAlias ​​как два имени свойства. Должен ли он быть типом хранилища ключей и псевдонимом ключей? Это то, что показывает intellisense IntelliJ, и странно видеть имена свойств на основе тире, смешанные с именами свойств в верблюжьем регистре. - person Robert Oschler; 09.08.2017
comment
Spring Boot использует ослабленную привязку, поэтому оба способа работают. Но было бы разумнее выбрать один путь и последовательно придерживаться его в реальном проекте. - person Driss Amri; 10.08.2017
comment
Может кто-нибудь добавить импорт для перенаправления кода HTTP на HTTPS? - person user3364181; 06.08.2018
comment
Я сделал все шаги кроме последнего, так как вы не поставили импорт и он не работает: prntscr.com/kfb2ni - person user3364181; 06.08.2018
comment
Я знаю, что это может быть слишком поздно, но я выполнил все шаги и получаю: Ваше соединение не является частным. Кстати, я запускаю сервер в профиле dev. - person boandriy; 28.08.2018

Чтобы расширить Driss Amri блестящий ответ о том, как снова включить BrowserSync.

Если вы решите не поддерживать http или если http будет перенаправлен на https, BrowserSync не будет работать. Чтобы он снова заработал, необходимо внести несколько изменений в:

  1. gulp/config.js, apiPort и uri для:

    apiPort: 8443, 
    uri: 'https://localhost:',
    
  2. 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);
    }));
    
  3. опционально разрешите 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.

person Michal Foksa    schedule 04.11.2016

Для тех, кто использует веб-пакет вместо 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
    }]
},
person A. Masson    schedule 16.10.2017
comment
А прод? webpackprod.prod.js ? Поскольку ответ Дрисса Амри у меня не работает, что я могу там изменить? - person user3364181; 06.08.2018
comment
Webpack использует переменные среды, как описано здесь: atendesigngroup.com/blog/ поэтому, например, в этом случае имя будет webpack.prod.js - person A. Masson; 07.08.2018