Http
HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。
使用TCP端口为:80。
是浏览器默认的协议。
也就是:
如果在地址栏输入:rainbow.dingding.com,
浏览器会认为真正的地址是:http://rainbow.dingding.com:80
Https
Hyper Text Transfer Protocol over SecureSocket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Sockets Layer)协议用于对Http协议传输的数据进行加密,保证会话过程中的安全性。
使用TCP端口默认为443。
使用https必须在地址栏指定。
也就是:
在地址栏输入:https://rainbow.dingding.com,
浏览器会认为真正的地址是:https://rainbow.dingding.com:443
https在tomcat的配置
定位到tomcat的安装目录,找到conf下的server.xml文件
找到如下已经被注释的代码:
<!--
<Connector port="8443"protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150"scheme="https" secure="true"
clientAuth="false"sslProtocol="TLS" />
-->
去掉注释,修改为:
<Connectorport="8443" protocol="HTTP/1.1"SSLEnabled="true"
maxThreads="150"scheme="https" secure="true"
clientAuth="false"sslProtocol="TLS"
keystoreFile="D:\Tools\Web\ssl\tomcat.keystore"
keystorePass="tomcat"
ciphers="tomcat"/>
https在nginx的配置
配置在nginx.conf中,关键是其中server部分,举例如下:
worker_processes 1;
events{
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 300s;
upstream localhosta{
server 10.5.25.178:9080;
server 10.5.24.178:9080;
}
server {
listen 443;
server_name rainbow.dingding.com;
ssl on;
ssl_certificate /etc/nginx/dingding.com.crt;
ssl_certificate_key /etc/nginx/dingding.com.key;
location / {
index index_tel.jsp index.jsp index.html index.htm;
proxy_redirect off;
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_buffers 32 4k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
proxy_pass http://localhosta/;
}
}
send_timeout120;
tcp_nodelay on;
#fastcgi options
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 32k;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css application/xml;
include sites-enabled/*;
}
https协议中的客户端和服务端是怎么交互的
在客户端正式向服务端发送请求之前,首先要进行握手,也就是认证,分为两种,单向认证和双向认证。
单向认证的过程:
1, 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
2, 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书。
3, 客户端使用服务端返回的信息验证服务器的合法性,包括:
l 证书是否过期
l 发行服务器证书的CA(Certificate Authority )是否可靠
l 返回的公钥是否能正确解开返回证书中的数字签名
l 服务器证书上的域名是否和服务器的实际域名相匹配
验证通过后,将继续进行通信,否则,终止通信
CA:证书授权中心,是电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
4, 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
5, 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式。
6, 服务器将选择好的加密方案通过明文方式返回给客户端
7, 客户端接收到服务端返回的加密方式后,使用该加密方式生成产生随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送至服务器
8, 服务器收到客户端返回的加密信息后,使用自己的私钥进行解密,获取对称加密密钥。
9, 在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
双向认证的过程:
双向认证相比单向认证增加了服务端对客户端的认证:
1, 客户端向服务端发送SSL协议版本号、加密算法种类、随机数等信息。
2, 服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书
3, 客户端使用服务端返回的信息验证服务器的合法性,包括:
l 证书是否过期
l 发行服务器证书的CA是否可靠
l 返回的公钥是否能正确解开返回证书中的数字签名
l 服务器证书上的域名是否和服务器的实际域名相匹配
验证通过后,将继续进行通信,否则,终止通信
4, 服务端要求客户端发送客户端的证书,客户端会将自己的证书发送至服务端
5, 验证客户端的证书,通过验证后,会获得客户端的公钥
6, 客户端向服务端发送自己所能支持的对称加密方案,供服务器端进行选择
7, 服务器端在客户端提供的加密方案中选择加密程度最高的加密方式
8, 将加密方案通过使用之前获取到的公钥进行加密,返回给客户端
9, 客户端收到服务端返回的加密方案密文后,使用自己的私钥进行解密,获取具体加密方式,而后,产生该加密方式的随机码,用作加密过程中的密钥,使用之前从服务端证书中获取到的公钥进行加密后,发送给服务端
10,服务端收到客户端发送的消息后,使用自己的私钥进行解密,获取对称加密的密钥,在接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信过程中信息的安全。
https协议中的加密的过程
https协议中的加密使用了SSL协议,SSL的加密既用了对称加密也用了非对称加密,对称加密速度快,平时传输用对称加密,非对称加密传密码比较安全,所以对称加密的密码用非对称加密来传,这种加密方式的关键是用非对称加密的方式用密文传输了对称加密用的密码。
非对称加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。
以RSA算法为例:
1, 根据模反元素相关的算法得到公钥和私钥,比如公钥(n,e),私钥(n,d),需要加密的内容m(https中双方的对称加密的密码),e和d互为模反元素。
2, 加密:
me ≡ c (mod n)
算出的C就是加密后的密文。
3,解密:
cd ≡ m (mod n)
算出的m就是加密前的内容,也就是对称加密的秘钥。加密和解密的公式有效性可以用欧拉定理来证明。
4,RSA算法不易破解的关键在于,n是两个质数的乘积,如果n是一个很大的数,比如n有好几百位,那么对n的因式分解就会很困难,如果成功的对n进行了因式分解,就可以根据公钥得到私钥的内容。
RSA算法举例:
1,任取两个质数,比如p=3,q=11
2,计算n=p*q,也就是n=33
3,计算A=(p-1)*(q-1),也就是A=20
4,在1到A之间随便选个数e,要求e和A互质,比如选e=3(随便选的,和p=3没有关系)
5,计算d,要求e*d mod(A)=1,也就是3*d对20取模等于1,d可以等于7,可以等于17,还可以等于其他很多值,这里选d=7
6,于是得到了e和d,e和d关于A互为模反元素,那么,公钥就是(n,e)也就是(33,3),私钥就是(n,d)也就是(33,7)
7,公钥(33,3)由服务器发给浏览器,私钥(33,7)由服务器自己留下。假如浏览器要发送的内容是18,用m表示,即m=18,那么m的e次方对n取模,即18的3次方对33取模,得到结果c=24,也就是浏览器发送的加密内容是24
8,服务器收到24的加密内容后,用c的d次方对n取模,即24的7次方对33取模,得到m=18,也就是浏览器本来要发送的内容。