web-dev-qa-db-ja.com

jHipsterサンプルアプリに自己署名SSL証明書を追加する方法

サンプルjHipsterアプリを作成しました。次に、自己署名SSL証明書を追加し、ローカルでテストしてhttpsにアクセスできるようにします。これを達成する方法は?

31
Raj

これらの手順は、JHipsterのベースとなっているすべてのSpring Bootアプリケーションに適用されます。新しく生成された JHipster 2.7 プロジェクトでこれをテストしました。

最初から始める場合は、次の手順を完了する必要があります。

  1. 自己署名証明書を生成する
  2. Spring Boot documentation で説明されているように、SSLプロパティをapplication.propertiesまたはapplication.ymlに追加します
  3. (オプション)HTTPをHTTPSにリダイレクトする

自己署名証明書の生成

まず、プロジェクトディレクトリで自己署名証明書を生成する必要があります。これは、Javaが提供するユーティリティスクリプトであるkeytoolを使用して実行できます。

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が表示されます。

Spring Boot documentation で説明されているように、SSLプロパティをapplication.propertiesまたはapplication.ymlに追加します

次に、TomcatのHTTPSコネクタプロパティを追加する必要があります。プロパティ(yml)ファイルはsrc/main/resources/にあり、application.ymlを更新する必要があります(または、次のプロパティを使用してapplication-dev.ymlでの開発専用の場合:

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

これで、mvn clean packageを使用してアプリケーションをMaven(またはJHipsterアプリケーション用に選択した場合はGradle)でパッケージ化し、mvn spring-boot:runを使用してアプリケーションを実行できます。 https:// localhost:808でアプリケーションにアクセスできるようになりました

簡単にするためにポートは変更しませんでしたが、理想的にはプロパティファイルでも変更する必要がありますが、application-dev.ymlおよびapplication-prod.ymlで既に定義されているため、変更する必要があります。そこに入れるか、削除して一般的なapplication.ymlに入れます


(オプション)HTTPへのリダイレクトHTTPの追加

application.propertiesを介して1つのプロトコルのみを有効にできるため、上記のようにこれを行うと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/

70
Driss Amri

BrowserSyncを再度有効にする方法について Driss Amriの素晴らしい回答 を拡張するには。

Httpをサポートしないことを選択した場合、またはhttpがhttpsにリダイレクトされた場合、BrowserSyncは機能しません。再び機能させるために、以下の変更はほとんど必要ありません。

  1. gulp/config.jsapiPortおよびuri

    apiPort: 8443, 
    uri: 'https://localhost:',
    
  2. gulp/serve.jsoptions.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をgulp/serve.jsのbrowserSync呼び出しに追加するだけです:

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

    これで、BrowserSyncは、出荷時に自己署名証明書を使用してコンテンツを提供します。 Spring Boot用に作成されたものを再利用できます。詳細は BrowserSyncホームページ をご覧ください。

5
Michal Foksa

Gulpの代わりにwebpackを使用している場合は、 Driss Amri's answerを2つの変更で完了することができます。

変更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
    }]
},
1
A. Masson