白話Https一文中, 介紹了Https存在的目的和工做原理,但可能是偏向於原理性的介紹,本文介紹如何一步一步自制一個可以經過瀏覽器認證的Https證書,並講解在Spring Boot環境和Nginx環境中服務器端的配置。java
若是你尚未讀過白話Https,我強烈建議你先去讀一下。按照白話Https中的介紹,Https協議涉及到的主體主要有三個:客戶端、服務端、以及CA機構。以下圖所示:nginx
在白話Https一文中,曾介紹一個服務要申請使用Https的流程。本文所介紹的流程,針對自制Https證書,更多的面向測試場景,固然了,有些網站,好比像12306這樣的,也會自制根證書要求用戶安裝。既然是要DIY,固然也要分別在三個主體上作工做。git
openssl genrsa -out ca.key 2048
openssl req -x509 -new -key ca.key -out ca.crt
注意生成過程當中須要輸入一些CA機構的信息github
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
注意生成過程當中須要你輸入一些服務端信息web
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
關於sha256,默認使用的是sha1,在新版本的chrome中會被認爲是不安全的,由於使用了過期的加密算法。算法
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12
生成過程當中,須要建立訪問密碼,請記錄下來。spring
keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
生成過程當中,須要建立訪問密碼,請記錄下來。chrome
keytool -importcert -keystore server.jks -file ca.crt
無論經過什麼瀏覽器吧,總之你要找到下面這個頁面,點擊導入,將上面生成的CA機構的ca.crt導入到收信任的根證書頒發機構列表中。瀏覽器
注意,收信任的根證書頒發機構列表是操做系統級的,無論經過哪一個瀏覽器進入配置,都是隻須要配置一次,再使用其它瀏覽器時,無需重複配置。安全
Spring Boot爲web容器提供了統一的抽象配置,無論你使用的是Tomcat是Jetty仍是其它web容器,若是要在Spring Boot中使用Https,你只須要在你的配置類中,添加以下代碼,註冊一個EmbeddedServletContainerCustomizer Bean便可。
須要用到上面生成的Server.jks文件。
@Configuration public class WebConfig { @Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { Ssl ssl = new Ssl(); ssl.setKeyStore("Server.jks"); ssl.setKeyStorePassword("passwd"); container.setSsl(ssl); container.setPort(8443); } }; } }
若是要在Nginx中使用Https,須要用到上面生成的Server.crt,Server.key。
server { listen 127.0.0.1:443 ssl; ssl on; ssl_certificate Server.crt; ssl_certificate_key Server.key; #省略無關配置... }