Spring boot 配置 SSL證書

背景

如今在作的項目,一部分功能時創建在小程序上的,因此就不得不面臨一個問題,就是小程序在發起請求,請求後臺的時候,只能使用https,會對服務器的域名進行https證書校驗,因此,咱們就不得不去考慮配置證書的問題。web

這裏須要先聲明一下,因爲我這裏尚未一個域名證書,因此使用的是本地 自簽證書自簽證書只能在開發的時候使用,一旦小程序上線,證書將會失效。
你們能夠經過各類途徑獲取到證書,而後配置的過程基本一致,本身配置的時候注意替換就行了。

自簽證書

爲了開發試驗,咱們須要本地生成一個自簽證書。咱們直接使用JDK自帶的keytool工具來生成證書。spring

首先先找到jdk的bin目錄:apache

clipboard.png

而後命令行進入文件對應的路徑,輸入以下命令:編程

keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

而後按照提示,輸入相應的信息:小程序

clipboard.png

要注意記住 祕鑰庫口令,這個後面會用到

最後,就會在當前目錄下生成一個證書:瀏覽器

clipboard.png

配置application.properties

先將咱們生成的證書移到項目目錄下:tomcat

clipboard.png

而後配置application.properties文件:安全

# SSL證書相關配置
# https加密端口
server.port=7443
# 證書路徑
server.ssl.key-store=classpath:keystore.p12
# 證書祕鑰
server.ssl.key-store-password=生成證書時候輸入的密鑰庫口令
# 證書類型
server.ssl.key-store-type=PKCS12
# 證書別名
server.ssl.key-alias=tomcat

細心的讀者會發現這裏的配置和咱們上面建立證書時使用的命令式對應的。服務器

重定向http到https

由於咱們原來的請求方式都是http, 如今咱們想使用https,就須要作一下重定向,不能跟以前的衝突。app

package com.yunzhiclub.alice;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class AliceApplication {

    public static void main(String[] args) {
         SpringApplication.run(AliceApplication.class, args);
    }

    /**
     * 配置一個 TomcatServletWebServerFactory bean
     * 將http 重定向到 https
     * @return
     */
    @Bean
    public TomcatServletWebServerFactory servletContainer() {

        TomcatServletWebServerFactory  tomcat = new TomcatServletWebServerFactory () {

            @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;
    }

    /**
     * 讓咱們的應用支持HTTP是個好想法,可是須要重定向到HTTPS,
     * 可是不能同時在application.properties中同時配置兩個connector,
     * 因此要以編程的方式配置HTTP connector,而後重定向到HTTPS connector
     * @return Connector
     */
    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8080); // http端口
        connector.setSecure(false);
        connector.setRedirectPort(7443); // application.properties中配置的https端口
        return connector;
    }
}

測試

在瀏覽其中請求一下後臺接口

clipboard.png

正確請求。

總結

本身生成的證書,會被瀏覽器看作不安全的,因此要上線的項目,仍是去申請一個正規的SSl證書吧。


相關參考:
https://blog.csdn.net/MasonQA...
https://blog.csdn.net/m0_3812...

相關文章
相關標籤/搜索