https原理及實踐

轉載請註明出處html

安全知識

網絡安全問題

數據機密性

在網絡傳輸數據信息時,對數據的加密是相當重要的,不然全部傳輸的數據都是能夠隨時被第三方看到,徹底沒有機密性可言。nginx

數據機密性解決問題思路

利用算法web

爲了保證數據的機密性,首先能夠採用的方法就是將數據經過相應算法,轉換爲其它的數據信息,而後再經過相應算法反推出真正的數據是什麼,這樣一來就保證了數據在網絡傳輸過程當中安全性,不會被其它人輕易的看到傳輸過程當中的數據信息。數據加密前的信息稱爲明文數據(plaintext),通過加密算法轉換後進行傳輸的信息稱爲密文數據(ciphertext);反之經 過解密算法轉換後,會將密文數據恢復爲明文數據進行顯示接收。算法

優勢:實現了數據機密傳輸,避免了明文傳輸數據的危險性。shell

缺點:利用加密算法,將明文改密文,若是第三方得到加密算法,便可將傳輸密文再次變爲明文。vim

利用對稱加密算法解決機密性瀏覽器

普通算法雖然已經解決了明文數據的機密性,能夠在網絡傳輸過程當中不被直接看到明文數據。 可是新的問題又產生了,既然明文數據是經過算法改變成了新的數據信息,若是第三方得到 了算法,利用算法也是能夠將密文數據信息,再次轉換爲明文數據信息,所以出現了對稱加 密算法。形象比喻來講:數據加密算法就比如是一本密碼規則手冊,而對稱加密算法就是將手冊放在了一個保險櫃中進行了上鎖傳輸,只有傳遞數據信息的雙方知道打開保險櫃的密碼。緩存

數據完整性

網絡傳輸數據的完整性,也是安全領域中須要考慮的重要環節,若是不能保證傳輸數據的完整性,那傳輸過程當中的數據就有可能被任何人所篡改,而傳輸數據雙方又不能及早的進行發現。將會形成互連通信雙方所表達信息的意義徹底不一致。所以,對於不完整的數據信息,接收方應該進行相應判斷,若是完整性驗證錯誤,就拒絕接受相應的數據。安全

數據完整性解決思路

利用單向加密算法服務器

利用數據的單項加密算法(提取數據指紋),進行提取數據特徵碼的方式,從而完成數據傳 輸的完整性驗證。實際的算法實現過程爲:在一段明文數據信息後加上敎據信息的特徵碼, 這個特徵碼是經過結合數據信息進行相應算法得到的數據特徵碼,接收方當收到數據信息後, 會利用相同的加密算法對獲取的數據進行加密,確認加密後獲得的特徵碼是否與傳送過來數 據後面描述的特徵碼一致;若是一致,能夠表示數據沒有被篡改過,若是不一致表示數據完 整性遭到了破壞,數據一律不予以接收處理。

利用單項加密算法(加密特徵碼)

因爲可能存在中間人攻擊的可能性,所以能夠對傳輸過程當中數據特徵碼進行加密,發送方利用對稱密鑰方式對手中的特徵碼進行加密,接收方會利用相同的密鑰對手中的特徵碼進行解密,從而確認特徵碼是否一致。若是中間人將新的特徵碼也進行了加密,發送給接收方,但接收方沒法利用和發送方協商好的解密密鑰對特徵碼進行解密,最終沒法識別中間人發送過來的數據特徵碼信息。

單項加密算法特徵:

  • 數據輸入同樣,特徵碼信息輸出必然相同
  • 雪崩效應,輸入的微小改變,將形成輸出的巨大改變
  • 定長輸出,不管源數據多大,但結果都是同樣的
  • 不可逆的,不管根據數據指紋,還原出原來的數據信息

單項加密算法常見的有:

  • DH加密算法,主要用於密鑰的協商交換
  • MD4 MD5(128)
  • SHA1(160) SHA(192) SHA(256) SHA(384)
  • CRC-32(循環輸出校驗碼),不是加密機制,只是一種校驗機制,不提供安全性,正常加密算 法是不容許出現輸入不同,輸出同樣的狀況,但CRC是能夠有這樣狀況的,由於CRC只 是具備校驗功能,不具備加密功能

非對稱加密算法常見的有:

  • RSA,RSA既是一個公司的名稱,也是三個創始人的名稱,RSA既能夠加密又能夠進行簽名。
  • DSA,只能實現數字簽名功能
  • ELGamal,屬於商業化的加密算法

身份驗證

網絡中傳輸數據時,頗有可能傳輸的雙方是第一次創建鏈接,進行相互通信,既然是第一次 見面溝通,如何確認對方的身份信息,的確是我要進行通信的對象呢?若是不是正確的通信 對象,在通過通信後,豈不是將全部數據信息發送給了一個陌生人。

網絡安全證書由來

 獲取公鑰信息的證書

 默認公鑰在網絡中進行傳遞時,默認狀況下也是會出現問題的以下圖所示:

 

對發送方的公鑰信息進行公正步驟:(藉助第三方安全機構)

  • A和B端首先生成本身的公鑰和私鑰的密鑰對,爲了使對方能相佶本身的公鑰信息。將本身的公鑰信息告知給第三方發證機構,利用第三方機構對本身的公鑰進行公證。第三方機構會製做一個數字證書(機構 編號 以及發證機構的戳)。而且第三方機構也要給本身設置—個合法的公鑰和私鑰,而且公鑰設置爲第三方機構的公鑰證書。
  • 發證機關計算出數字證書數據的特徵碼,並用本身的私鑰逬行加密,並將加密的信息附加到特徵碼後成爲數字簽名。
  • A和B兩端得到公正過的證書信息,並經過證書信息傳遞,獲得對方的公鑰。
  • A和B兩端與第三方機構創建鏈接,得到第三方證書,經過第三方證書得到第三方公鑰,利用第三方公鑰只要能解密數字簽名便可。

 證書信息所包含內容

目前標準的證書存儲格式是X509,還有其餘的證書格式,須要包含的內容爲:

  • 公鑰信息,以及證書過時時間
  • 證書的合法擁有人信息
  • 證書該如何被使用
  • CA頒發機構信息
  • CA簽名的校驗碼

互聯網上使用的SSL和TLS證書管理機制均使用X509的格式

 OpenSSL軟件介紹

Netscape網景公司生產了最初的瀏覽器,但爲了提升瀏覽器訪問頁面的安全性,對TCP/IP模型進行了必定改進,在傳輸層與應用層之間,建立了一個3.5層的概念,稱爲SSL((Secure Sockets Layer安全套接層))層,SSL不是一個軟件,只是一個庫,讓應用層將數據傳輸到傳輸層前,調用了ssl層的功能對數據進行了加密,目前比較流行的版本是(SSLv2 V3),可是SSL是netscape公司進行定義的,不夠開放性,所以爲了使加密功能更加開放,TSL(傳輸層安全協議)協議就出現了,目前比較流行的版本是(TSLv1==ssl v3),TSL更像是傳輸層上實現的數據加密。

OpenSSL軟件詳細說明

一、獲取OpenSSL軟件的版本信息:

[root@web01 html]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
[root@web01 html]# rpm -qa openssl
openssl-1.0.1e-57.el6.x86_64

二、獲取OpenSSL配置文件信息: 

/etc/pki/tls/openssl.cnf    <- openssl配置文件,主要用於配置成私有ca時進行使用

三、獲取OpenSSL命令詳細信息:

[root@web01 html]# openssl ?
openssl:Error: '?' is an invalid command.

Standard commands   # 標準命令:
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              
# 單向加密命令(信息摘要命令):
Message Digest commands (see the `dgst' command for more details)
md2               md4               md5               rmd160            
sha               sha1              
# 加密命令:
Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib              

# openssl speed    <- 測試當前主機對全部openssl支持的加密算法的加密速度進行測試顯示,同時也對服務器性能作一個測試
# openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] 
[-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
ciphername           <- 指定加密的算法
[-in filename]       <- 指定要加密的文件
[-out filename]      <- 指定加密後輸出的文件
[-e] [-d]            <- e是加密文件,d是解密文件,不指定默認就是加密的
[-a]                 <- 基於base64位進行編碼,可選參數

# 舉例說明,加密一個文件
# openssl enc -des3 -salt -a in inittab -out initab.des3           <- 輸入密碼後便可加密成功
# openssl enc -des3 -d -salt -a -in -initab.des3 -out inittab      <- 輸入密鑰後便可解密成功
說明:其中命令中的salt參數,主要用於避免密碼加密後,對密鑰串的反推

# 輸出一個文件的特徵碼方式
md5sum inittab                        
sha1sum inittab                    
openssl dgst-sha1 inittab        <- 利用openssl生成文件特徵碼
dgst  - 表示指定使用信息摘要命令
-sha1 - 表示指定摘要命令選用sha1算法

# 生成和用戶同樣的密碼串
openssl passwd -1                <- 採用md5加密用戶密碼串

# 生成僞隨機數方法
openssl rand -base64 45          <- 給出一個任意的數字,就會生成任意的隨機數
openssl命令詳細信息

OpenSSL軟件創建私有CA

建立私鑰與公鑰信息

須要先給ca證書頒發機構生成證書,即生成一對密鑰;genrsa - generate an RSA private key利用genrsa生成密鑰信息。雖然只是生成私鑰,但須要清楚公鑰是經過私鑰進行提取獲得的,因此只要有私鑰,就能夠有公鑰。私鑰信息是很是重要的,所以生成的私鑰文件應該是600的權限 

# openssl genrsa 2048 >server.key          <- 建立私鑰信息,並指定私鑰的長度爲2048,並將生成的私鑰信息保存在一個文件中
# openssl genrsa -out server.key 2048      <- 將私鑰信息直接進行保存,加密長度必定要放在輸出文件後面
# (umask 077;openssl genrsa -out server1024.key 1014)     <- 利用小括號,實現子shell功能,臨時修改umask,使子建立的私鑰文件權限爲600
說明:密鑰文件也能夠進行加密,而且支持後期手工加密,但不建議加密,每次使用私鑰文件還要進行解密,比較麻煩
# openssl rsa -in server.key -pubout       <- 讀取私鑰文件選擇非對稱密鑰加密算法rsa,進行公鑰的生成
View Code

實操私鑰與公鑰創建

[root@web01 ~]# openssl genrsa 2048 >server.key
Generating RSA private key, 2048 bit long modulus
.......................................................................+++
.................................................................+++
e is 65537 (0x10001)
[root@web01 ~]# openssl rsa -in server.key -pubout >server.cty
writing RSA key
[root@web01 ~]# ll
total 48
-rw-------. 1 root root  1073 Sep 29 22:20 anaconda-ks.cfg
-rw-r--r--. 1 root root 21736 Sep 29 22:20 install.log
-rw-r--r--. 1 root root  5890 Sep 29 22:18 install.log.syslog
-rw-r--r--  1 root root   451 Jan 18 21:35 server.cty
-rw-r--r--  1 root root  1675 Jan 18 21:34 server.key
密鑰創建

生成自簽署的證書

[root@web01 ~]# openssl req -new -x509 -key server.key -out server.crt -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:o
Organizational Unit Name (eg, section) []:ol
Common Name (eg, your name or your server's hostname) []:web01
Email Address []:admin@qq.com

req    <- 用於建立新的證書
new    <- 表示穿件的是新的證書
x509   <- 表示定義證書的格式爲標準格式
key    <- 表示調用的私鑰文件信息
out    <- 表示輸出證書文件信息
days   <- 表示證書的有效期
生成自簽署證書

ca頒發機構的私鑰和證書是不能隨便放置的,而且須要配置私有頒發機構的配置文件

vim /etc/pki/tls/openssl.cnf

[CA_default]模塊參數說明:

參數

配置

官方配置說明

解釋配置說明

dir

=/etc/pki/CA

#Where everthing is kept

建立並定義CA目錄信息

certs

= $dir/certs

#Where the issued certs are kept

證書文件保存目錄

crl_dir

= $dir/crl

#Where the issued crl are kept

證書吊銷文件保存目錄

database

= $dir/index.txt

# data index file

表示發過哪些證書,都要文件進 行記錄

new_certs_dir

= $dir/newcerts

#default place for new certs

默認新證書的存放路徑

certificate

= $dir/cacert.pem

#The CA certificate

定義CA機構本身的證書

serial

= $dir/serial

#The current serial number

表示證書對應的序列號,通常從 01開始

crinumber

= $dir/crinumber

#The current crl number

表示吊銷證書對應的序列號

crl

= $dir/crl.pem

#The current CRL

表示當前證書吊銷列表文件

private_key

= $dir/private/cakey.pem

#The private key

表示CA機構目身的私鑰文件

RANDFILE

= $dir/private/.rand

#private random number file

私鑰隨機數文件,此文件會默認本身創建

在/etc/pki/CA的證書路徑下,還須要有certs crl newcerts三個子目錄信息

指定證書相關的有效期限配置:

參數

配置

官方配置說明

解釋配置說明

default_days

= 365

#how long to certify for

定義證書的有效期限

default_crl_days

= 30

#how long before next CRL

默認證書放罝到吊銷列表中的保存時間

default_md

= default

#use public key default MD

指定單向加密算法採用的是默認的

定義[req_distinguished_name]模塊參數信息,即指定證書中的一些基本屬性信息

參數

配置

舉例配置

解釋配置說明

countryName_default

=XX

= CN

默認的國家改成本地區域名稱

stateOrProvinceName_default

= Default Province

= beijing

默認的省份名稱改成本地區域名稱

localityName_default

=Default City

= beijing

默認的城市名稱改成本地區域名稱

0.orgzanizationName_default

=Default Company Ltd

= o

默認的公司組織名稱

organizationalUnitName_default

=

=ol

默認的公司部分名稱

私有HTTPS實現

nginx配置文件

server {
        listen       443;      # https的端口爲443,要指定
        server_name  www.erlianzhang.com;
        ssl on;                # 開啓ssl,下兩行第一行是引用證書,第二行是引用私鑰
        ssl_certificate /application/nginx/conf/keys/server.crt;
        ssl_certificate_key /application/nginx/conf/keys/server.key;
        location / {
            root   html/;
            index  index.html index.htm;
        }
}

設置自動跳轉https

 每次都要輸入https很煩,因此設置自動跳轉

利用地址重寫功能(方法1)

在本來的server模塊上在加一個server:

server {
    listen  80;
    server_name www.erlianzhang.com;
    rewrite ^(.*)$  https://$host$1 permanent;
}

說明:在https配置server基礎上再添加http跳轉server

利用error_page識別錯誤碼信息進行跳轉(方法2)

server {
        listen       443;
        listen       80;
        server_name  www.erlianzhang.com;
        ssl on;
        ssl_certificate /application/nginx/conf/key/server.crt;
        ssl_certificate_key /application/nginx/conf/key/server.key;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
       error_page 497  https://$host$uri;
}

說明:497爲內置錯誤碼,當訪問http沒法處理,須要利用https處理時

利用反向代理服務器進行http到https跳轉

修改地址池信息

將端口改成https的默認443端口 

upstream www_server_pools {
            server 10.0.0.7:443;
            server 10.0.0.8:443;
            server 10.0.0.9:443;
}

引用地址池時也要把http改爲https

proxy_pass https://web_pools;

修改地址池調用信息

注意,負載上也要有key證書與私鑰文件

server {
    listen       443;
    server_name  www.erlianzhang.com;
    ssl on;
    ssl_certificate /application/nginx/conf/key/server.crt;
    ssl_certificate_key /application/nginx/conf/key/server.key;
    location / {
    proxy_pass https://www_server_pools;
    }
}

定義http到https跳轉配置信息

server {
    listen       80;
    server_name  www.erlianzhang.com;
    rewrite ^(.*)$  https://$host$1 permanent;
}

nginx中的ngx_http_ssl_module模塊(https相關)

指令

ssl

語法:    ssl on | off;
默認:    ssl off
語境:    http,server
功能:    ssl功能啓用/不啓用

爲給定的虛擬服務器啓用HTTPS協議。

ssl_buffer_size

句法:    ssl_buffer_size size;
默認:    ssl_buffer_size 16k;
語境:    http, server
該指令出如今1.5.9版本中。
功能:    設置用於發送數據的緩衝區的大小。

默認狀況下,緩衝區大小爲16k,這對應於發送大響應時的最小開銷。爲了最小化第一個字節的時間,使用較小的值多是有益的,例如:

ssl_buffer_size 4k;

ssl_certificate

句法:    ssl_certificate file;
默認:    -
語境:    http, server
功能:    指定當前虛擬主機所使用的證書文件

指定file具備給定虛擬服務器的PEM格式的證書。若是除了主要證書以外還應該指定中間證書,則應該按照如下順序在同一個文件中指定它們:主要證書首先是中間證書,而後是中間證書。PEM格式的密鑰能夠放在同一個文件中。

從版本1.11.0開始,能夠屢次指定該指令來加載不一樣類型的證書,例如RSA和ECDSA:

server {
    listen              443 ssl;
server_name         example.com;

    ssl_certificate     example.com.rsa.crt;
    ssl_certificate_key example.com.rsa.key;

    ssl_certificate     example.com.ecdsa.crt;
    ssl_certificate_key example.com.ecdsa.key;
    ...
}
例子

注意:應該記住的是,因爲HTTPS協議限制了最大的互操做性,虛擬服務器應該監聽不一樣的IP地址。

ssl_certificate_key

句法:    ssl_certificate_key file;
默認:    -
語境:    http, server
功能:    當前虛擬主機與其證書文件匹配的私鑰文件,用來解密

指定file給定虛擬服務器的PEM格式密鑰。

能夠指定值engine:name:id能夠指定代替file(1.7.9),該文件從OpenSSL引擎名稱加載具備指定標識的密鑰id。

ssl_ciphers

句法:    ssl_ciphers ciphers;
默認:    ssl_ciphers HIGH:!aNULL:!MD5;
語境:    http, server
功能:    指定支持加密算法

指定啓用的密碼。密碼以OpenSSL庫理解的格式指定,例如:

ssl_ciphers ALL:!aNULL:!EXPORT56:RC4 + RSA:+ HIGH:+ MEDIUM:+ LOW:+ SSLv2:+ EXP;

完整列表可使用「 openssl ciphers」命令查看。

之前版本的nginx 默認使用不一樣的密碼。

ssl_client_certificate

句法:    ssl_client_certificate file;
默認:    -
語境:    http, server
功能:    制定一個受信任的CA證書用於驗證客戶端證書

若是啓用了ssl_stapling,則指定包含filePEM格式的可信CA證書,用於驗證客戶端證書和OCSP響應。

證書列表將被髮送給客戶。若是不須要,可使用ssl_trusted_certificate指令。

ssl_crl

句法:    ssl_crl file;
默認:    -
語境:    http, server
該指令出如今0.8.7版本中。
功能:    證書吊銷列表

指定file用於驗證客戶端證書的PEM格式的撤銷證書(CRL)。

ssl_dhparam

句法:    ssl_dhparam file;
默認:    -
語境:    http, server
該指令出如今0.7.2版本中。

指定fileDHE密碼的DH參數。

ssl_ecdh_curve

句法:    ssl_ecdh_curve curve;
默認:    ssl_ecdh_curve auto;
語境:    http, server
該指令出如今版本1.1.0和1.0.6中。

指定一個curve用於ECDHE密碼。

當使用OpenSSL 1.0.2或更高版本時,能夠指定多條曲線(1.11.0),例如:

ssl_ecdh_curve prime256v1:secp384r1;

特殊值auto(1.11.0)指示nginx在使用OpenSSL 1.0.2或更高prime256v1版本時使用OpenSSL庫中內置的列表,或使用舊版本。

在版本1.11.0以前,prime256v1曲線是默認使用的。

ssl_password_file

句法:    ssl_password_file file;
默認:    -
語境:    http, server
該指令出如今版本1.7.3
功能:    指定password文件

指定file使用密碼對密鑰 ,其中每一個密碼都在單獨的行中指定。加載密鑰時會依次嘗試密碼。例:

http {
    ssl_password_file /etc/keys/global.pass;
    ...
    server {
        server_name www1.example.com;
        ssl_certificate_key /etc/keys/first.key;
    }
    server {
        server_name www2.example.com;
        # 命名管道也能夠用來代替文件
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}
例子

ssl_prefer_server_ciphers

句法:    ssl_prefer_server_ciphers on | off;
默認:    ssl_prefer_server_ciphers off;
語境:    http, server
功能:    服務端傾向使用的加密算法

指定在使用SSLv3和TLS協議時,服務器密碼應優先於客戶端密碼。

ssl_protocols

句法:    ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
默認:    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
語境:    http, server
功能:    使用什麼樣的加密協議,支持ssl協議版本

啓用指定的協議。

TLSv1.1和TLSv1.2參數(1.1.13,1.0.12)僅在使用OpenSSL 1.0.1或更高版本時才起做用。

僅當使用支持TLSv1.3的OpenSSL 1.1.1時 ,TLSv1.3參數(1.13.0)才起做用。

ssl_session_cache

句法:    ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
默認:    ssl_session_cache無;
語境:    http, server
功能:    ssl會話緩存

設置存儲會話參數的高速緩存的類型和大小。緩存能夠是如下任何一種類型:

off

嚴禁使用會話緩存:nginx明確告訴客戶端會話可能不會被重用。

none

會話緩存的使用被輕輕地禁止:nginx告訴客戶端會話可能被重用,但實際上不會將會話參數存儲在緩存中。

builtin

創建在OpenSSL中的緩存; 僅由一個工做進程使用。緩存大小在會話中指定。若是沒有給出大小,則等於20480個會話。內置緩存的使用可能致使內存碎片。

shared

全部工做進程之間共享的緩存。緩存大小以字節爲單位指定; 一兆字節能夠存儲大約4000個會話。每一個共享緩存都應該有一個任意的名字。具備相同名稱的緩存能夠在多個虛擬服務器中使用。

兩種緩存類型均可以同時使用,例如:

ssl_session_cache builtin:1000 shared:SSL:10m;

注意:但只使用沒有內置緩存的共享緩存應該更有效率。

ssl_session_ticket_key

句法:    ssl_session_ticket_key file;
默認:    -
語境:    http, server
這個指令出如今1.5.7版本中。

file使用用於加密和解密TLS會話票據的密鑰設置a。若是必須在多個服務器之間共享相同的密鑰,則該指令是必需的。默認狀況下,使用隨機生成的密鑰。

若是指定了多個密鑰,則只使用第一個密鑰來加密TLS會話票據。這容許配置密鑰旋轉,例如:

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

file必須含有80或48個字節的隨機數據,而且可使用下面的命令建立:

openssl rand 80> ticket.key

根據文件大小,AES256(80字節密鑰,1.11.8)或AES128(48字節密鑰)用於加密。

ssl_session_tickets

句法:    ssl_session_tickets on | off;
默認:    ssl_session_tickets;
語境:    http, server
該指令出如今1.5.9版本中。
功能:    禁用或啓用會話恢復

經過TLS會話票據啓用或禁用會話恢復。

ssl_session_timeout

句法:    ssl_session_timeout time;
默認:    ssl_session_timeout 5m;
語境:    http, server
功能:    ssl參數的有效時長,會話超時時間

指定客戶端能夠從新使用會話參數的時間。

ssl_stapling

句法:    ssl_stapling on | off;
默認:    ssl_stapling off;
語境:    http, server
這個指令出如今1.3.7版本中。

啓用或禁用 服務器對OCSP響應的裝訂。例:

ssl_stapling on;
resolver 192.0.2.1;

要使OCSP裝訂工做,應該知道服務器證書頒發者的證書。若是ssl_certificate文件不包含中間證書,則服務器證書頒發者的證書應存在於ssl_trusted_certificate文件中。

對於OCSP響應者主機名的解析,也應指定解析器指令。

ssl_stapling_file

句法:    ssl_stapling_file file;
默認:    -
語境:    http, server
這個指令出如今1.3.7版本中。

設置時,裝訂好的OCSP響應將取自指定的地址,file而不是查詢服務器證書中指定的OCSP響應者。

該文件應該是由「openssl ocsp」命令產生的DER格式。

ssl_stapling_responder

句法:    ssl_stapling_responder url;
默認:    -
語境:    http, server
這個指令出如今1.3.7版本中。

覆蓋「 受權信息訪問 」證書擴展中指定的OCSP響應者的URL 。

僅http://支持「 」OCSP響應者:

ssl_stapling_responder http://ocsp.example.com/;

ssl_stapling_verify

句法:    ssl_stapling_verify on | off;
默認:    ssl_stapling_verify off;
語境:    http, server
這個指令出如今1.3.7版本中。

啓用或禁用服務器驗證OCSP響應。

要使驗證生效,應使用ssl_trusted_certificate指令將服務器證書頒發者,根證書和全部中間證書的證書配置爲可信。

ssl_trusted_certificate

句法:    ssl_trusted_certificate file;
默認:    -
語境:    http, server
這個指令出如今1.3.7版本中。

若是啓用了ssl_stapling,則 指定包含filePEM格式的可信CA證書,用於驗證客戶端證書和OCSP響應。

與由ssl_client_certificate設置的證書相比,這些證書的列表不會被髮送到客戶端。

ssl_verify_client

句法:    ssl_verify_client on | off | optional | optional_no_ca;
默認:    ssl_verify_client off;
語境:    http, server

啓用客戶端證書的驗證。驗證結果存儲在 $ ssl_client_verify變量中。

的optional參數(0.8.7+)請求的客戶端證書,並驗證它證書是否存在。

該optional_no_ca參數(1.3.8,1.2.5)要求客戶端證書,但不要求它由受信任的CA證書進行簽名。這適用於nginx外部的服務執行實際證書驗證的狀況。證書的內容能夠經過$ ssl_client_cert變量訪問。

ssl_verify_depth

句法:    ssl_verify_depth number;
默認:    ssl_verify_depth 1;
語境:    http, server

設置客戶端證書鏈中的驗證深度。

錯誤處理

該ngx_http_ssl_module模塊支持使用error_page指令能夠用於重定向的幾個非標準錯誤代碼 :

495     客戶端證書驗證過程當中發生錯誤;
496     客戶沒有提交所需的證書;
497     常規請求已發送到HTTPS端口。

重定向發生後,該請求被徹底解析和變量,如$request_uri, $uri,$args等人,均可用。

嵌入式變量

該ngx_http_ssl_module模塊支持多個嵌入式變量:

$ssl_cipher

返回用於創建的SSL鏈接的密碼字符串;

$ssl_ciphers

返回客戶端支持的密碼列表(1.11.7)。已知的密碼按名稱列出,未知以十六進制顯示,例如:

AES128-SHA:AES256-SHA:0x00ff

注意:只有在使用OpenSSL版本1.0.2或更高版本時才支持該變量。對於舊版本,該變量僅適用於新會話,並只列出已知密碼。

$ssl_client_escaped_cert

以創建的SSL鏈接(1.13.5)返回PEM格式的客戶端證書(urlencoded);

$ssl_client_cert

以創建的SSL鏈接的PEM格式返回客戶端證書,除第一行以外的每一行都加上製表符;這是爲了在 proxy_set_header指令中使用;

注意:該變量已被棄用,$ssl_client_escaped_cert應該使用該變量。

$ssl_client_fingerprint

爲創建的SSL鏈接(1.7.1)返回客戶端證書的SHA1指紋;

$ssl_client_i_dn

根據RFC 2253(1.11.6),爲創建的SSL鏈接返回客戶端證書的「頒發者DN」字符串;

$ssl_client_i_dn_legacy

爲創建的SSL鏈接返回客戶端證書的「頒發者DN」字符串;

說明:在版本1.11.6以前,變量名是$ssl_client_i_dn。

$ssl_client_raw_cert

以創建的SSL鏈接的PEM格式返回客戶端證書;

$ssl_client_s_dn

根據RFC 2253(1.11.6),爲創建的SSL鏈接返回客戶端證書的「主題DN」字符串;

$ssl_client_s_dn_legacy

爲創建的SSL鏈接返回客戶端證書的「主題DN」字符串;

說明:在版本1.11.6以前,變量名是$ssl_client_s_dn。

$ssl_client_serial

爲創建的SSL鏈接返回客戶端證書的序列號;

$ssl_client_v_end

返回客戶端證書的結束日期(1.11.7);

$ssl_client_v_remain

返回客戶端證書過時的天數(1.11.7);

$ssl_client_v_start

返回客戶端證書的開始日期(1.11.7);

$ssl_client_verify

若是證書不存在,則 返回客戶端證書驗證的結果:「 SUCCESS」,「 FAILED:reason」和「 NONE」;

說明:在版本1.11.7以前,「 FAILED」結果不包含reason字符串。

$ssl_curves

返回客戶端支持的曲線列表(1.11.7)。已知曲線按名稱列出,未知以十六進制顯示,例如:

0x001d:prime256v1:secp521r1:secp384r1

注意:只有在使用OpenSSL版本1.0.2或更高版本時才支持該變量。對於舊版本,變量值將是一個空字符串。該變量僅適用於新會話。

$ssl_protocol

返回創建的SSL鏈接的協議;

$ssl_server_name

經過SNI (1.7.0)返回請求的服務器名稱 ;

$ssl_session_id

返回創建的SSL鏈接的會話標識符;

$ssl_session_reused

若是SSL會話被重用,則 返回「 」;不然返回「 」 .(1.5.11)。

相關文章
相關標籤/搜索