記一次服務器配置https過程

之前配置HTTPS協議都是直接網上找例子照搬,最近配置公司服務器時發現分佈式服務配置存在很多問題,於是寫一下配置過程,記錄一下

分佈式系統中大部分會使用到nginx+tomcat實現服務部署及負載均衡,尤其時springboot流行起來後,直接一個jar包放到服務器運行,使用內置tomcat,今天主要就是從一下幾個模塊開講。

  • nginx配置https
  • tomcat配置https
  • springboot配置https

首先我們需要了解一下
https和http的區別:
HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因此,HTTP協議不適合傳輸一些敏感信息。
爲了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS,爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。
HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全
HTTPS協議的主要作用可以分爲兩種:一種是建立一個信息安全通道,來保證數據傳輸的安全;另一種就是確認網站的真實性。
主要區別:

  • https協議需要到CA申請證書,一般免費證書較少,因而需要一定費用,也可以自己生成,但不安全。
  • http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl/tls加密傳輸協議
  • http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443
  • http的連接很簡單,是無狀態的;HTTPS協議是由SSL/TLS+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

瞭解了兩者的不同,我們就開始今天的主要內容了
考慮到開發環境和部署環境的不同,我們分兩步介紹nginx的https配置
1)windows服務器下搭建nginx的https

  • 安裝OpenSSL
    OpenSSL下載地址
    直接運行安裝即可,配置環境變量:
    新增環境變量
    變量名:OPENSSL_HOME
    變量值:C:\OpenSSL-Win64\bin;
    修改Path變量結尾添加一條: %OPENSSL_HOME%

  • 安裝Nginx(請自行百度,不再介紹)
    nginx官網
    進入到nginx目錄下,雙擊nginx.exe文件即可啓動服務器。
    在瀏覽器地址欄輸入http://localhost,如果可以成功訪問到Nginx的歡迎界面,則說明安裝成功

  • 生成證書
    首先在Nginx安裝目錄中創建ssl文件夾用於存放證書
    執行cmd cd到nginx/config/ssl目錄
    創建私鑰:openssl genrsa -des3 -out buduhuisi.key 1024 兩次輸入密碼,記住密碼,後邊會用到

創建csr證書:openssl req -new -key buduhuisi.key -out buduhuisi.csr

去除密碼校驗:複製buduhuisi.key並重命名爲buduhuisi.key.org然後執行命令以去除口令:
openssl rsa -in buduhuisi.key.org -out buduhuisi.key
這裏需要輸入上邊記錄的密碼了

生成crt證書:openssl x509 -req -days 365 -in buduhuisi.csr -signkey buduhuisi.key -out buduhuisi.crt
至此證書就生成完畢了

  • 修改Nginx的nginx.conf配置文件
server {
    listen       443 ssl; #直接放到端口後面可同時使用http和https
    #ssl on; 開啓https
    server_name  localhost;

    ssl_certificate      C://nginx//config//ssl//buduhuisi.crt; 
    ssl_certificate_key  C://nginx//config//ssl//buduhuisi.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
      root   html;               
      index  index.html index.htm;  
    }
}

2)liunx服務器下搭建nginx的https(我已安裝nginx,所以直接添加模塊)

#跳轉到nginx路徑
cd /usr/local/nginx/sbin
#nginx 模塊
./nginx -V
  • 安裝ssl模塊
#切換到源碼包
cd /usr/local/src/nginx-1.11.3
#重新配置nginx,加載ssl模塊
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#重新編譯,這裏不需要make  install,否則會覆蓋安裝
make
#備份原有安裝的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
#覆蓋新的nginx
cp ./objs/nginx /usr/local/nginx/sbin/ 
#提示是否覆蓋,輸入Y
#重啓nginx 
./nginx
#查看模塊信息
./nginx -V
  • 生成證書
    創建服務器證書密鑰文件 server.key:openssl genrsa -des3 -out server.key 1024
    輸入密碼,確認密碼,自己隨便定義,但是要記住,後面會用到

創建服務器證書的申請文件 server.csr:openssl req -new -key server.key -out server.csr
按要求填寫信息

備份一份服務器密鑰文件:cp server.key server.key.org

去除文件口令:openssl rsa -in server.key.org -out server.key

生成證書文件server.crt:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

  • 修改配置文件
server{
		#比起默認的80 使用了443 默認 是ssl方式  多出default之後的ssl
        listen 443 default ssl; #default 可省略
		#開啓  如果把ssl on;這行去掉,ssl寫在443端口後面。這樣http和https的鏈接都可以用
        ssl on;
		#證書(公鑰.發送到客戶端的)
        ssl_certificate ssl/server.crt;
        ssl_certificate_key ssl/server.key;
        server_name www.daj.com;
        location / {
        	proxy_redirect off;
			proxy_pass https://www.tao.com/;  
        }       
}

有時候我們的服務是nginx+tomcat的,所以我們需要開啓tomcat對https的支持,當然也可以直接配置證書到tomcat開啓服務的https
開啓tomcat的https支持:
(1)Connector節點加入 redirectPort="443" proxyPort="443" //結合實際業務
(2)加入新的Value節點

<Valve className="org.apache.catalina.valves.RemoteIpValve"
	remoteIpHeader="x-forwarded-for"
	remoteIpProxiesHeader="x-forwarded-by"
	protocolHeader="x-forwarded-proto"/>

至此nginx配置https完成

接下來我們來實現tomcat服務器的https配置

  • 生成證書(使用jdk生成,免費)
    (1)在jdk的安裝目錄\bin\keytool.exe下打開keytool.exe

    (2)執行命令:keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"

    (3)按要求填寫對應信息後執行完畢,到指定目錄查找證書文件

  • 修改tomcat服務器配置server.xml
    定位到tomcat服務器的安裝目錄, 找到conf下的server.xml文件,修改端口配置

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
               maxThreads="150" scheme="https" secure="true"  
               clientAuth="false" sslProtocol="TLS"   
        keystoreFile="g:\tomcat.keystore"  
        keystorePass="123456" /> 
  • 重啓tomcat,訪問https://localhost:8443/

至此tomcat配置https完成

最後一塊內容,修改springboot的內置服務器使用https

  • 證書創建直接參考上述tomcat證書的生成流程
  • 修改配置application.yml
server.port=8083
server.ssl.key-store=server.keystore //證書位置
server.ssl.key-alias=tomcat
server.ssl.enabled=true
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS

證書可以放在絕對路徑也可以放到系統的根路徑下

  • 配置http訪問自動轉https訪問(可以不做,同時支持http和https請求
    向spring容器中注入兩個Bean,代碼如下
 @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
        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(connector);
        return tomcat;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章