CA证书制作实战
需求:
????????自建CA 頒發(fā)證書
使用自簽名證書來構建安全網(wǎng)絡,所謂自簽名證書,就是自己扮演 CA 機構,自己給自己的服務器頒發(fā)證書。
1、OpenSSL
????????OpenSSL是一個以C語言編寫現(xiàn)了SSL與TLS協(xié)議的開源的軟件庫包,應用程序可以使用這個包來進行安全通信,避免竊聽,同時確認另一端連線者的身份。這個包廣泛被應用在互聯(lián)網(wǎng)的網(wǎng)頁服務器上。OpenSSL支持Linux、Windows、BSD(Unix的衍生系統(tǒng))、Mac等平臺,這使得OpenSSL具有廣泛的適用性。?
OpenSSL整個軟件包大概可以分成三個主要的功能部分:
- 加密算法庫
- 對稱加密算法:
- 非對稱加密算法
- 信息摘要算法
- SSL協(xié)議庫
- OpenSSL實現(xiàn)了SSL協(xié)議的SSLv2和SSLv3,支持了其中絕大部分算法協(xié)議
- OpenSSL也實現(xiàn)了TLSv1.0+
- 應用程序
- 多功能的命令行工具,可以實現(xiàn)加密解密、密鑰生成、密鑰和證書管理、自建CA和簽名等功能?
2、過程
3、頒發(fā)證書
默認情況下Linux操作系統(tǒng)已經(jīng)內(nèi)置安裝了OpenSSL,可以通過openssl version 查看版本號
????????但是在使用前,需要注意下當前OpenSSL的庫的版本,因為版本1.0.1是一個很重要的風水嶺版本,1.0.1是第一個支持TLS1.1和1.2的版本。
修改配置:
在CA目錄下創(chuàng)建兩個初始文件,維護序列號。通過CA機構簽發(fā)的每個證書都有一個唯一的序列號。
cd /etc/pki/CA
touch index.txt serial
echo 01 > serial
生成根密鑰
表示的CA機構的私鑰,CA結構簽發(fā)的每一個證書都要通過自己的私鑰進行簽名。
cd /etc/pki/CA
#生成一個2048位的密鑰
openssl genrsa -out private/cakey.pem 2048
生成根證書
使用req命令生成自簽證書
- -new:表示新的申請
- -x509:表示生成自簽證書
- -key:指定私鑰文件
- -out:保存證書的位置
- -days:指定證書期限
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
會提示輸入一些內(nèi)容,因為是私有的,所以可以隨便輸入(之前修改的openssl.cnf會在這里呈現(xiàn)),最好記住能與后面保持一致。上面的自簽證書cacert.pem 應該生成在/etc/pki/CA 下。
為我們的Nginx服務器生成SSL密鑰
環(huán)境:
????????192.168.200.16 CA機構服務器
????????192.168.200.16 Nginx服務器
申請SSL證書本質(zhì)上就是服務器升級支持HTTPS,非對稱加密(公鑰和私鑰)。
以上都是在CA服務器上做的操作,而且只需進行一次,現(xiàn)在轉(zhuǎn)到nginx服務器上執(zhí)行:
安裝Nginx
#1.安裝該rpm rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-releasecentos-7-0.el7.ngx.noarch.rpm #安裝該rpm后,我們就能在/etc/yum.repos.d/ 目錄中看到一個名為nginx.repo 的文件。 #2.安裝完Nginx源后,就可以正式安裝Nginx了。 yum install -y nginx #3.查看所在目錄 whereis nginxcd /etc/nginx/ssl
#為我們的nginx web服務器生成ssl密鑰
openssl genrsa -out nginx.key 2048
為nginx生成證書簽署請求
該過程會生成一個文件,包含了證書相關的信息,但是該文件不是證書,生成證書的請求文件。
該文件需要發(fā)送給CA機構,由CA簽名后生成一個證書文件。
openssl req -new -key nginx.key -out nginx.csr
...
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GD
Locality Name (eg, city) []:SZ
Organization Name (eg, company) [Internet Widgits Pty
Ltd]:COMPANY
Organizational Unit Name (eg, section) []:IT_SECTION
Common Name (e.g. server FQDN or YOUR name)
[]:your.domain.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...
同樣會提示輸入一些內(nèi)容,其它隨便,除了Commone Name 一定要是你要授予證書的服務器域名或主機名,challenge password不填。
私有CA根據(jù)請求來簽署證書
接下來要把上一步生成的證書請求csr文件,發(fā)到CA服務器上,在CA上執(zhí)行:
openssl ca -in nginx.csr -out nginx.crt
????????上面簽發(fā)過程其實默認使用了-cert cacert.pem -keyfile cakey.pem ,這兩個文件就是前兩步生成的位于/etc/pki/CA 下的根密鑰和根證書。將生成的crt證書發(fā)回nginx服務器使用。?
????????到此我們已經(jīng)擁有了建立SSL安全連接所需要的所有文件,并且服務器的crt和key都位于配置的目錄下,剩下的是如何使用證書的問題。
4、使用 SSL證書
Nginx 使用 SSL 證書
????????在本地安裝完成證書(在Nginx服務器配置)也就意味著Java Web應用已經(jīng)完成了從http到https協(xié)議的升級
????????以 Nginx 為例,在 Nginx 中新建ssl文件夾,將生成的crt和key放入其中,配置文件中加入以下代碼:
#修改Nginx的配置文件,安裝SSL證書 cd /etc/nginx/conf.d vi default.conf listen 443 ssl http2;#https協(xié)議監(jiān)聽的端口號是443端口,基于http2進行工作的。 ssl_certificate /etc/nginx/ssl/nginx.crt; # 指向 ssl文件夾中的 crt 文件 ssl_certificate_key /etc/nginx/ssl/nginx.key; # 指向ssl 文件夾中的 key 文件 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #啟用false start加速 ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL; ssl_prefer_server_ciphers on;啟動Nginx
#切換到可執(zhí)行目錄
cd /usr/sbin/
./nginx
#查看啟動狀態(tài)
ps -ef|grep nginx?
訪問測試
curl https://192.168.200.21
????????但是,我們自己簽發(fā)的證書,是不受其他服務器信任的,當發(fā)起 curl 請求時,會出現(xiàn)以下情況:證書無效或無法驗證錯誤。這時候,我們就需要將我們 CA 服務器的根證書導入到這臺服務器中。?
添加證書:
#安裝 ca-certificates package: yum install ca-certificates #啟用dynamic CA configuration feature: update-ca-trust force-enable #將證書文件放到 /etc/pki/ca-trust/source/anchors/ 目錄下 mv /etc/pki/CA/cacert.pem /etc/pki/ca-trust/source/anchors/ #執(zhí)行更新: update-ca-trust extract修改本地host文件
cd /etc
vi hosts
127.0.0.1 localhost localhost.localdomain localhost4localhost4.localdomain4
::1 localhost localhost.localdomain localhost6localhost6.localdomain6
192.168.200.21 yj.com #添加的字段
訪問測試
curl https://yj.com
總結
- 上一篇: java制作SM2证书
- 下一篇: c语言制作证书