openssl自簽名CA證書

原博客鏈接

本文非原創(chuàng),系瀏覽各博客后結合自身使用的一個總結,方便回顧。

前情提要

通俗理解SSL/TLS協(xié)議區(qū)別與原理
數(shù)字簽名是什么

什么是x509證書鏈

  • x509證書一般會用到三類文件,key,csr,crt。
  • key是私用密鑰,openssl格式,通常是rsa算法。
  • csr是證書請求文件,用于申請證書。在制作csr文件的時候,必須使用自己的私鑰來簽署申請,還可以設定一個密鑰。
  • crt是CA認證后的證書文件(windows下面的csr,其實是crt),簽署人用自己的key給你簽署的憑證。

概念

  • 根證書 生成服務器證書,客戶端證書的基礎。自簽名。
  • 服務器證書 由根證書簽發(fā)。配置在服務器上。
  • 客戶端證書 由根證書簽發(fā)。配置在服務器上,并發(fā)送給客戶,讓客戶安裝在瀏覽器里。

(把根證書安裝到瀏覽器的受信CA中,訪問服務器時就不會出警告了。)

首先要有一個CA根證書,然后用CA根證書來簽發(fā)用戶證書。用戶進行證書申請:一般先生成一個私鑰,然后用私鑰生成證書請求(證書請求里應含有公鑰信息),再利用證書服務器的CA根證書來簽發(fā)證書。

步驟

自簽名CA根證書

1、/root/ca目錄下創(chuàng)建4個子目錄:

  • newcerts:存放CA簽署過的數(shù)字證書。
  • private:存放CA的私鑰。
  • conf:存放一些簡化參數(shù)用的配置文件。
  • server:存放服務器證書文件。

2、制作ca.key 私鑰

openssl genrsa -out /root/ca/private/ca.key 2048

3、生成pem格式的根證書

openssl req -x509 -new -nodes \
-key /root/ca/private/ca.key \
-sha256 -days 1024 \
-out /root/ca/private/ca.pem

接下來提示將如下顯示:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GuangDong
Locality Name (eg, city) [Default City]:ShenZhen
Organization Name (eg, company) [Default Company Ltd]:Fatri
Organizational Unit Name (eg, section) []:Test
Common Name (eg, your name or your server's hostname) []:*.fatri.cn
Email Address []:a@fatri.cn

4、.pem轉(zhuǎn)化為.crt(用于瀏覽器信任)

openssl x509 -outform der -in /root/ca/private/ca.pem -out /root/ca/private/ca.crt

簽發(fā)服務器證書(客戶端證書同理)

1、創(chuàng)建文件ca.conf

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C = CN
ST = GuangDong
L = ShenZhen
O = Fatri
OU = Test
emailAddress = a@fatri.cn
CN = *.fatri.cn

2、創(chuàng)建文件v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.fatri.cn 
DNS.2 = localhost
IP.1 = 172.28.2.105
IP.2 = 172.28.2.107

3、生成服務端證書簽名請求,同時生成服務端私鑰(nginx用)

openssl req -new -sha256 -nodes \
-out /root/ca/server/server.csr \
-newkey rsa:2048 -keyout /root/ca/server/server.key \
-config /root/ca/conf/ca.cnf

4、用ca私鑰以ca的名義(ca.pem)給網(wǎng)站證書簽名,加上v3.ext中的配置

openssl x509 -req -in /root/ca/server/server.csr \
-CA /root/ca/private/ca.pem \
-CAkey /root/ca/private/ca.key \
-CAcreateserial -out /root/ca/server/server.crt -days 1800 -sha256 -extfile /root/ca/conf/v3.ext

至此證書生成完畢!
接下來是使用流程。

服務端Nginx配置SSL

1、啟動Nginx容器

docker run -d --name nginx-test --restart always\  
-p 81:8080 -p 444:443 \ 
-v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf:ro  \  
-v /root/ca:/root/ca \ 
nginx:1.17.3 

解釋:
-d:后臺運行 --name:容器名 --restart:重啟設置
-p:端口映射(宿主機端口:容器內(nèi)端口)
-v:數(shù)據(jù)掛載(容器內(nèi)目錄掛載到宿主機, ro將容器內(nèi)配置文件設為只讀模式, 只能在宿主機修改nginx配置)

2、打開防火墻端口81、444

firewall-cmd --add-port 81/tcp --permanent --zone=public
firewall-cmd --add-port 444/tcp --permanent --zone=public
firewal-cmd --reload

3、配置nginx.conf, 為了開發(fā)方便同時開啟了http和https的訪問,如果局域網(wǎng)統(tǒng)一配置了域名,不需要更改主機host就可以關閉8080端口或者將其重定向至443。

worker_processes  auto;

events {
   worker_connections  1024;
}

http {
   include             mime.types;
   default_type        application/octet-stream;
   sendfile            on;

   proxy_set_header X-Forward-For  $proxy_add_x_forwarded_for;
   # 請求主機頭字段,否則為服務器名稱
   proxy_set_header Host           $host;
   # 客戶端ip地址
   proxy_set_header X-Real-IP      $remote_addr;
   # 包含請求參數(shù)的原始URI,不包含主機名
   proxy_set_header Request-Url    $request_uri;

   # 配置共享會話緩存大小,視站點訪問情況設定
   ssl_session_cache   shared:SSL:10m;
   # 配置會話超時時間
   ssl_session_timeout 10m; 

   map $http_upgrade $connection_upgrade {
       default upgrade;
       ''      close;
   }

   upstream shadow {
       server 172.20.0.104:8080 weight=1;
   }
  
   upstream web {
       server 172.20.0.109:8080 weight=1;
   }

   server {
       listen       8080;
       listen       443 ssl;
       server_name *.fatri.cn;
       ssl_certificate /root/ca/server/server.crt;
       ssl_certificate_key /root/ca/server/server.key;

       # 設置長連接
       keepalive_timeout   70;
         
       # 以下兩項不建議顯示設定
       # ssl_protocols  SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2; 
       # 定義算法        
       # ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;         

       # 優(yōu)先采取服務器算法
       ssl_prefer_server_ciphers   on;

       location / {
           proxy_pass http://web;
       }
       location /api/v1/ws {
           proxy_pass http://shadow; 
           proxy_http_version 1.1;
           proxy_set_header Upgrade $http_upgrade;
           proxy_set_header Connection $connection_upgrade;
       }
   }
}

nginx重定向http請求配置(未測試)

server {
    listen 80;
    server_name *.fatri.cn;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name  example.org;
    root /etc/nginx/wwwroot/;
    charset utf-8;

    ssl_certificate /etc/nginx/ssl/example.org.bundle.crt;
    ssl_certificate_key /etc/nginx/ssl/example.org.key;
    
    # ...
}

4、修改Nginx配置文件nginx.conf, 修改后重啟容器使配置生效

docker restart nginx-test

由于不是買的官方CA證書,所以需要讓瀏覽器信任CA。

客戶端添加信任證書

雙擊根ca.crt導入證書(也可從控制面板搜索管理系統(tǒng)證書導入)

選擇受信任的根證書頒發(fā)機構

配置主機映射

# 1、修改host
win10到C:\Windows\System32\drivers\etc目錄下修改host(可先用文本編輯保存到桌面,在修改后綴名拖回文件夾覆蓋原文件)
mac直接命令行`sodo vi /etc/hosts`

# 2、添加映射
172.28.2.105   dev.fatri.cn

# 3、刷新配置
win10還需進入終端輸入`ipconfig/flushdns`刷新配置
mac應該直接修改后就生效
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容