轉載請註明出處算法
在網絡傳輸數據信息時,對數據的加密是相當重要的,不然全部傳輸的數據都是能夠隨時被第三方看到,徹底沒有機密性可言。vim
利用算法瀏覽器
爲了保證數據的機密性,首先能夠採用的方法就是將數據經過相應算法,轉換爲其它的數據信息,而後再經過相應算法反推出真正的數據是什麼,這樣一來就保證了數據在網絡傳輸過程當中安全性,不會被其它人輕易的看到傳輸過程當中的數據信息。數據加密前的信息稱爲明文數據(plaintext),通過加密算法轉換後進行傳輸的信息稱爲密文數據(ciphertext);反之經 過解密算法轉換後,會將密文數據恢復爲明文數據進行顯示接收。緩存
優勢:實現了數據機密傳輸,避免了明文傳輸數據的危險性。安全
缺點:利用加密算法,將明文改密文,若是第三方得到加密算法,便可將傳輸密文再次變爲明文。服務器
利用對稱加密算法解決機密性網絡
普通算法雖然已經解決了明文數據的機密性,能夠在網絡傳輸過程當中不被直接看到明文數據。 可是新的問題又產生了,既然明文數據是經過算法改變成了新的數據信息,若是第三方得到 了算法,利用算法也是能夠將密文數據信息,再次轉換爲明文數據信息,所以出現了對稱加 密算法。形象比喻來講:數據加密算法就比如是一本密碼規則手冊,而對稱加密算法就是將手冊放在了一個保險櫃中進行了上鎖傳輸,只有傳遞數據信息的雙方知道打開保險櫃的密碼。
網絡傳輸數據的完整性,也是安全領域中須要考慮的重要環節,若是不能保證傳輸數據的完整性,那傳輸過程當中的數據就有可能被任何人所篡改,而傳輸數據雙方又不能及早的進行發現。將會形成互連通信雙方所表達信息的意義徹底不一致。所以,對於不完整的數據信息,接收方應該進行相應判斷,若是完整性驗證錯誤,就拒絕接受相應的數據。
利用單向加密算法
利用數據的單項加密算法(提取數據指紋),進行提取數據特徵碼的方式,從而完成數據傳 輸的完整性驗證。實際的算法實現過程爲:在一段明文數據信息後加上敎據信息的特徵碼, 這個特徵碼是經過結合數據信息進行相應算法得到的數據特徵碼,接收方當收到數據信息後, 會利用相同的加密算法對獲取的數據進行加密,確認加密後獲得的特徵碼是否與傳送過來數 據後面描述的特徵碼一致;若是一致,能夠表示數據沒有被篡改過,若是不一致表示數據完 整性遭到了破壞,數據一律不予以接收處理。
利用單項加密算法(加密特徵碼)
因爲可能存在中間人攻擊的可能性,所以能夠對傳輸過程當中數據特徵碼進行加密,發送方利用對稱密鑰方式對手中的特徵碼進行加密,接收方會利用相同的密鑰對手中的特徵碼進行解密,從而確認特徵碼是否一致。若是中間人將新的特徵碼也進行了加密,發送給接收方,但接收方沒法利用和發送方協商好的解密密鑰對特徵碼進行解密,最終沒法識別中間人發送過來的數據特徵碼信息。
單項加密算法特徵:
單項加密算法常見的有:
非對稱加密算法常見的有:
網絡中傳輸數據時,頗有可能傳輸的雙方是第一次創建鏈接,進行相互通信,既然是第一次 見面溝通,如何確認對方的身份信息,的確是我要進行通信的對象呢?若是不是正確的通信 對象,在通過通信後,豈不是將全部數據信息發送給了一個陌生人。
默認公鑰在網絡中進行傳遞時,默認狀況下也是會出現問題的以下圖所示:
對發送方的公鑰信息進行公正步驟:(藉助第三方安全機構)
目前標準的證書存儲格式是X509,還有其餘的證書格式,須要包含的內容爲:
互聯網上使用的SSL和TLS證書管理機制均使用X509的格式
Netscape網景公司生產了最初的瀏覽器,但爲了提升瀏覽器訪問頁面的安全性,對TCP/IP模型進行了必定改進,在傳輸層與應用層之間,建立了一個3.5層的概念,稱爲SSL((Secure Sockets Layer安全套接層))層,SSL不是一個軟件,只是一個庫,讓應用層將數據傳輸到傳輸層前,調用了ssl層的功能對數據進行了加密,目前比較流行的版本是(SSLv2 V3),可是SSL是netscape公司進行定義的,不夠開放性,所以爲了使加密功能更加開放,TSL(傳輸層安全協議)協議就出現了,目前比較流行的版本是(TSLv1==ssl v3),TSL更像是傳輸層上實現的數據加密。
一、獲取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命令詳細信息:
須要先給ca證書頒發機構生成證書,即生成一對密鑰;genrsa - generate an RSA private key利用genrsa生成密鑰信息。雖然只是生成私鑰,但須要清楚公鑰是經過私鑰進行提取獲得的,因此只要有私鑰,就能夠有公鑰。私鑰信息是很是重要的,所以生成的私鑰文件應該是600的權限
實操私鑰與公鑰創建
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 |
默認的公司部分名稱 |
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很煩,因此設置自動跳轉
在本來的server模塊上在加一個server:
server { listen 80; server_name www.erlianzhang.com; rewrite ^(.*)$ https://$host$1 permanent; }
說明:在https配置server基礎上再添加http跳轉server
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處理時
將端口改成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; } }
server { listen 80; server_name www.erlianzhang.com; rewrite ^(.*)$ https://$host$1 permanent; }
語法: ssl on | off; 默認: ssl off 語境: http,server 功能: ssl功能啓用/不啓用
爲給定的虛擬服務器啓用HTTPS協議。
句法: ssl_buffer_size size; 默認: ssl_buffer_size 16k; 語境: http, server 該指令出如今1.5.9版本中。 功能: 設置用於發送數據的緩衝區的大小。
默認狀況下,緩衝區大小爲16k,這對應於發送大響應時的最小開銷。爲了最小化第一個字節的時間,使用較小的值多是有益的,例如:
ssl_buffer_size 4k;
句法: ssl_certificate file; 默認: - 語境: http, server 功能: 指定當前虛擬主機所使用的證書文件
指定file具備給定虛擬服務器的PEM格式的證書。若是除了主要證書以外還應該指定中間證書,則應該按照如下順序在同一個文件中指定它們:主要證書首先是中間證書,而後是中間證書。PEM格式的密鑰能夠放在同一個文件中。
從版本1.11.0開始,能夠屢次指定該指令來加載不一樣類型的證書,例如RSA和ECDSA:
注意:應該記住的是,因爲HTTPS協議限制了最大的互操做性,虛擬服務器應該監聽不一樣的IP地址。
句法: ssl_certificate_key file; 默認: - 語境: http, server 功能: 當前虛擬主機與其證書文件匹配的私鑰文件,用來解密
指定file給定虛擬服務器的PEM格式密鑰。
能夠指定值engine:name:id能夠指定代替file(1.7.9),該文件從OpenSSL引擎名稱加載具備指定標識的密鑰id。
句法: 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 file; 默認: - 語境: http, server 功能: 制定一個受信任的CA證書用於驗證客戶端證書
若是啓用了ssl_stapling,則指定包含filePEM格式的可信CA證書,用於驗證客戶端證書和OCSP響應。
證書列表將被髮送給客戶。若是不須要,可使用ssl_trusted_certificate指令。
句法: ssl_crl file; 默認: - 語境: http, server 該指令出如今0.8.7版本中。 功能: 證書吊銷列表
指定file用於驗證客戶端證書的PEM格式的撤銷證書(CRL)。
句法: ssl_dhparam file; 默認: - 語境: http, server 該指令出如今0.7.2版本中。
指定fileDHE密碼的DH參數。
句法: 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 file; 默認: - 語境: http, server 該指令出如今版本1.7.3。 功能: 指定password文件
指定file使用密碼對密鑰 ,其中每一個密碼都在單獨的行中指定。加載密鑰時會依次嘗試密碼。例:
句法: ssl_prefer_server_ciphers on | off; 默認: ssl_prefer_server_ciphers off; 語境: http, server 功能: 服務端傾向使用的加密算法
指定在使用SSLv3和TLS協議時,服務器密碼應優先於客戶端密碼。
句法: 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 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 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 on | off; 默認: ssl_session_tickets; 語境: http, server 該指令出如今1.5.9版本中。 功能: 禁用或啓用會話恢復
經過TLS會話票據啓用或禁用會話恢復。
句法: ssl_session_timeout time; 默認: ssl_session_timeout 5m; 語境: http, server 功能: ssl參數的有效時長,會話超時時間
指定客戶端能夠從新使用會話參數的時間。
句法: 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 file; 默認: - 語境: http, server 這個指令出如今1.3.7版本中。
設置時,裝訂好的OCSP響應將取自指定的地址,file而不是查詢服務器證書中指定的OCSP響應者。
該文件應該是由「openssl ocsp」命令產生的DER格式。
句法: ssl_stapling_responder url; 默認: - 語境: http, server 這個指令出如今1.3.7版本中。
覆蓋「 受權信息訪問 」證書擴展中指定的OCSP響應者的URL 。
僅http://支持「 」OCSP響應者:
ssl_stapling_responder http://ocsp.example.com/;
句法: ssl_stapling_verify on | off; 默認: ssl_stapling_verify off; 語境: http, server 這個指令出如今1.3.7版本中。
啓用或禁用服務器驗證OCSP響應。
要使驗證生效,應使用ssl_trusted_certificate指令將服務器證書頒發者,根證書和全部中間證書的證書配置爲可信。
句法: ssl_trusted_certificate file; 默認: - 語境: http, server 這個指令出如今1.3.7版本中。
若是啓用了ssl_stapling,則 指定包含filePEM格式的可信CA證書,用於驗證客戶端證書和OCSP響應。
與由ssl_client_certificate設置的證書相比,這些證書的列表不會被髮送到客戶端。
句法: 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 number; 默認: ssl_verify_depth 1; 語境: http, server
設置客戶端證書鏈中的驗證深度。
該ngx_http_ssl_module模塊支持使用error_page指令能夠用於重定向的幾個非標準錯誤代碼 :
495 客戶端證書驗證過程當中發生錯誤; 496 客戶沒有提交所需的證書; 497 常規請求已發送到HTTPS端口。
重定向發生後,該請求被徹底解析和變量,如requesturi,requesturi,uri,$args等人,均可用。
該ngx_http_ssl_module模塊支持多個嵌入式變量:
返回用於創建的SSL鏈接的密碼字符串;
返回客戶端支持的密碼列表(1.11.7)。已知的密碼按名稱列出,未知以十六進制顯示,例如:
AES128-SHA:AES256-SHA:0x00ff
注意:只有在使用OpenSSL版本1.0.2或更高版本時才支持該變量。對於舊版本,該變量僅適用於新會話,並只列出已知密碼。
以創建的SSL鏈接(1.13.5)返回PEM格式的客戶端證書(urlencoded);
以創建的SSL鏈接的PEM格式返回客戶端證書,除第一行以外的每一行都加上製表符;這是爲了在 proxy_set_header指令中使用;
注意:該變量已被棄用,$ssl_client_escaped_cert應該使用該變量。
爲創建的SSL鏈接(1.7.1)返回客戶端證書的SHA1指紋;
根據RFC 2253(1.11.6),爲創建的SSL鏈接返回客戶端證書的「頒發者DN」字符串;
爲創建的SSL鏈接返回客戶端證書的「頒發者DN」字符串;
說明:在版本1.11.6以前,變量名是$ssl_client_i_dn。
以創建的SSL鏈接的PEM格式返回客戶端證書;
根據RFC 2253(1.11.6),爲創建的SSL鏈接返回客戶端證書的「主題DN」字符串;
爲創建的SSL鏈接返回客戶端證書的「主題DN」字符串;
說明:在版本1.11.6以前,變量名是$ssl_client_s_dn。
爲創建的SSL鏈接返回客戶端證書的序列號;
返回客戶端證書的結束日期(1.11.7);
返回客戶端證書過時的天數(1.11.7);
返回客戶端證書的開始日期(1.11.7);
若是證書不存在,則 返回客戶端證書驗證的結果:「 SUCCESS」,「 FAILED:reason」和「 NONE」;
說明:在版本1.11.7以前,「 FAILED」結果不包含reason字符串。
返回客戶端支持的曲線列表(1.11.7)。已知曲線按名稱列出,未知以十六進制顯示,例如:
0x001d:prime256v1:secp521r1:secp384r1
注意:只有在使用OpenSSL版本1.0.2或更高版本時才支持該變量。對於舊版本,變量值將是一個空字符串。該變量僅適用於新會話。
返回創建的SSL鏈接的協議;
經過SNI (1.7.0)返回請求的服務器名稱 ;
返回創建的SSL鏈接的會話標識符;
若是SSL會話被重用,則 返回「 」;不然返回「 」 .
(1.5.11)。