https原理及实践
Posted 酷酷的二连长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了https原理及实践相关的知识,希望对你有一定的参考价值。
转载请注明出处
安全知识
网络安全问题
数据机密性
在网络传输数据信息时,对数据的加密是至关重要的,否则所有传输的数据都是可以随时被第三方看到,完全没有机密性可言。
数据机密性解决问题思路
利用算法
为了保证数据的机密性,首先可以采用的方法就是将数据通过相应算法,转换为其它的数据信息,然后再通过相应算法反推出真正的数据是什么,这样一来就保证了数据在网络传输过程中安全性,不会被其它人轻易的看到传输过程中的数据信息。数据加密前的信息称为明文数据(plaintext),经过加密算法转换后进行传输的信息称为密文数据(ciphertext);反之经 过解密算法转换后,会将密文数据恢复为明文数据进行显示接收。
优点:实现了数据机密传输,避免了明文传输数据的危险性。
缺点:利用加密算法,将明文改密文,如果第三方获得加密算法,即可将传输密文再次变为明文。
利用对称加密算法解决机密性
普通算法虽然已经解决了明文数据的机密性,可以在网络传输过程中不被直接看到明文数据。 但是新的问题又产生了,既然明文数据是通过算法改变成了新的数据信息,如果第三方获得 了算法,利用算法也是可以将密文数据信息,再次转换为明文数据信息,因此出现了对称加 密算法。形象比喻来说:数据加密算法就好比是一本密码规则手册,而对称加密算法就是将手册放在了一个保险柜中进行了上锁传输,只有传递数据信息的双方知道打开保险柜的密码。
数据完整性
网络传输数据的完整性,也是安全领域中需要考虑的重要环节,如果不能保证传输数据的完整性,那传输过程中的数据就有可能被任何人所篡改,而传输数据双方又不能及早的进行发现。将会造成互连通讯双方所表达信息的意义完全不一致。因此,对于不完整的数据信息,接收方应该进行相应判断,如果完整性验证错误,就拒绝接受相应的数据。
数据完整性解决思路
利用单向加密算法
利用数据的单项加密算法(提取数据指纹),进行提取数据特征码的方式,从而完成数据传 输的完整性验证。实际的算法实现过程为:在一段明文数据信息后加上敎据信息的特征码, 这个特征码是通过结合数据信息进行相应算法获得的数据特征码,接收方当收到数据信息后, 会利用相同的加密算法对获取的数据进行加密,确认加密后得到的特征码是否与传送过来数 据后面描述的特征码一致;如果一致,可以表示数据没有被篡改过,如果不一致表示数据完 整性遭到了破坏,数据一概不予以接收处理。
利用单项加密算法(加密特征码)
由于可能存在中间人攻击的可能性,因此可以对传输过程中数据特征码进行加密,发送方利用对称密钥方式对手中的特征码进行加密,接收方会利用相同的密钥对手中的特征码进行解密,从而确认特征码是否一致。如果中间人将新的特征码也进行了加密,发送给接收方,但接收方无法利用和发送方协商好的解密密钥对特征码进行解密,最终无法识别中间人发送过来的数据特征码信息。
单项加密算法特征:
- 数据输入一样,特征码信息输出必然相同
- 雪崩效应,输入的微小改变,将造成输出的巨大改变
- 定长输出,无论源数据多大,但结果都是一样的
- 不可逆的,无论根据数据指纹,还原出原来的数据信息
单项加密算法常见的有:
- 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软件详细说明
1、获取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
2、获取OpenSSL配置文件信息:
/etc/pki/tls/openssl.cnf <- openssl配置文件,主要用于配置成私有ca时进行使用
3、获取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软件建立私有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,进行公钥的生成
实操私钥与公钥建立
[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)。
以上是关于https原理及实践的主要内容,如果未能解决你的问题,请参考以下文章