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
- 2.1 https
- 3. 自簽證書
- 3.1 證書生成過程
- 3.1.1 自建CA證書
- 3.1.2 CA簽發服務端證書
- 3.1.3 證書存入keystore檔案
- 3.2 證書生成注意事項
- 3.1 證書生成過程
- 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地址
- 5.1 apached.conf新增ssl支援
- 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.crt
,server.key
,server.crt
,server.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 都已經為我們封裝好了,我們只需要按照一定的規則去編寫響應的程式碼即可…