NSSL的單向認證和雙向認證

環境準備:CA環境:192.168.42.132,服務端(NGINX服務器):192.168.42.134,客戶端(產生client的證書文件,p12文件,導入到瀏覽器中):192.168.42.128html

 

1.單向認證nginx

    1. 客戶端向服務端發送SSL協議版本號、加密算法種類、隨機數等信息。
    2. 服務端給客戶端返回SSL協議版本號、加密算法種類、隨機數等信息,同時也返回服務器端的證書,即公鑰證書
    3. 客戶端使用服務端返回的信息驗證服務器的合法性,包括:算法

      • 證書是否過時
      • 髮型服務器證書的CA是否可靠
      • 返回的公鑰是否能正確解開返回證書中的數字簽名
      • 服務器證書上的域名是否和服務器的實際域名相匹配

      驗證經過後,將繼續進行通訊,不然,終止通訊瀏覽器

    4. 客戶端向服務端發送本身所能支持的對稱加密方案,供服務器端進行選擇
    5. 服務器端在客戶端提供的加密方案中選擇加密程度最高的加密方式。
    6. 服務器將選擇好的加密方案經過明文方式返回給客戶端
    7. 客戶端接收到服務端返回的加密方式後,使用該加密方式生成產生隨機碼,用做通訊過程當中對稱加密的密鑰,使用服務端返回的公鑰進行加密,將加密後的隨機碼發送至服務器
    8. 服務器收到客戶端返回的加密信息後,使用本身的私鑰進行解密,獲取對稱加密密鑰。 
      在接下來的會話中,服務器和客戶端將會使用該密碼進行對稱加密,保證通訊過程當中信息的安全。

單向認證的過程:安全

1、在CA端:服務器

#生成CA私鑰
openssl genrsa -out private/ca.test.private.key 1024session

#生成根證書申請,域名爲ca.admin
openssl req -new -key private/ca.test.private.key -out private/ca.test.request.csr併發

#生成根證書
openssl x509 -req -days 3655 -in private/ca.test.request.csr -signkey private/ca.test.private.key -out private/ca.test.sign.crt加密

#生成證書吊銷列表
openssl ca -gencrl -out private/ca.test.revocation.crt -crldays 7spa

2、在Server端:

#生成服務端的私鑰
openssl genrsa -out server/server.key 1024

#生成服務器證書申請
openssl req -new -key server/server.key -out server/server.csr

#將SERVER端生成證書請求發往CA端作簽名
openssl ca -in server/server.csr -cert private/ca.test.sign.crt -keyfile private/ca.test.private.key -out server/server.crt

在Nginx作相關的配置:

    # HTTPS server
    #
    server {
        listen       443 ssl;
        #server_name  a.server;

        ssl_certificate     /home/lianggaohua/ca/server/server.crt;   #服務端證書文件
        ssl_certificate_key  /home/lianggaohua/ca/server/server.key;  #服務端私鑰
        #ssl_client_certificate /home/lianggaohua/ca/server/ca.test.sign.crt;  #CA用於認證客戶端證書
        #ssl_verify_client off;  #須要驗證客戶端證書的時候須要將參數修改成on

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    
    location /ngx_status
    { 
               stub_status on;
            access_log off;
        }
    }

在瀏覽器,須要導入CA的證書。這樣服務端返回服務端證書和公鑰的時候,客戶端經過導入的CA證書便可經過認證。

 

2.雙向認證

  1. 客戶端向服務端發送SSL協議版本號、加密算法種類、隨機數等信息。
  2. 服務端給客戶端返回SSL協議版本號、加密算法種類、隨機數等信息,同時也返回服務器端的證書,即公鑰證書
  3. 客戶端使用服務端返回的信息驗證服務器的合法性,包括:

    • 證書是否過時
    • 髮型服務器證書的CA是否可靠
    • 返回的公鑰是否能正確解開返回證書中的數字簽名
    • 服務器證書上的域名是否和服務器的實際域名相匹配

    驗證經過後,將繼續進行通訊,不然,終止通訊

  4. 服務端要求客戶端發送客戶端的證書,客戶端會將本身的證書發送至服務端
  5. 驗證客戶端的證書,經過驗證後,會得到客戶端的公鑰
  6. 客戶端向服務端發送本身所能支持的對稱加密方案,供服務器端進行選擇
  7. 服務器端在客戶端提供的加密方案中選擇加密程度最高的加密方式
  8. 將加密方案經過使用以前獲取到的公鑰進行加密,返回給客戶端
  9. 客戶端收到服務端返回的加密方案密文後,使用本身的私鑰進行解密,獲取具體加密方式,然後,產生該加密方式的隨機碼,用做加密過程當中的密鑰,使用以前從服務端證書中獲取到的公鑰進行加密後,發送給服務端
  10. 服務端收到客戶端發送的消息後,使用本身的私鑰進行解密,獲取對稱加密的密鑰,在接下來的會話中,服務器和客戶端將會使用該密碼進行對稱加密,保證通訊過程當中信息的安全

3、在客戶端生產證書請求,併發送給CA作簽名

#生成帶密碼的客戶端私鑰,密碼000000
openssl genrsa -des3 -out client.key 2048

#生成證書請求,域名須要與服務器端一致
openssl req -new -key client.key -out client.csr

#交給CA作簽名
openssl ca -days 1800 -in client/client.csr -cert private/ca.test.sign.crt -keyfile private/ca.test.private.key -out client/client.crt

#利用返回的公鑰和客戶端證書合成p12文件
openssl pkcs12 -export clcerts -in client.crt -inkey client.key -out client.p12

將p12文件導入到瀏覽器,便可實現雙向認證的過程。

在nginx中配不一樣的端口,實現不一樣的認證方式訪問不一樣的頁面:

    server {
        listen       443 ssl;
        #server_name  b.client;

        ssl_certificate     /home/lianggaohua/ca/server/server.crt; 
        ssl_certificate_key  /home/lianggaohua/ca/server/server.key;
        ssl_client_certificate /home/lianggaohua/ca/server/ca.test.sign.crt;
        ssl_verify_client on;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html1;
            index  index.html index.htm;
        }
    
    location /ngx_status
    { 
               stub_status on;
            access_log off;
        }
    }

    server {
        listen       8443 ssl;
        #server_name  b.client;

        ssl_certificate     /home/lianggaohua/ca/server/server.crt; 
        ssl_certificate_key  /home/lianggaohua/ca/server/server.key;
    ssl_verify_client off;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    
    location /ngx_status
    { 
               stub_status on;
            access_log off;
        }
    }
相關文章
相關標籤/搜索