HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据
1、客户端向服务端发起HTTPS请求,连接到服务端的443端口
2、服务端将非对称加密的公钥传给客户端,与证书的形式传给客户端
3、服务端接收到该公钥进行验证,就是验证2中证书,如果有问题,则HTTPS请求无法继续;如果没有问题,则上述公钥是合格的。(第一次HTTP请求)客户端这个时候随机生成一个私钥,成为client key,客户端私钥,用于对称加密数据的;使用前面的公钥对client key进行非对称加密
4、进行二次HTTPS请求,将加密之后的client key传输给服务端
5、服务端使用私钥进行解密,得到client key,使用client key对数据进行对称加密
6、将对称加密的数据发送给客户端,客户端使用非对称解密,得到服务端发来的数据,完成二次HTTPS请求
SSL的位置
SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头
RAS性能是非常低的,原因在于孕照大素数,大数计算,数据分割需要耗费很多的CPU周期,所以一般的HTTPS连接只在第一次握手的时候使用非对称加密,通过握手交换对称加密密钥,通过握手交换对称加密数据,在之后的通信走对称加密
HTTPS协议和HTTP协议的区别:
https协议需要到CA申请证书,一般免费证书很少,需要交费
http是超文本传输协议,信息是明文传输,https则是具有安全行的ssl加密传输协议
http和httpsshiy使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443
http的连接很简单是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议,要比http协议安全
[root@C7--01 ~]# openssl genrsa -des3 -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.................................++++++
...++++++
e is 65537 (0x10001)
Enter pass phrase for server.key: #输入密码 密码直接输入这里输入123.com
Verifying - Enter pass phrase for server.key: #再次输入密码 密码直接输入这里输入123.com
[root@C7--01 ~]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key: #输入serve.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) []:BeiJing #省的全名,拼音
Locality Name (eg, city) [Default City]:BeiJng #市的全名,拼音
Organization Name (eg, company) [Default Company Ltd]:MyCompany Corp. #公司英文名
Organizational Unit Name (eg, section) []: #可以不输入;组织单位
Common Name (eg, your name or your server's hostname) []:www.bene.com #输入域名,如:www.bene.com
Email Address []:[email protected] #电子邮箱,可随意填
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #可以不输入
An optional company name []: #可以不输入
[root@C7--01 ~]# cp server.key server.key.org
[root@C7--01 ~]# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org: #输入server.key
writing RSA key
[root@C7--01 ~]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=BeiJing/L=BeiJng/O=MyCompany Corp./CN=www.bene.com/[email protected]
Getting Private key
[root@C7--01 ~]# ls
server.crt server.csr server.key server.key.org
[root@C7--01 ~]# vim /usr/local/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$http_user_agent' '$request_uri' '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"' '"$upstream_cache_status"';
server {
listen 443 ssl; #比起默认的80使用了443默认是ssl方式
ssl_certificate ssl/server.crt; #证书(公钥,发送到客户端)
ssl_certificate_key ssl/server.key; #私钥
server_name www.benet.com;
charset UTF-8;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
[root@C7--01 ~]# nginx -s reload
[root@C7--01 ~]# mkdir -p /usr/local/nginx/conf/ssl
[root@C7--01 ~]# cp server.crt server.key /usr/local/nginx/conf/ssl/
注意:ssl on; nginx1.15版本之前需要加,之后的不用加
[root@C7--01 ~]# nginx -s reload
nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in /usr/local/nginx/conf/nginx.conf:19
注意:如果保存文件时报错ssl那么进行下面的操作
[root@C7--01 ~]# nginx -s stop #先停止nginx服务
[root@C7--01 ~]# cd /usr/src/nginx-1.18.0/
-----------#####---------进行重新编译安装----配置模块ssl------#####
[root@C7--01 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module --with-pcre &&make install
[root@C7--01 ~]# nginx
进行访问测试:https://www.benet.com/
在公司内部有老用户想继续访问 :http://www.benet.com/ 的时候自动跳转 https://www.benet.com/
在配置文件中修改
[root@C7--01 ~]# vim /usr/local/nginx/conf/nginx.conf
........
...
server {
listen 443 ssl;
listen 80; #添加80端口
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
server_name www.benet.com;
rewrite ^/(.*) https://www.benet.com/ permanent; #添加永久跳转到https
charset UTF-8;
location / {
root html;
index index.html index.htm;
}
......
..
.
[root@C7--01 ~]# nginx -s reload
测试访问:http://www.benet.com
跳转成功