springboot+apache前後端分離部署https

一句話概括:現在網站訪問基本都需要使用https訪問,否則瀏覽器就會報不安全提示,本文針對springboot+apache前後端分離的項目的https設置與部署進行說明。

1. 引言

當前訪問互聯網上的應用,基本都使用https了,否則瀏覽器會提示不安全,存在信息安全風險,還影響用戶體驗。最近公司需要對當前http訪問的項目進行https部署,當前項目是使用前後端分離,後端使用springboot,前端使用apache,本文將對部署過程進行記錄,並對https及相關知識做一下梳理,主要包括以下內容:

  • 對https、證書、openssl和keytool進行簡要解釋,瞭解相關概念。
  • 使用openssl及keytool自簽證書
  • 對springboot項目添加https訪問支持
  • 對apache添加https訪問支持

2. 瞭解https、證書、openssl及keytool

2.1 https

2.1.1 什麼是https

使用http已經可以完成功能,爲什麼還需要使用https,原因是使用http傳輸的內容是明文的,明文的數據傳輸容易被攔截,造成數據容易被修改,數據內容容易泄露的危險,如何解決這種不安全問題,當然是需要對數據進行加密傳輸,於是,就有了https。https是Hyper Text Transfer Protocol over Secure Socket Layer的縮寫,表示安全的超文本傳輸協議,它基於SSL/TLS協議對傳輸的數據進行加密,以保證傳輸過程中的安全性,所以https協議=SSL/TLS+http協議

2.1.2 https解決什麼問題

一般對於信息安全問題,主要需要解決三大問題:身份明確性,數據保密性,數據完整性,因此,https針對這三個問題的解決方法是(1)使用數字證書識別身份;(2)使用加密技術(對稱加密和非對稱加密)保證數據保密性;(3)使用數據簽名防止數據被篡改;具體這裏涉及到對稱加密,非對稱加密,數字簽名,數字證書及SSL/TLS的運行原理等概念,此處不詳細展開,可以參考文章《一文看懂HTTPS、證書機構(CA)、證書、數字簽名、私鑰、公鑰》和《SSL/TLS協議運行機制的概述》。

2.2 證書

2.2.1 證書內容

剛纔已經說到,https是使用數字證書來識別身份,即確定當前訪問的服務器是真的。數字證書由權威的頒發機構(CA)在驗證服務器身份後頒發的一種數字證書,內容包含加密後服務器的公鑰、權威機構的信息、有效期,證書內容的數字簽名(通過Hash函數計算得到證書數字摘要,然後用權威機構私鑰加密數字摘要得到數字簽名),簽名計算方法以及證書對應的域名。最重要的是服務器的公鑰,另外,這裏所說的CA可以是商用的,也可以自建來私有使用(只是自建的CA生成的證書瀏覽器不公認)。

公鑰、私鑰是非對稱加密中的概念:公鑰(public key)是對外開放的,私鑰(private key)是自己擁有的。公鑰加密的數據,只能用私鑰解密。私鑰加密的數據,只能用公鑰解密。

2.2.2 驗證證書過程

數字證書是使用數字簽名來識別身份。當客戶端收到服務器的證書之後,使用CA的公鑰對證書本身進行解密得到服務端的公鑰和證書的數字簽名,數字簽名經過CA公鑰解密得到證書信息摘要。然後證書籤名的方法計算一下當前證書的信息摘要,與收到的信息摘要作對比,如果一樣,表示證書一定是服務器下發的,沒有被中間人篡改過。詳細可參見《數字證書基本知識總結》、《Java 和 HTTP 的那些事(四) HTTPS 和 證書》、《一次看懂 Https 證書認證

2.2.3 證書種類

前面使用到的證書從使用者來看,分別有CA證書,服務端(server)證書和客戶端(client)證書。其中,CA證書作爲根證書,由它來簽發server證書和client證書,也由它的公鑰和私鑰對server證書和client證書進行識別。server證書的公鑰和私鑰用於https通信過程數據加解密等操作。一般對於服務器的單向認證,只需要CA證書和服務端證書。

按證書格式分,X.509#DER二進制格式證書,常用後綴.cer .crt;X.509#PEM文本格式證書,常用後綴.pem;有的證書內容是隻包含公鑰(服務器的公鑰),如.crt、.cer、.pem;有的證書既包含公鑰又包含私鑰(服務器的私鑰),如.pfx、.p12

2.3 openssl

openssl 是一套密碼庫工具,用以支持SSL/TLS 協議的實現,可以用它生成證書,進行數據加解密,計算消息摘要等等。通過它可以進行自簽名證書(把自己當作CA機構),實現https訪問。本文使用的就是這種方式。一般linux已自帶安裝,沒有安裝的需要下載安裝。

2.4 keytool

keytool是一個Java數據證書的管理工具 ,位置是在java安裝目錄下的bin目錄。keytool將密鑰(key)和證書(certificates)存在一個稱爲keystore的文件中。 注意keystore不僅可以存儲數字證書,還可以存儲密鑰。存儲在 Keystore 文件中的對象有三種類型:Certificate、PrivateKey 和 SecretKey 。Certificate 就是證書,PrivateKey 是非對稱加密中的私鑰,SecretKey 用於對稱加密,是對稱加密中的密鑰。因此,對於java應用中,可以直接使用keytool即可生成相應的keystore進行https設置。

3. 自簽證書

瞭解了基本概念後,現在開始動手進行https部署。第一步是先進行自簽證書,這裏使用openssl生成證書,然後使用keytool生成相應的keystore文件。

以下命令操作在linux下完成,做的是服務端單向認證

3.1 證書生成過程

3.1.1 自建CA證書

# 生成根證書私鑰
openssl genrsa -des3 -passout pass:111111 -out ca.key 2048

# 簽發根證書
openssl req -new -x509 -days 3650 -passin pass:111111 -key ca.key -out ca.crt -subj "/C=CN/ST=GD/L=GZ/O=test/OU=test/CN=${ip或域名}"

說明,上述操作中:

  • pass:111111表示ca證書的密碼,可以自定義,這樣可以避免以交互方式輸入密碼,密碼可以自定義。
  • 參數-subj 中,CN爲根證書的域名,請根據實際情況填寫。
  • 由於是自籤,參數days可以隨便填數量。

3.1.2 CA簽發服務端證書

# 生成服務器證書私鑰
openssl genrsa -des3 -passout pass:111111 -out server.key 2048
# 生成服務器證書請求
openssl req -new \
    -sha256 \
    -key server.key \
    -passin pass:111111 \
    -subj "/C=CN/ST=GD/L=GZ/O=test/OU=test/CN=${ip或域名}" \
    -reqexts SAN \
    -config <(cat /path/to/openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=IP:${ip或域名}")) \
-out server.csr
# 簽發服務器證書
openssl ca -in server.csr \
    -days 3650 \
    -passin pass:111111 \
        -md sha256 \
        -keyfile ca.key \
    -cert ca.crt \
    -extensions SAN \
    -config <(cat /path/to/openssl.cnf \
        <(printf "[SAN]\nsubjectAltName=IP:${ip或域名}")) \
-out server.crt 

說明,上述操作中:

  • 參數-subj 中,CN爲根證書的域名,請根據實際情況填寫。
  • /path/to/openssl.cnf,請根據實際的openssl.cnf位置修改。
  • 參數[SAN]\nsubjectAltName,若使用IP,則以IP:開頭,若是域名,使用DNS:開頭。

3.1.3 證書存入keystore文件

# 生成服務器證書轉pkcs12
openssl pkcs12 -export -in server.crt -passin pass:111111 -passout pass:111111 -inkey server.key -out server.pkcs12

# pkcs12轉keystore 
keytool -importkeystore -v -srckeystore server.pkcs12 -srcstoretype pkcs12 -srcstorepass 111111 -destkeystore server.jks -deststoretype jks -deststorepass 111111 -noprompt

至此,我們已經生成了後面需要使用到的ca.crtserver.keyserver.crtserver.jks

3.2 證書生成注意事項

mkdir -p /etc/pki/CA
  cd /etc/pki/CA
touch index.txt
  touch serial
  echo 01 > serial 
  • 遇到類似”update database“錯誤,則清空index.txt內容再重新執行命令。

4. 後端springboot工程添加https訪問

4.1 springboot工程添加ssl配置項

java工程使用keystore進行證書管理,先把server.jks放到springboot工程的resource目錄下。然後在springboot配置文件application.properties添加以下配置:

# https訪問端口
server.port=443
server.ssl.key-store=server.jks
server.ssl.key-alias=server
server.ssl.enabled=true
server.ssl.key-store-password=111111
server.ssl.key-store-type=JKS

4.2 添加內置tomcat的http轉發https

如果是使用tomcat部署,其實直接在tomcat的配置文件中進行配置https的connector即可。對於springboot,一般我們通過添加配置文件,以實現對tomcat的配置修改。新建TomcatConfig.java文件,添加以下代碼:

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

@Bean
public Connector connector(){
    Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    //http端口
    connector.setPort(8080);
    connector.setSecure(false);
    // https端口,即server.port
    connector.setRedirectPort(serverPort);
    return connector;
}

說明,此處新建了http的Connector,並把http的訪問都轉發到https,這樣,當用戶訪問http時直接跳轉爲https。若需要http和https同時使用,則把setRedirectPort去掉即可。

5. 前端apache添加https訪問

5.1 apached.conf添加ssl支持

5.1.1 啓用需要的模塊

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule ssl_module        modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

5.1.2 引入ssl配置

使用Include引入ssl配置,如下:

 Include conf/extra/httpd-ssl.conf

5.1.3 修改配置Directory

把允許重寫設置爲All,把AllowOverride None 改爲 AllowOverride all

<Directory "/root/path/">
   Options Indexes FollowSymLinks
   AllowOverride all
   Require all granted
</Directory>

5.2 httpd-ssl.conf 添加ssl配置

前端已經引入httpd-ssl.conf文件,因此,需要對此文件進行ssl配置。如下:

# 啓用https端口
Listen 443 https
# 啓用SSL並設置服務端證書及私鑰
SSLEngine on
SSLCertificateFile "/path/to/server.crt"
SSLCertificateKeyFile "/path/to/server.key"

說明:根據實際情況設置證書路徑。

5.3 添加http轉發https

在網站目錄下創建一個.htaccess文件,寫入如下規則,把全部80端口的請求都轉發到本機的https對應的端口(默認443):

RewriteEngine On
RewriteCond %{SERVER_PORT} 80     
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

5.4 訪問後端接口地址添加https地址

前端需要調用後端接口,由於已經改爲使用https通信,因此,調用接口需要從原來http地址,改爲https訪問的端口。上述全部配置完成後,重啓apache即可(重啓需要輸入server.key對應的密碼)

6. 客戶端添加證書

最後,由於使用的是自簽名的證書,瀏覽器不認識這證書,因此,需要把自籤的CA證書添加到瀏覽器中,才能正常訪問。以chrome瀏覽器爲例,設置-》高級》隱私設置和安全性》管理證書》受信息的根證書頒發機構,導入ca.crt。這樣,就可以愉快地使用https,不提示安全問題了。

7. 總結

本文通過操作實例進行了對springboot+apache前後端分離項目的https部署,先對https、證書、openssl及keytool進行初步的瞭解,然後通過openssl和keytool生成證書及keystore,接着對後端springboot及前端的apache分別進行配置。希望可以幫助到同樣需要進行https部署的同學。

參考資料

往期文章

關注我的公衆號(搜索Mason技術記錄),獲取更多技術記錄:

Mason技術記錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章