牢騷
距上一篇文章已經時隔兩年還要多了,我不禁感概時光如白駒過隙,而自己仍是少年,不管是身體心理上還是技術上。但是,人生不僅僅是工作一方面,我技術上仍比不上平均水平,不過幾年來收穫的也是不少。
引言
我明白對稱加密、非對稱加密、公鑰、私鑰等各種概念。但是我該怎麼操作呢?我接觸了openssl。其實,我根本不懂openssl底層邏輯是啥,我只要求查閲資料後會用就行了。不要在我導入了ca證書後,瀏覽器還展示“不安全”這個頁面。
使用
自己扮演CA機構
自簽名證書的問題在於服務器發給訪問者的電腦或者瀏覽器的證書(公鑰),訪問者不認識,所以顯示不安全界面。通常,服務器和訪問者通過世界上權威的CA機構(第三方)來相互認識。而現在,服務器要自己做CA機構,然後告訴訪問者:“這是我。”
1. 生成ca.key(名字應該是沒有關係的)。這個是私鑰。
openssl genrsa -out ca.key 4096
解釋:
-out表示輸出到這個文件4096表示加密位數/複雜度,1024的倍數
2. 生成ca.csr(證書申請文件)。中間環節。
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=SH/L=SH/O=MY/OU=FY/CN=www.batman.com/emailAddress=peace@love.com"
解釋:
-new表示新生成-key表示基於哪個私鑰生成.csr申請文件-out表示輸出到哪個文件-
-subj用來指定各種信息。不加這個也沒問題,他就會終端屏幕上一條一條的讓你輸入:
但是指定了-subj,‘extra attributes’我就不會輸入了
你會發現每一條和用-subj參數是對應的
內容就寫你喜歡的,包括CN(Common Name),這個是CA的信息3. 生成ca.crt證書。這個就是我們要發給客户端的。
openssl x509 -req -days 60 -in ca.csr -signkey ca.key -out ca.crt解釋:
-days表示證書有效期-in輸入.csr申請文件-signkey基於哪個私鑰-out表示輸出到哪個文件
4. 然後
把ca.crt發給訪問者,讓他雙擊安裝在系統證書區域,或者在瀏覽器中導入。
生成服務器的證書
1. 生成server.key(名字應該是沒有關係的)。這個是私鑰。放在nginx配置裏。
openssl genrsa -out server.key 2048
解釋:
- 和生成CA的.key文件一樣嘛~
- 選擇小一點的
2048是因為這個證書是要用來和訪問者交互的,稍微小一點更快、請求包更小。CA反正生成了就放那了。
2. 生成server.csr(證書申請文件)。中間環節。
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SH/L=SH/O=MY/OU=FY/CN=www.batman.com/emailAddress=peace@love.com"
解釋:
- 和生成CA的.csr文件一樣嘛~
3. 生成server.crt(證書)。放在nginx配置裏。
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile conf/serverCrt.conf
解釋:
- 要加上這個
-CAcreateserial -CA你的ca證書是啥-CAkey你的ca證書的私鑰是啥-
-extfile額外的配置文件路徑。subjectAltName = @alt_names [ alt_names ] IP.1 = xxx.xxx.xxx.xxx IP.2 = xxx.xxx.xxx.xxx DNS.1 = www.catwoman.com DNS.2 = www.posionIvy.com- 你可以想到,我們之前做的步驟裏,只有在.csr生成的時候有指定過域名相關的信息(通過CN,或者叫Common Name)。這個例子裏是
www.batman.com。所以訪問者只有通過這個域名【才】能使用我們的證書。不然還是“不安全” - 而我需要額外的配置文件是因為,我沒有域名!!需要這個參數
subjectAltName來指定ip。不然訪問者就不認了。 - 這個參數
subjectAltName來指定其他的域名。
- 你可以想到,我們之前做的步驟裏,只有在.csr生成的時候有指定過域名相關的信息(通過CN,或者叫Common Name)。這個例子裏是
4. 配置nginx。然後reload。
nginx官方指南:https://nginx.org/en/docs/http/configuring_https_servers.html
重點在
ssl on;
ssl_certificate "{yourCertPath}/server.crt";
ssl_certificate_key "{yourCertPath}/server.key";
# Settings for a TLS enabled server.
#
server {
listen {yourPort} ssl http2 default_server;
listen [::]:{yourPort} ssl http2 default_server;
server_name _;
ssl on;
root {yourRootPath};
ssl_certificate "{yourCertPath}/server.crt";
ssl_certificate_key "{yourCertPath}/server.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
更新證書
由於我沒有域名,公網ip又會變化,當他變化的時候我就需要更新我的server.crt,不然就會提示“不安全”。
重新執行【生成服務器的證書】的第3步。只是將他的配置文件中subjectAltName👉[ alt_names ]👉IP.1修改成新的ip,然後再重新生成一下證書,然後再reload一下nginx。萬事大吉!
查看證書
取決於你是如何生成各類文件的。
openssl rsa -in ca.key -text -noout
openssl req -in ca.csr -text -noout
openssl x509 -in ca.crt -text -noout
總結
完成後的證書列表像這樣。ca.srl用來存放【被吊銷的證書】,涉及到服務器怎麼相信訪問者是訪問者。
[xxx@localhost xxx]$ ls -l
總用量 28
-rw-r--r-- 1 appadmin appzone 2017 7月 3 13:25 ca.crt
-rw-r--r-- 1 appadmin appzone 1752 7月 3 13:24 ca.csr
-rw------- 1 appadmin appzone 3247 7月 3 13:03 ca.key
-rw-r--r-- 1 appadmin appzone 41 7月 3 14:21 ca.srl
drwxr-xr-x 2 appadmin appzone 62 7月 3 14:19 conf
-rw-r--r-- 1 appadmin appzone 1708 7月 3 14:21 server.crt
-rw-r--r-- 1 appadmin appzone 1058 7月 3 13:27 server.csr
-rw------- 1 appadmin appzone 1679 7月 3 13:16 server.key
[xxx@localhost xxx]$
我們發現,生成CA的證書和生成server的證書基本上都是一樣的。當然還有很多拓展的命令,比如在生成.key的是後指定密碼算法(rsa、des。。。)、再比如在驗證證書的時候,指定必須/可選校驗不同信息、再比如使用配置文件。
不管怎麼樣,現在,訪問者應該能識別這確實是服務端送過來的響應。chrome、edge、safari都是能識別系統的根證書的,説明訪問者雙擊ca.crt安裝在系統就行了。而firefox貌似是不支持的,必須要導入到firefox自己的證書列表裏。位置如下截圖,請注意在【證書頒發機構裏】導入。
將你的ca.crt通過郵件?微信?短信?發送給訪問者。
另外,我們還可以參考一下這個文檔:openssl參考文檔。