1、寫這篇博客的初衷是因為最近iOS9出來了,蘋果官方默認要求使用HTTPS,所以自己想整一個HTTPS服務器,也想好好了解一下HTTPS通信,也知道了HTTPS其實就是在HTTP的基礎上加上了SSL/TLS。具體想了解SSL/TLS原理的請瀏覽SSL/TLS協議運行機制的概述和SSL/TLS原理詳解。中途看了很多博客,也花了不少時間,所以想記錄一些東西。
2、這篇博客的內容主要是講升級openssl、如何自己創建證書、配置證書到服務器和自建CA。其中對證書不太了解的,可以看數字證書及CA的掃盲介紹這篇文章。本篇博客其中第2步和第3步已經重復,只需要選擇其中一步操作就可以搭建HTTPS服務器,當然搭建都是不受信任的,如果是架設網站還是需要到權威的CA機構申請證書。本來還有生成iOS客戶端的證書和使用證書連接服務器相關的內容,由於篇幅的原因就把它放在下一篇吧。
3、本人使用了Mac10.10.5和Ubuntu 14.04.1進行配置搭建,本篇博客主要以Unbuntu 14.04.1系統為主。而本人這個Ubuntu 14.04.1是阿里雲一鍵安裝的,而且沒有更改里面的服務器設置,所以諸多的配置可能與一般Linux系統不太相同(與我電腦上的Linux mint就很大不同)。不過,我會在最后說明一下Mac和Linux配置一些不同的地方,其實都是一些相關路徑的不同。當然,有可能你的Apache安裝路徑與我說的幾種路徑都不同,沒關系,對照着修改也應該沒什么問題。
1、安裝升級openssl
首先,查看下當前設備的openssl版本,如果版本在openssl1.0.1g以上,請略過
|
openssl version -a
#OpenSSL 1.0.1f 6 Jan 2014
|
如果是處於1.0.1-1.0.1f的版本,那就趕快升級到1.0.1g版本以上吧!因為這些版本存在漏洞,詳情請見關於OpenSSL“心臟出血”漏洞的分析
從上面信息可以看出我們的系統版本是1.0.1f,openssl需要升級,那我們先來下載源代碼
|
wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz
|
下載完之后,解壓並進行安裝
|
tar -zxvf openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
./config shared zlib
make && make install
|
安裝的過程中,碰到了一個問題
make: * [install_docs] Error 255
解決這個問題請使用make install_sw安裝,詳情見https://github.com/openssl/openssl/issues/57
隨后,進行相關的設置
|
#修改歷史的OpenSSL文件設置備份
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old
#設置軟連接使其使用新的OpenSSL版本 剛剛安裝的OpenSSL默認安裝在/usr/local/ssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl
#更新動態鏈接庫數據
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v
|
最后查看一下版本
|
openssl version
OpenSSL 1.0.1g 7 Apr 2014
|
1.0.1g版本安裝成功
2、創建用私鑰簽名的證書,配置到Apache服務器
首先,生成私鑰,創建請求證書,使用私鑰對證書進行簽名
生成私鑰openssl genrsa -des3 -out private.key 2048
-des3代表加上了加密,后面的2048是代表生成的密鑰的位數,1024已經不是很安全,詳情請見互聯網全站HTTPS的時代已經到來
生成證書請求openssl req -new -key private.key -out server.csr
這一步需要填寫一些信息,其中Common Name (e.g. server FQDN or YOUR name) []這個需要填寫你的域名或服務器地址。
生成服務器的私鑰,去除密鑰口令openssl rsa -in private.key -out server.key
使用私鑰為證書請求簽名,生成給服務器簽署的證書,格式是x509的PEM格式openssl x509 -req -in server.csr -out server.crt -outform pem -signkey server.key -days 3650
-outform pem指定證書生成的格式,默認是pem,所以這個命令也可以寫作成sudo openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650。
將證書copy到Apache配置路徑下
|
sudo mkdir /alidata/server/httpd/conf/ssl
cp server.key /alidata/server/httpd/conf/ssl/server.key
cp server.crt /alidata/server/httpd/conf/ssl/server.crt
|
其次,配置Apache服務器
編輯/alidata/server/httpd/conf/httpd.conf文件
|
#LoadModule ssl_module modules/mod_ssl.so
#LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
#Include conf/extra/httpd-ssl.conf
|
將這三行前面的#去掉
編輯/alidata/server/httpd/conf/extra/httpd-ssl.conf文件,找到SSLCertificateFile、SSLCertificateKeyFile,修改它們兩對應的文件
|
SSLCertificateFile "/alidata/server/httpd/conf/ssl/server.crt"
SSLCertificateKeyFile "/alidata/server/httpd/conf/ssl/server.key"
|
編輯/alidata/server/httpd/conf/vhosts/phpwind.conf文件,這里我沒有更改阿里雲的配置,如果你不是阿里雲服務器,找到對應的httpd/conf/extra/httpd-vhosts.conf文件進行修改。這個文件我主要加了下面的內容:
|
<VirtualHost *:443>
SSLCertificateFile /alidata/server/httpd/conf/ssl/server.crt
SSLCertificateKeyFile /alidata/server/httpd/conf/ssl/server.key
ServerName 182.92.5.161
DocumentRoot /alidata/www
</VirtualHost>
|
最后,咱們重啟Apache服務器,輸入鏈接查看是否配置成功。
3、自建CA,用CA證書進行簽名,配置到Apache服務器
第一步、使用CA.sh創建CA根證書
修改openssl的配置文件sudo vim /usr/local/ssl/openssl.cnf,修改default_bits=1024為default_bits=2048,使其openssl加密使用2048位,原因前面已經說過。
隨后創建一個目錄,並且將生成CA證書的腳本CA.sh復制到這個目錄
|
mkdir ca
cd ca
cp /usr/local/ssl/misc/CA.sh CA.sh
|
CA.sh這個腳本如果找不到,可以使用 openssl version -a查看openssl對應的目錄,而CA.sh一般就在這個目錄的子目錄misc目錄下。
之后執行./CA.sh -newca命令
CA.sh會使用/usr/local/ssl/openssl.cnf中的配置來創建私鑰和證書,這正是我們第一步為啥需要修改這個文件的原因。
創建CA證書過程中,不輸入信息,直接回車,填寫加密私鑰的密碼和生成CA證書的相關信息。
創建完之后會生成demoCA目錄。這個目錄有
|
cacert.pem certs index.txt index.txt.old private
careq.pem crl index.txt.attr newcerts serial
|
其中cacert.pem是CA的證書,private存放CA的私鑰,newcerts存放CA簽名的備份。到這里,我們的CA已經建好了,下面我們可以通過CA來對我們的證書進行簽名了。
第二步、使用CA根證書為服務器證書簽名
|
#生成私鑰
sudo openssl genrsa -des3 -out private.key 2048
#生成證書請求
sudo openssl req -new -key private.key -out server.csr
#生成服務器的私鑰,去除密鑰口令
sudo openssl rsa -in private.key -out server.key
#使用CA進行簽名,生成server.crt
cp server.csr newreq.pem
./CA.sh -sign
mv newcert.pem server.crt
或者上面三步都不需要,直接使用下面一步
openssl ca -in server.csr -out server.crt
|
更多openssl ca 命令請見OpenSSL命令–ca
第三步、配置服務器:
|
mkdir ssl
cp server.crt ssl/server.crt
cp server.key ssl/server.key
cp demoCA/cacert.pem ssl/ca.crt
cp -r ssl /alidata/server/httpd/conf/
|
編輯/alidata/server/httpd/conf/extra/httpd-ssl.conf文件,找到SSLCertificateFile、SSLCertificateKeyFile、SSLCACertificatePath、SSLCACertificateFile進行修改
|
# 指定服務器證書位置
SSLCertificateFile "/alidata/server/httpd/conf/ssl/server.crt"
# 指定服務器證書key位置
SSLCertificateKeyFile "/alidata/server/httpd/conf/ssl/server.key"
# 證書目錄
SSLCACertificatePath "/alidata/server/httpd/conf/ssl"
# 根證書位置
SSLCACertificateFile "/alidata/server/httpd/conf/ssl/ca.crt"
|
修改vhost配置vim /alidata/server/httpd/conf/vhosts/phpwind.conf
|
<VirtualHost *:443>
SSLCertificateFile /alidata/server/httpd/conf/ssl/server.crt
SSLCertificateKeyFile /alidata/server/httpd/conf/ssl/server.key
SSLCACertificatePath /alidata/server/httpd/conf/ssl
SSLCACertificateFile /alidata/server/httpd/conf/ssl/ca.crt
ServerName 182.92.5.161
DocumentRoot /alidata/www
</VirtualHost>
|
最后,咱們重啟Apache服務器,在瀏覽器輸入鏈接查看是否配置成功。可以在瀏覽器上查看證書信息,與第二步不同之處在於此時的證書有兩個。
最后,與Mac和尋常Linux系統一些區別
一、與MAC的幾點不同
1、首先安裝openssl,參考我的Mac10.11升級安裝openssl
2、Mac上對應的Openssl的路徑是/System/Library/OpenSSL/
3、Mac上對應的Apache的路徑是/etc/apache2/
4、Mac上重啟服務器使用/usr/sbin/apachectl restart,阿里雲服務器使用/etc/init.d/httpd restart或者service httpd restart
5、Mac上vhost配置的路徑是/etc/apache2/extra/httpd-vhosts.conf
二、與尋常Linux系統的不同
主要借鑒MacOS openssl下生成建立CA並生成服務器和客戶端證書方法這篇文章
1、linux上Apache的路徑是/usr/local/apache
2、linux上vhost配置的路徑是/usr/local/apache/conf/extra/httpd_vhosts.conf
總結
1、對HTTPS的理解
它的基本原理是服務器擁有一個私鑰,客戶端擁有公鑰,當然它們是使用證書管理的。每次通信它們通過證書進行身份認證。身份認證之后客戶端發送一個“對話密鑰”給服務器。傳輸“對話密鑰”時,客戶端公鑰通過不對稱加密算法進行加密了的,只有服務器才能解密。然后雙方使用這個”對話密鑰”對內容進行對稱加密,雙方之間傳輸內容。
2、對openssl、SSL/TLS的相關理解
openssl是一套工具,它是一個開源庫,可以對相關內容進行加密和解密,也可以生成證書並且進行數字簽名。它創建的x509證書有PEM和DER兩種編碼,而且它們還可以導出p12文件。它使用的加密算法有對稱加密,也有不對稱加密。
3、HTTPS相關理論知識博客,值得細讀
OpenSSL 與 SSL 數字證書概念貼
SSL/TLS協議運行機制的概述
SSL/TLS原理詳解
參考:
https介紹與環境搭建
OpenSSL常用命令
OpenSSL命令—CA.pl
MacOS openssl下生成建立CA並生成服務器和客戶端證書方法
mac中apache開啟https功能,本地發布安裝app
TLS/HTTPS 證書生成與驗證
OpenSSL小結
利用openssl進行RSA加密解密
DER 和 PEM 格式
