1. 程式人生 > >springboot+apache前後端分離部署https

springboot+apache前後端分離部署https

目錄

  • 1. 引言
  • 2. 瞭解https、證書、openssl及keytool
    • 2.1 https
      • 2.1.1 什麼是https
      • 2.1.2 https解決什麼問題
    • 2.2 證書
      • 2.2.1 證書內容
      • 2.2.2 驗證證書過程
      • 2.2.3 證書種類
    • 2.3 openssl
    • 2.4 keytool
  • 3. 自簽證書
    • 3.1 證書生成過程
      • 3.1.1 自建CA證書
      • 3.1.2 CA簽發服務端證書
      • 3.1.3 證書存入keystore檔案
    • 3.2 證書生成注意事項
  • 4. 後端springboot工程新增https訪問
    • 4.1 springboot工程新增ssl配置項
    • 4.2 新增內建tomcat的http轉發https
  • 5. 前端apache新增https訪問
    • 5.1 apached.conf新增ssl支援
      • 5.1.1 啟用需要的模組
      • 5.1.2 引入ssl配置
      • 5.1.3 修改配置Directory
    • 5.2 httpd-ssl.conf 新增ssl配置
    • 5.3 新增http轉發https
    • 5.4 訪問後端介面地址新增https地址
  • 6. 客戶端新增證書
  • 7. 總結
  • 參考資料
  • 往期文章

一句話概括:現在網站訪問基本都需要使用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 證書生成注意事項

  • 由於Chrome 58 及以上版本只會使用 subjectAlternativeName 擴充套件程式(而不是 CN即commonName)來匹配域名和網站證書。因此,在生成證書時需要加上SAN。參考文章《OpenSSL 生成「自簽名」證書遇到的 missing_subjectAltName 問題》及《使用 OpenSSL 製作一個包含 SAN(Subject Alternative Name)的證書》

  • 遇到類似“/etc/pki/CA: No such file or directory”錯誤,解決方法是在當前目錄(如果是預設安裝的openssl,在/etc/pki/CA)執行下面命令:

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部署的同學。

參考資料

  • 一文看懂HTTPS、證書機構(CA)、證書、數字簽名、私鑰、公鑰
  • SSL/TLS協議執行機制的概述
  • 數字證書基本知識總結
  • Java 和 HTTP 的那些事(四) HTTPS 和 證書
  • 一次看懂 Https 證書認證
  • OpenSSL 生成「自簽名」證書遇到的 missing_subjectAltName 問題
  • 使用 OpenSSL 製作一個包含 SAN(Subject Alternative Name)的證書

往期文章

  • springboot+logback 日誌輸出企業實踐(下)
  • springboot+logback 日誌輸出企業實踐(上)
  • springboot+swagger 介面文件企業實踐(下)
  • springboot+swagger介面文件企業實踐(上)
  • 查閱了十幾篇學習資源後,我總結了這份AI學習路徑
  • java應用監測(8)-阿里診斷工具arthas
  • mongo同步-spring batch(8)的mongo讀寫元件使用

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

相關推薦

springboot+apache前後分離部署https

目錄 1. 引言 2. 瞭解https、證書、openssl及keytool 2.1 https 2.1.1 什麼是https 2.1.2 https解決什麼問題

springboot-整合vue,nginx前後分離部署

springboot-整合vue,nginx前後端分離部署 文章目錄 springboot-整合vue,nginx前後端分離部署 1.nginx 1.1nginx的安裝 1.2nginx的基本配置 1.3n

springBoot + vue前後分離專案如何部署到伺服器(嘗試各種方法終究是路徑問題導致無法正常登入)

第一步:命令列npm run build將前端打包成靜態檔案(一般會在dist目錄下生成static資料夾以及index.html檔案) 上圖為:config目錄index.js配置的build以及dev命令,如果你沒找到static資料夾及index.html,到這裡

java 淺析跨域問題以及如何使用Cors解決前後分離部署專案所遇到的跨域問題

隨著時間的推移,前後端分離的開發形式越來越流行,使用的公司也越來越多。但是這種開發形式也會帶來一個問題。那就是跨域問題。 什麼是跨域 跨域,指的是瀏覽器不能執行其他網站的指令碼。它是由瀏覽器的同源策略造成的,是瀏覽器對javascript施加的安全限制。

nginx反向代理html,實現前後分離部署

前後端分離開發、部署,融到一個專案中部署,修改程式碼部署較為頻繁,前端改動一小點也都需要後端一起打包部署。固想了nginx部署一個代理即可。  下載好nginx後在nginx.conf中增加如下程式碼: server { listen 8082;

Nginx+Springboot+Vue 前後分離 解決跨域問題

1:前端vue 寫完 打包 npm run build prod   2: 後端api 寫完打包 springboot mvn package -Dmaven.test.skip=true   3: nginx配置反向代理,解決跨域問題 配置如下  server

SpringBoot+Vue前後分離,使用SpringSecurity完美處理許可權問題(一)

當前後端分離時,許可權問題的處理也和我們傳統的處理方式有一點差異。筆者前幾天剛好在負責一個專案的許可權管理模組,現在許可權管理模組已經做完了,我想通過5-

SpringBoot 實現前後分離的跨域訪問(Nginx)

序言:使用Nginx反向代理,可以解決跨域無權和Session丟失的問題,十分方便。下面我們以前後端分離為案例,展開Nginx的使用教程。 一. 配置和啟動Nginx 下載地址 注意事項:下載之後,記得解壓到全英文路徑,避免中文路徑導致Nginx啟動失敗。 修改配

前後分離https站點無法通過Ajax訪問http資源(Mixed Content,The page at 'https://xxx.com' was loaded over HTTPS)

目前Web開發,大部分公司都用的是前後端分離模式,即前端專注於前端頁面互動,後端專注於功能實現及提供Web Api介面。 在某次新站點的開發過程中,為了網站的安全性,要求Web站點使用https協議,在部署到QA環境時,發現呼叫介面報如下的錯: 從提示的內容來看,大致可推斷出是因為站點是https協議

SpringBoot+Vue前後分離,使用SpringSecurity完美處理許可權問題(二)

當前後端分離時,許可權問題的處理也和我們傳統的處理方式有一點差異。筆者前幾天剛好在負責一個專案的許可權管理模組,現在許可權管理模組已經做完了,我想通過5-6篇文章,來介紹一下專案中遇到的問題以及我的解決方案,希望這個系列能夠給小夥伴一些幫助。本系列文章並不是手把

SpringBoot+Vue前後分離,使用SpringSecurity完美處理許可權問題(六)

當前後端分離時,許可權問題的處理也和我們傳統的處理方式有一點差異。筆者前幾天剛好在負責一個專案的許可權管理模組,現在許可權管理模組已經做完了,我想通過5-6篇文章,來介紹一下專案中遇到的問題以及我的解決方案,希望這個系列能夠給小夥伴一些幫助。本系列文章並不是手把

shiro配置 在springboot前後分離中,整合shiro認證授權框架

一:介紹     Apache Shiro是Java的一個安全框架。由於它相對小而簡單,現在使用的人越來越多。     Authentication:身份認證/登入,驗證使用者是不是擁有相應的身份。     Authorization:授權,即許可權驗證,驗證某個已認證

(二)nginx反向代理html,實現前後分離(部署一套html呼叫多個服務)

上篇部落格是一套頁面呼叫一個後端提供的服務,但是很多時候  我們後端會部署多個服務,為此部署配置一套nginx代理。 可以實現為nginx配置多種策略,如下說明: 負載均衡策略 1、輪詢(預設) 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能

(一)nginx反向代理html,實現前後分離部署

前後端分離開發、部署,融到一個專案中部署,修改程式碼部署較為頻繁,前端改動一小點也都需要後端一起打包部署。固想了nginx部署一個代理即可。  下載好nginx後在nginx.conf中增加如下程式碼: server { listen 8082

前後分離部署時如何保護前端程式碼不被匿名訪問

背景 現在很多專案早就採用前後端分離的方式開發和部署了。前端程式碼部署在nginx伺服器上,由nginx直接對外提供靜態檔案的服務,後端介面則由nginx做反向代理。 這本來是極為合理的部署方式,但對於一些需要登入才能進行訪問的系統,負責安全的同事就會提出如下的疑慮: index.html允許匿名訪問,別有

Nginx+uwsgi+celery+supervisor部署Django前後分離項目

and alt mkdir 動靜 系統盤 keepaliv pre tde 修改 本實驗實現了負載均衡、反向代理、動靜分離,還實現了根據客戶端設備user-agent進行轉發,也就是移動端和PC端訪問的頁面不一樣。 1. 項目部署邏輯圖 2. 環境準備 服務器:6臺VM操

Springboot 框架 gateway 前後分離 實現 zuul Ribbon 負載均衡 脫離Eureka實現

專案後臺框架是使用的springboot ,前端使用的是angularJS,中間使用gateway做一層轉發。其實也是微服務的思想。那麼在gateway這層怎麼實現負載均衡。就使用到了zuul,那麼可以使用zuul 的Ribbon來實現負載均衡。 這個是我們專案原先做了一個配置。主要是zu

前後分離專案配置Nginx、配https及http強制跳轉https

本篇文章主要解決以下幾個問題: 前後端分離專案如何配置Nginx 配置https協議訪問 開啟http訪問但強制跳轉https訪問 基本的安裝就不多說了,直奔主題。 本文基於ubuntu系統,另外假定有幾個前提條件: 主機地址為192.168

基於CAS的單點登入SSO[5]: 基於Springboot實現CAS客戶前後分離

基於CAS的單點登入SSO[5]: 基於Springboot實現CAS客戶端的前後端分離 作者:家輝,日期:2017-08-24 CSDN部落格: http://blog.csdn.net/gobitan 摘要:現在大部分系統的開發都已經

shiro,基於springboot,基於前後分離,從登入認證到鑑權,從入門到放棄

這個demo是基於springboot專案的。 名詞介紹: ShiroShiro 主要分為 安全認證 和 介面授權 兩個部分,其中的核心元件為 Subject、 SecurityManager、 Realms,公共部分 Shiro 都已經為我們封裝好了,我們只需要按照一定的規則去編寫響應的程式碼即可…