因爲CA收費,因此能夠自建CA,經過將CA導入瀏覽器實現https的效果,曾經12306購票就須要自行導入網站證書。php
2015年阿里巴巴將旗下淘寶、天貓(包括移動客戶端)全站啓用HTTPS加密,並順利經過「雙十一」考驗,成爲全球最大的電商平臺全站HTTPS改造案例。html
全站HTTPS須要解決3大問題。mysql
首先是性能,主要分三點:linux
其次,兼容性及周邊:web
最後,爲保證上線時的順利切換,須要提早準備大量的預案,以應對各類可能出現的狀況。算法
目前爲止,國內大部分主流網站都已經完成了HTTP到HTTPS的遷移,如淘寶、京東、百度、B站、優酷等,仍在使用HTTP的有騰訊視頻、愛奇藝、噹噹等網站。sql
如下先簡介https與加密原理chrome
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 之間,即應用層與傳輸層之間)。apache
SSL協議可分爲兩層:
搭建https的流程主要與SSL握手協議有關。
HTTP協議傳輸的數據都是未加密的,也就是明文的,所以使用HTTP協議傳輸隱私信息很是不安全,爲了保證這些隱私數據能加密傳輸,因而網景公司設計了SSL(Secure Sockets Layer)協議用於對HTTP協議傳輸的數據進行加密,從而就誕生了HTTPS。
簡單來講,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比HTTP協議安全。
HTTPS和HTTP的區別主要以下:
一、https協議須要到CA(Certificate Authority 即頒發數字證書的機構)申請證書,通常免費證書較少,於是須要必定費用。
二、http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。
三、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。
四、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的實際流程:
實驗環境:
檢查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 = XXXX@XXX.com # 郵箱 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 = XXXX@XXX.com # 郵箱 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
如今,自簽名的服務器證書和密鑰對便產生了:
如下經過LAMP搭建一個網站進行驗證
第一步:安裝Apache服務程序(apache服務的軟件包名稱叫作httpd)
yum install httpd -y
第二步: 將Apache服務添加到開機自啓中
systemctl start httpd systemctl enable httpd
第三步:打開瀏覽器 測試 127.0.0.1,能夠看到默認主頁
httpd主要目錄:
安裝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
爲了防止CentOS上面發生php衝突,因此,這個命令仍是先執行一下更好些:
yum -y remove php*
事實上,這裏面的對應擴展庫不少,必定要注意的有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
在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.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。