100.1、 tcp的三次握手和四次挥手的过程:
1、三次握手(建立连接):
第一次:建立连接时,客户端发送SYN包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次:服务器收到SYN包,向客户端返回ACK(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RCVD状态;
第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,也就是ESTABLISHED状态。
三次握手保证了不会建立无效的连接,从而浪费资源。
2、四次挥手(断开连接):
第一次: TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
第二次:服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
第三次:服务器关闭客户端的连接,发送一个FIN给客户端。
第四次:客户端发回ACK报文确认,并将确认序号设置为收到序号加1。
100.2、HTTP请求过程:
建立连接完毕以后客户端会发送响应给服务端
服务端接受请求并且做出响应发送给客户端
客户端收到响应并且解析响应响应给客户
100.3、https请求过程:
在使用HTTPS是需要保证服务端配置正确了对应的安全证书;
客户端发送请求到服务端;
服务端返回公钥证书到客户端;
客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端;
服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密;
客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户;
SSL加密建立;
100.4、安装nginx软件:
yum -y install pcre-devel openssl-devel
useradd nginx -M -s /sbin/nologin
tar xf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.8.1
make && make install
ln -s /application/nginx-1.8.1/ /application/nginx
100.5、生成私钥和公钥:
[root@m01 ~]# cd /application/nginx/
[root@m01 nginx]# mkdir ssl #为证书创建目录
[root@m01 nginx]# cd ssl
1、生成私钥:
[root@m01 ssl]# openssl genrsa -des3 -out server.key 1024 #创建服务器证书密钥文件 server.key;
Generating RSA private key, 1024 bit long modulus
.............++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for server.key: #创建密码,后面要用到;
Verifying - Enter pass phrase for server.key: # 确认密码;
2、生成公钥:
[root@m01 ssl]# openssl req -new -key server.key -out server.csr #生成证书颁发机构,用于颁发公钥,server.csr;
Enter pass phrase for server.key: #创建服务器证书秘钥文件时输入的密码;
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 #国家代号, CN
State or Province Name (full name) []:AaHui #省的全名,拼音 AaHui
Locality Name (eg, city) [Default City]:HeiFei #市的全名,拼音 HeFei
Organization Name (eg, company) [Default Company Ltd]:Microsoft #公司的英文名字
Organizational Unit Name (eg, section) []: #部门的英文名称,可以不输入
Common Name (eg, your name or your server's hostname) []: #网站的域名,此时不输入
Email Address []: #电子邮件的地址,可以不输入
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #可以不输入
An optional company name []: #可以不输入
106、生成标记证书,标记公钥和私钥:
[root@m01 ssl]# cp server.key server.key.org #备份服务器的秘钥文件
[root@m01 ssl]# openssl rsa -in server.key.org -out server.key #去除服务器秘钥文件的口令,因为以后要给nginx使用。
#每次reload nginx配置时候都要你验证这个PAM密码的,不方便,所以去除私钥的密码;
Enter pass phrase for server.key: #输入服务器秘钥文件创建时的密码;
writing RSA key
[root@m01 ssl]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt #最后标记证书server.crt使用上述私钥server.key和公钥server.csr
Signature ok
subject=/C=CN/ST=AaHui/L=HeiFei/O=Microsoft
Getting Private key
107、配置nginx配置文件:
[root@m01 nginx]# cat conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 443; #ssl监听的端口号是443;
server_name localhost;
ssl on; #开启ssl; 如果把ssl on这行去掉,ssl写在443端口后面。这样http和https的链接都可以用;
ssl_certificate /application/nginx/ssl/server.crt; #证书路径,只有公钥会被发送到客户端;
ssl_certificate_key /application/nginx/ssl/server.key; #私钥路径;
ssl_session_timeout 5m; #ssl超时设置;
###############################################################
#通过重用Session提高https的性能:
#builtin:在OpenSSL中构建的缓存;仅由一个工作进程使用。缓存大小在session中指定。
#如果没有给出大小,则等于20480个会话。使用内置高速缓存可能导致内存碎片。
#shared:所有工作进程之间共享缓存。缓存大小以字节为单位指定;一兆字节可以存储大约4000个session。
#ssl_session_cache shared:SSL:10m;#官网上指出这种方法更高效;
################################################################
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols SSLv2 SSLv3 TLSv1; #启动特定的加密协议;
ssl_ciphers HIGH:!aNULL:!MD5; #设置数据的加密方式;
ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
108、测试:
109、https证书失效的问题:
安全证书不被信任:
通常在对安全性要求高的网站会使用安全证书来确保您的通信安全,防止被第三方攻击或窃听。
出现”安全证书不被信任“时,请按如下顺序进行排查:
1、检查电脑系统时间是否正确。错误的系统时间会造成证书过期或效验失败,请修改系统时间后再次访问网站。
2、是否使用了代理服务器。代理服务器会导致安全证书无效,可关闭代理服务器后再次访问网站。
3、是否公司专用在线办公网站。此类网站会采用自己生成的证书,非国际公认的安全机构所颁发,故不被浏览器信任。
安全证书不是“受信任的根证书颁发机构 ”颁发的:
SSL安全证书必须由浏览器中“受信任的根证书颁发机构”认证颁发。由不受浏览器信任的机构颁发的安全证书被称为“自签证书”,自签证书不受国际标准约束,
容易被假冒伪造,可被欺诈网站利用或用于中间人攻击,存在极大的安全风险。为确保用户访问安全,浏览器会提示“安全证书不受信任”,并告知用户“此网站出具
的安全证书不是受信任的证书颁发机构颁发的”。此类情况需谨慎处理,不推荐继续浏览此网站。网站经营者可采用受浏览器信任的SSL安全证书解决该提示,可使用免
费SSL证书或显示绿色地址栏的收费SSL证书。
安全证书已被吊销:
SSL安全证书已被颁发机构吊销,说明该安全证书已失效,浏览器会提示“安全证书不受信任”。
安全证书已过期:
SSL安全证书已过期,网站未及时更新,浏览器会提示“安全证书不受信任”。
安全证书认证域名与该网站域名不一致
为确保网站身份真实,SSL安全证书只能用于已被认证的网站域名上,如当前网站域名与安全证书已认证的域名不一致,浏览器会提示“安全证书不受信任”。
网络原因或数据被监听
因国家防火墙或是公司内网的网监系统,造成数据流量被劫持修改,从而出现证书异常,此类问题一般出现在您访问google的加密搜索,或是其他正规的加密网站。
此外,木马病毒对您网络流量的监听也可能造成证书效验失败。