转载请注明出处算法
在网络传输数据信息时,对数据的加密是相当重要的,不然全部传输的数据都是能够随时被第三方看到,彻底没有机密性可言。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)。