日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

要讓項目實現 ssl 免密登錄,首先需要開啟 https 。

所以先從 Spring Boot 如何開啟 https 說起。

創建服務端證書

為了開啟 https ,我們需要一份證書。

實際開發中,會在網上申請一個機構頒發的證書。這里為了方便,我會使用 openssl 命令自己生成一個證書來使用。

openssl req -x509 -sha256 -days 3650 -newkey rsa:4096 -keyout rootCA.key -out rootCA.crt
用Spring Boot實現https ssl免密登錄

 

所有的密碼都是 123456 ,然后根據提示輸入相關信息就好,如果嫌麻煩也可以直接回車跳過。

這樣我們就得到了證書 rootCA.crt 和私鑰 rootCA.key 。

要在 Spring Boot 中實現服務器端 X.509 身份驗證,還需要給我們的服務端也生成一個證書。

openssl req -new -newkey rsa:4096 -keyout localhost.key -out localhost.csr

同樣,密碼是 123456 ,文件名 localhost 可以自行修改。

接下來就是用 rootCA 給我們的服務端證書做簽名了,在此之前,我們先寫一個配置文件,里面寫有一些基本的配置

vi conf.config
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost

其中 DNS.1 的值就是你的域名,比如 www.segmentfault.com , localhost 等等。如果這里填錯了,訪問網站時,瀏覽器會提示網站不安全。

然后給服務端證書簽名,會提示你輸入 rootCA 的密碼

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in localhost.csr -out localhost.crt -days 365 -CAcreateserial -extfile conf.config

成功后,讓我們查看一下證書的信息

openssl x509 -in localhost.crt -text
用Spring Boot實現https ssl免密登錄

 

最后再將簽名證書和私鑰打包到 PKCS 文件中

openssl pkcs12 -export -out localhost.p12 -name "localhost" -inkey localhost.key -in localhost.crt

這條指令會要你先輸入 localhost.key 的密碼,然后再要你定義 localhost.p12 的密碼。 localhost.p12 這個密碼一定要記住,因為在 Spring 的配置文件中有用到。

另外需要特別注意的是, Spring 配置文件中 server.ssl.keyAlias 的值,就是命令中的 localhost(-name "localhost") 。

Spring Boot開啟https

把 localhost.p12 復制到 resources 目錄下之后編譯項目

用Spring Boot實現https ssl免密登錄

 

修改Application.properties文件

server.port=8888
server.ssl.key-store=classpath:localhost.p12
server.ssl.key-store-password=123456
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=localhost

在 chrome://settings/security 中,選擇 受信任的根證書頒發機構 導入 rootCA.crt

用Spring Boot實現https ssl免密登錄

 

這時啟動項目,就可以使用 https 訪問網站了,而且瀏覽器提示網站時安全的。

用Spring Boot實現https ssl免密登錄

 

創建信托證書

信托證書中會存有 信任的外部實體的證書

這里我們只要將 rootCA.crt 添加進去就可以了

keytool -import -trustcacerts -noprompt -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file rootCA.crt -keystore localhost.jks

然后將 localhost.jks 添加到項目中,并修改配置文件

用Spring Boot實現https ssl免密登錄

 

application.properties添加:

server.ssl.trust-store=classpath:localhost.jks
server.ssl.trust-store-password=123456
server.ssl.client-auth=need

注意:此時由于添加了server.ssl.client-auth=need,因為沒有添加個人證書,所以這個時候刷新頁面,項目會無法訪問,如果想要同時兼任普通登錄,可以將need改成want,但是want只會在第一次訪問頁面時才會向客戶索取個人證書

用Spring Boot實現https ssl免密登錄

 

創建客戶端證書

現在創建一個客戶端的證書,步驟和服務端的差不多一樣。

openssl req -new -newkey rsa:4096 -nodes -keyout shurlormes.key -out shurlormes.csr
用Spring Boot實現https ssl免密登錄

 

在生成客戶端證書時,那些信息不建議跳過,因為在后續的步驟中,會獲取其中的信息用以登錄。比如我在 Common Name 處填寫的信息,就是等下用來登錄的用戶名。

接下來用 RootCA 給客戶端證書簽名

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in shurlormes.csr -out shurlormes.crt -days 365 -CAcreateserial

然后再將簽名證書和私鑰打包到 PKCS 文件中

openssl pkcs12 -export -out shurlormes.p12 -name "shurlormes" -inkey shurlormes.key -in shurlormes.crt

最后在 chrome://settings/security 選擇 個人證書 把 shurlormes.p12 導入,期間會要你輸入它的密碼。

用Spring Boot實現https ssl免密登錄

 


用Spring Boot實現https ssl免密登錄

 


用Spring Boot實現https ssl免密登錄

 

這時候刷新頁面,瀏覽器就會彈出一個對話框,讓你選擇個人認證了。

用Spring Boot實現https ssl免密登錄

 

Spring Boot獲取個人證書信息

恭喜你,到了這一步, pki 登錄已經完成了 99% 了。接下來就是通過 request 獲取證書信息,然后處理字符串,拿到用戶名做登錄即可。

@RequestMapping("/login")
public String login(HttpServletRequest request) {
    X509Certificate[] certs = (X509Certificate[]) request.getAttribute("JAVAx.servlet.request.X509Certificate");
    if(certs != null) {
        X509Certificate gaX509Cert = certs[0];
        String dn = gaX509Cert.getSubjectDN().toString();
        System.out.println("個人證書信息:" + dn);
        String username = "";
        String[] dnArray = dn.split(",");
        for (String dnItem : dnArray) {
            String[] dnInfo = dnItem.split("=");
            String key = dnInfo[0];
            String value = dnInfo[1];
            if("cn".equalsIgnoreCase(key.trim())) {
                username = value;
                break;
            }
        }
        System.out.println("用戶名:" + username);

        if(!StringUtils.isEmpty(username)) {
            SecurityContext securityContext = SecurityContextHolder.getContext();
            User userDetails = new User(username, "", Collections.EMPTY_LIST);
            securityContext.setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, "", Collections.EMPTY_LIST));
            return "redirect:/";
        }

    }
    return "login";
}
用Spring Boot實現https ssl免密登錄

 


用Spring Boot實現https ssl免密登錄

 

Spring Boot 同時開啟http和https

相信大家都發現了,現在項目只能通過 https 訪問,如果用 http 訪問瀏覽器直接返回 Bad request 了。

用Spring Boot實現https ssl免密登錄

 

要同時開啟 https 和 http ,只需添加一個 TomcatConfig 就可以

@Configuration
public class TomcatHttpConfig {
    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(initiateHttpConnector());
        return tomcat;
    }

    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.Apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(9999);
        connector.setSecure(false);
        return connector;
    }
}

這時候啟動項目,注意看控制臺打印的信息。

用Spring Boot實現https ssl免密登錄

 

說明已經成功啟動 http 在端口 9999 , https 在 8888 ,頁面也可以成功訪問了。

用Spring Boot實現https ssl免密登錄

 

Spring Boot http自動跳轉https

上面我們已經可以同時訪問 htt p和 https ,但如果我要訪問 http 的時候,自動跳轉的 https 呢?

只需要在上面的基礎上稍微改改就可以了。

@Configuration
public class TomcatHttpConfig {
    @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;
    }

    private Connector initiateHttpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(9999);
        connector.setSecure(false);
        connector.setRedirectPort(8888);
        return connector;
    }
}

踩坑總結

  1. 把服務端證書 p12 文件添加到項目 resources 后,記得 rebuild 項目,否則 target 的 classes 中沒有生成證書文件,會導致項目啟動失敗。
  2. application.properties 中的 server.ssl.keyAlias 需要和生成 p12 文件的 -name 一致,否則也會導致項目無法啟動。
  3. 如果要指定域名,需要修改 conf.confg 中的 DNS.1 ,否則瀏覽器會提示網站不安全。

分享到:
標簽:https ssl
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定