由于CA收費,所以可以自建CA,通過將CA匯入瀏覽器實作https的效果,曾經12306購票就需要自行匯入網站證書,
關于https
2015年阿里巴巴將旗下淘寶、天貓(包括移動客戶端)全站啟用HTTPS加密,并順利通過“雙十一”考驗,成為全球最大的電商平臺全站HTTPS改造案例,
全站HTTPS需要解決3大問題,
首先是性能,主要分三點:
- HTTPS需要多次握手,因此網路耗時變長,用戶從HTTP跳轉到HTTPS需要一些時間;
- HTTPS要做RSA校驗,這會影響到設備性能;
- 所有CDN節點要支持HTTPS,而且需要有極其復雜的解決方案來面對DDoS的挑戰,
其次,兼容性及周邊:
- 頁面里所有嵌入的資源都要改成HTTPS的,這些資源可能會來自不同的部門甚至不同的公司,包括圖片、視頻、表單等等,否則瀏覽器就會警告;
- 移動客戶端(APP)也需要適配HTTPS,所以必須做調整修改;
- 解決第三方網站看不到Referer的問題;
- 所有的開發、測驗環境都要做HTTPS的升級;
最后,為保證上線時的順利切換,需要提前準備大量的預案,以應對各種可能出現的情況,
目前為止,國內大部分主流網站都已經完成了HTTP到HTTPS的遷移,如淘寶、京東、百度、B站、優酷等,仍在使用HTTP的有騰訊視頻、愛奇藝、當當等網站,
以下先簡介https與加密原理
https簡介
HTTPS (全稱:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全為目標的 HTTP 通道,在HTTP的基礎上通過傳輸加密和身份認證保證了傳輸程序的安全性,
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網路通信提供安全及資料完整性的一種安全協議,
HTTPS 在HTTP 的基礎上加入SSL 層,以SSL加密技術為安全基礎, HTTPS 與HTTP的默認埠不同,并存在一個加密/身份驗證層(在 HTTP與 TCP 之間,即應用層與傳輸層之間),
SSL協議可分為兩層:
- SSL記錄協議(SSL Record Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供資料封裝、壓縮、加密等基本功能的支持,
- SSL握手協議(SSL Handshake Protocol):它建立在SSL記錄協議之上,用于在實際的資料傳輸開始前,通訊雙方進行身份認證、協商加密演算法、交換加密密鑰等,

搭建https的流程主要與SSL握手協議有關,

為什么要從http遷移到https
HTTP協議傳輸的資料都是未加密的,也就是明文的,因此使用HTTP協議傳輸隱私資訊非常不安全,為了保證這些隱私資料能加密傳輸,于是網景公司設計了SSL(Secure Sockets Layer)協議用于對HTTP協議傳輸的資料進行加密,從而就誕生了HTTPS,
簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比HTTP協議安全,
HTTPS和HTTP的區別主要如下:
1、https協議需要到CA(Certificate Authority 即頒發數字證書的機構)申請證書,一般免費證書較少,因而需要一定費用,
2、http是超文本傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議,
3、http和https使用的是完全不同的連接方式,用的埠也不一樣,前者是80,后者是443,
4、http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比HTTP協議安全,
通信加密簡介
對稱加密
采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作資訊的加密和解密,也稱為單密鑰加密,
舉例:凱撒密碼
凱撒密碼是羅馬擴張時期朱利斯? 凱撒(Julius Caesar)創造的,用于加密通過信使傳遞的作戰命令,它將字母表中的字母移動一定位置而實作加密,例如如果向右移動 2 位,則 字母 A 將變為 C,字母 B 將變為 D,…,字母 X 變成 Z,字母 Y 則變為 A,字母 Z 變為 B,
優點:
演算法公開、計算量小、加密速度快、加密效率高,
缺點:
如果一方的密鑰被泄露,加密資訊也就不安全了,
非對稱加密
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰),
公鑰與私鑰是一對,如果用公鑰對資料進行加密,只有用對應的私鑰才能解密,相反,也可以先用私鑰加密,再使用公鑰解密,因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法,
非對稱加密演算法實作機密資訊交換的基本程序是:
甲方生成一對密鑰并將公鑰公開,需要向甲方發送資訊的其他角色(乙方)使用該密鑰(甲方的公鑰)對機密資訊進行加密后再發送給甲方;甲方再用自己私鑰對加密后的資訊進行解密,甲方想要回復乙方時正好相反,使用乙方的公鑰對資料進行加密,同理,乙方使用自己的私鑰來進行解密,
優點:
一方密鑰的丟失不會導致通信被破解,相對更安全,
缺點:
加密和解密花費時間長、速度慢,只適合對少量資料進行加密,
使用場景
模擬一個通信場景:
有A、B、C、D四個用戶,A想讓B、C、D與自己進行私密通信,
如果使用對稱加密,則A-B、A-C、A-D之間分別需要協商一份密鑰,
如果使用非對稱加密,則只需要A保留私鑰,將自己的公鑰分發給B、C、D,
無論B、C、D哪一方使用公鑰加密訊息,都只有A才能用私鑰解密,
安全性考慮:
通信前需要提前協商密鑰,
-
使用對稱加密
A與其他用戶協商密鑰的訊息,如果被抓包截獲,就很容易受到“中間人攻擊”,即通信資料被攻擊者偵測或掉包, -
使用非對稱加密
A同樣需要與其他用戶協商密鑰,A需要構造一對公私鑰,將公鑰發送給B、C、D,自己保留私鑰,
此時,若A發送給B、C、D的訊息被黑客E截獲,E就可以保留A的公鑰,然后構造一對新的公私鑰,將私鑰保留,自己的公鑰發給B、C、D,
按照非對稱加密,E就成了通信的中間人:
B、C、D使用E的公鑰加密資料并發送給A,E劫持通信資料后,使用自己的私鑰解密資料,再使用A的公鑰加密資料發送給A,
對于用戶A、B、C、D而言,他們并不知道自己的通信對于中間人而言是曝光的,
怎樣才能使通信安全:
利用非對稱加密來確認雙方身份建立連接,即SSL握手,
此時需要引入一個公信機構F,用于為用戶證明身份,否則在當前通信環境中,個人是無法為自己證明身份的,
這個機構便是CA,
CA自己有一對公私鑰,公鑰公開給所有用戶,私鑰自己保留,
當A想要向B證明自己時,只需要先請求CA給自己的訊息用CA私鑰加密一下(簽名),再把訊息發送給B,如果B用CA的公鑰能解密,說明這條訊息是被CA認證過的,沒有被其他人篡改過,
此時中間人攻擊就不再奏效,因為即便截獲了A發送給B的資料,中間人也只能用CA的公鑰解密出訊息內容——“這是一條被CA認證過,由A發送給B的資料”,但中間人無法對訊息內容進行篡改,因為B只會用CA的公鑰去驗證這條訊息是否被CA認證過,中間人用自己的私鑰加密的資料,B用CA的公鑰無法解開,
安全證書CA的權力是巨大的,曾經發生的CNNIC證書事件,CNNIC作為受信任的根CA,如果它愿意,它可以隨便偽造國內外任何站點的SSL證書,配合防火墻DNS污染,它可以在國內發起對任何網站的中間人攻擊、截獲通信資料,
再考慮對稱加密:
就對稱加密而言,公信機構無法達到認證效果,
因為對稱加密只有一個密鑰,一旦公開任何人都可以對加密資訊進行篡改,
以上是對稱加密與非對稱加密使用時比較大的區別,對稱加密只能兩兩之間,而非對稱加密既可以用自己的私鑰加密資料,告訴擁有公鑰的人這條訊息是我發的,也可以讓擁有公鑰的人放心發送資料,因為只有擁有私鑰的人才能解密資料,
考慮通信效率:
如果需要頻繁通信,每次通信都使用非對稱加密需要花費較多的時間,
對稱加密與非對稱加密各自擁有優點,兩者結合才能更好的發揮作用,
在實際使用中,是使用非對稱加密建立連接,通過非對稱加密的安全連接協商一個用于對稱加密的密鑰,
由于協商密鑰的程序是安全的,所以協商的密鑰不會再被篡改,之后就可以使用該密鑰進行后續對稱加密的快速通信,
https建立流程
以下介紹https的實際流程:

- CA將自己的證書(公信憑證)交給各瀏覽器廠商,廠商將證書配置到各自瀏覽器,
- 網站將自己的證書(身份憑證)交給CA,讓CA使用私鑰對證書進行簽名,CA簽名后發回給網站,在這個程序中,CA需要核實網站的真實性,網站發給CA簽名的也不僅只是證書,其中網站證書(含網站URL)和網站公鑰是必要的,還會包含一些其他資訊一同簽名,
- 瀏覽器用戶向網站請求安全連接,網站把CA簽名后的證書發給用戶,瀏覽器會根據證書資訊,檢查是哪個CA做的簽名,從瀏覽器自帶的CA證書中找到對應公鑰驗證,
- 如果驗證通過,就證明了網站身份的可靠性,用戶可以通過網站提供的公鑰進行安全連接,和網站協商后續對稱加密的密鑰,
自建CA證書
實驗環境:
- 作業系統:CentOS 7
- Apache版本:httpd
- php版本:php7
檢查OpenSSL,如果版本低于1.0.1f 建議升級,因為1.0.1f版本之下的OpenSSL有一個Heartbleed漏洞,
版本查看:$openssl version
版本更新:$sudo yum update openssl
首先建立myCA目錄用于存放自建CA的相關資訊:
cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
myCA用于存放 CA 根證書,證書資料庫,以及后續服務器生成的證書,密鑰以及請求,
signedcerts保存簽名證書的 copy,private包含私鑰,
之后配置myCA相關引數,在myCA目錄下進行:
echo '01'>serial && touch index.txt
然后創建 caconfig.cnf 檔案(自建CA的組態檔):
vim ~/myCA/caconfig.cnf
caconfig.cnf檔案內容如下:
# My sample caconfig.cnf file.
#
# Default configuration to use when one is not provided on the command line.
#
[ ca ]
default_ca = local_ca
#
#
# Default location of directories and files needed to generate certificates.
#
[ local_ca ]
dir = /home/<username>/myCA
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/signedcerts
private_key = $dir/private/cakey.pem
serial = $dir/serial
#
#
# Default expiration and encryption policies for certificates.
#
default_crl_days = 365
default_days = 1825
default_md = SHA256
#
policy = local_ca_policy
x509_extensions = local_ca_extensions
#
#
# Default policy to use when generating server certificates. The following
# fields must be defined in the server certificate.
#
[ local_ca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName = supplied
organizationalUnitName = supplied
#
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
subjectAltName = DNS:localhost
basicConstraints = CA:false
nsCertType = server
#
#
# The default root certificate generation policy.
#
[ req ]
default_bits = 2048
default_keyfile = /home/<username>/myCA/private/cakey.pem
default_md = SHA256
#
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
#
#
# Root Certificate Authority distinguished name. Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName = MyOwn Root Certificate Authority # CA機構名
stateOrProvinceName = JS # CA所在省份
countryName = CN # CA所在國家(僅限2個字符)
emailAddress = [email protected] # 郵箱
organizationName = XXX #
organizationalUnitName = XXX #
#
[ root_ca_extensions ]
basicConstraints = CA:true
其中dir和default_keyfile的路徑需要改成自己的username
生成 CA 根證書和密鑰:
export OPENSSL_CONF=~/myCA/caconfig.cnf #該命令用于給環境變數 OPENSSL_CONF 賦值為caconfig.cnf,
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825 # 生成 CA 根證書和密鑰
該步驟需要用戶設定一個密碼,請牢記,
以上步驟生成了 CA 自簽名根證書,和 RSA 公/私密鑰對,證書的格式是 PEM,有效期是1825天,
/myCA/cacert.pem: CA 根證書
/myCA/private/cakey.pem: CA 私鑰
生成服務器組態檔exampleserver.cnf:
vim ~/myCA/exampleserver.cnf
exampleserver.cnf檔案內容如下:
#
# exampleserver.cnf
#
[ req ]
prompt = no
distinguished_name = server_distinguished_name
[ server_distinguished_name ]
commonName = localhost # 服務器域名
stateOrProvinceName = JS # 服務器所在省份
countryName = CN # 服務器所在國家(僅限2個字符)
emailAddress = [email protected] # 郵箱
organizationName = XXX #
organizationalUnitName = XXX #
生成服務器證書和密鑰:
export OPENSSL_CONF=~/myCA/exampleserver.cnf # 該命令設定環境變數 OPENSSL_CONF,使得 openssl 更換組態檔,
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
同樣的,需要設定密碼,
之后,有2種對臨時密鑰的操作,選擇其一即可:
1.將臨時私鑰轉換為 unencrypted key,即密鑰不加密狀態:
penssl rsa -in tempkey.pem -out server_key.pem
需要輸入密碼短語,
2.如果希望將 key 保持為加密狀態,直接改名:
mv tempkey.pem server_key.pem
兩者的區別是,第二種需要在服務器啟動時輸入私鑰的密碼,否則會導致服務器啟動失敗,但第二種安全性高于第一種,可以更好的保護密鑰,
使用 CA key 對服務器證書簽名:
export OPENSSL_CONF=~/myCA/caconfig.cnf
openssl ca -in tempreq.pem -out server_crt.pem
洗掉臨時證書和密鑰:
rm -f tempkey.pem && rm -f tempreq.pem
現在,自簽名的服務器證書和密鑰對便產生了:
- server_crt.pem : 服務器證書檔案
- server_key.pem : 服務器密鑰檔案
以下通過LAMP搭建一個網站進行驗證
配置httpd(Apache)
第一步:安裝Apache服務程式(apache服務的軟體包名稱叫做httpd)
yum install httpd -y
第二步: 將Apache服務添加到開機自啟中
systemctl start httpd
systemctl enable httpd
第三步:打開瀏覽器 測驗 127.0.0.1,可以看到默認主頁
httpd主要目錄:
- 服務目錄:/etc/httpd
- 主配置目錄:/etc/httpd/conf/httpd.conf
- 網站資料目錄:/var/www/html
- 訪問日志:/var/log/httpd/access_log
- 錯誤日志:/var/log/httpd/error_log
配置php7
1、安裝源
安裝php72w需要配置額外的yum源,否則會報錯不能找到相關軟體包,
php高版本的yum源地址,有兩部分,其中一部分是epel-release,另外一部分來自webtatic,如果跳過epel-release安裝webtatic的時候會有錯誤,
安裝需要的命令是:
rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
也可以選擇下面的這個命令,是一樣的效果:
yum install epel-release -y
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
2、清除歷史版本
為了防止CentOS上面發生php沖突,所以,這個命令還是先執行一下更好些:
yum -y remove php*
3、安裝擴展包
事實上,這里面的對應擴展庫很多,一定要注意的有cli和fpm這兩個包,其它的相關包看需要:
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-mysql
由于后面要用MySQL,所以mysql包也是需要的,
比較全的版本:
yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-embedded php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml
配置MySQL
在CentOS中默認安裝有MariaDB,這個是MySQL的分支,但為了需要,還是要在系統中安裝MySQL,而且安裝完成之后可以直接覆寫掉MariaDB,
網路環境允許的話直接安裝:
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
mysql-community-server較大如果下載很慢,可以到國內鏡像源下載:
http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/
下載后解壓到圖中檔案目錄下:

注意檔案權限,再安裝:
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
mysql有初始默認密碼,使用以下命令查找:
grep "password" /var/log/mysqld.log
輸入初始密碼,此時不能做任何事情,因為MySQL默認必須修改密碼之后才能操作資料庫,
修改密碼:
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
新密碼設定的時候如果設定的過于簡單會報錯, 原因是因為MySQL有密碼設定的規范,具體是與validate_password_policy的值有關,可以先嘗試大小寫加下劃線的長密碼,
MySQL完整的初始密碼規則查看
SHOW VARIABLES LIKE 'validate_password%';
可以通過如下命令修改:
mysql> set global validate_password.policy=0;
mysql> set global validate_password.length=1;
之后可以重新設定簡單密碼,
配置SSL
ssl需要以下模塊:

修改ssl.conf:
cd /etc/httpd/conf.d
sudo vim ssl.conf

修改DocumentRoot到自己的網頁目錄,并更改證書密鑰來源為自建CA:

網頁配置
將需要的網站檔案夾復制到/var/www/html/目錄下
修改/etc/httpd/conf/httpd.conf檔案中的網站檔案名:

創建自己網站需要的資料庫:
create database myzoo;
use myzoo;
create table Person(PersonID int primary key auto_increment, Password varchar(100),Salt varchar(100),Username varchar(100),Token varchar(100),Zoobars int default 10, Profile varchar(5000));
重啟httpd查看當前網頁:
setenforce 0
sudo systemctl restart httpd
先關閉selinux,不然會報錯,服務啟動前會驗證之前設定的證書密碼(網站的那個,不是CA的),

目前是普通的http連接,因為并沒有將自建CA匯入瀏覽器,
瀏覽器匯入證書
由于網站的證書是自建CA簽名的,瀏覽器并不信任,所以需要手動匯入CA證書,
以chrome為例:設定->高級->隱私設定和安全性->管理證書

可以查看證書詳細資訊和匯入自建CA證書

因為之前配置網站證書時設定的域名是localhost,所以需要通過localhost域名進行https連接,不能使用127.0.0.1,

地址欄訪問狀態出現一把綠色的鎖,成功搭建https,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/49573.html
標籤:其他
