博客 / 詳情

返回

openssl的初步應用

牢騷

距上一篇文章已經時隔兩年還要多了,我不禁感概時光如白駒過隙,而自己仍是少年,不管是身體心理上還是技術上。但是,人生不僅僅是工作一方面,我技術上仍比不上平均水平,不過幾年來收穫的也是不少。

引言

我明白對稱加密、非對稱加密、公鑰、私鑰等各種概念。但是我該怎麼操作呢?我接觸了openssl。其實,我根本不懂openssl底層邏輯是啥,我只要求查閲資料後會用就行了。不要在我導入了ca證書後,瀏覽器還展示“不安全”這個頁面。
firefox_unsafe
chrome_unsafe
safari_unsafe
edge_unsafe

使用

自己扮演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用來指定各種信息。不加這個也沒問題,他就會終端屏幕上一條一條的讓你輸入:
    csr_questions
    但是指定了-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來指定其他的域名。

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自己的證書列表裏。位置如下截圖,請注意在【證書頒發機構裏】導入。
firefox_certs

將你的ca.crt通過郵件?微信?短信?發送給訪問者。
另外,我們還可以參考一下這個文檔:openssl參考文檔。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.