Https&Nginx配置
Https&Nginx配置
Https认识&实现步骤
HTTP(HyperText Transfer Protocol:超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议。 简单来说就是一种发布和接收 HTML 页面的方法,被用于在 Web 浏览器和网站服务器之间传递信息。
HTTP 默认工作在 TCP 协议 80 端口,用户访问网站 http:// 打头的都是标准 HTTP 服务。
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
Https的应用场景
1、当然考虑网站数据传递的安全性
2、基于前后端分离开发方式,比如微信小程序,APP开发,比如ios开发。等这些移动端应用开发,比如:ios苹果软件开发,如果说你的软件要上架到苹果应用市场,那么你的服务器接口必须是:https。或者微信小程序:在真实的项目发布的,如果不是https的接口你也是通不过。
Https监听的端口:443
Https实现步骤
1、你必须要有要有个域名
购买域名
万网地址:https://wanwang.aliyun.com/
购买成功以后。进入到阿里云的【控制面板】中,找到【域名】配置
域名备案
购买域名一定要备案才能进行下面的使用,否则你是不能去解析和映射的IP服务器,备案的地址:
https://beian.aliyun.com/?spm=a2c1d.8251892.top-nav.dicp.a56c5b762IUqTs
如果不明白:多问客服和提交工单.
2、并且要有服务器(提供ip)
新人有折扣机
3、并且服务器ip和你域名要进行解析
域名备案成功后,去到域名列表---点击域名操作的“解析按钮",然后添加解析记录
一般建议:
主域名:www
API的域名:api
记录值:为自己的IP地址
开放服务端口
如果是单机部署多应用的话,要开放如下几个端口即可:
- 80
- 443
如果是多机部署多应用的话,那么你必须开放对应服务器安装的服务的端口,比如你这个服务器安装了
redis、mysql、kafka ,zk
- 6379
- 3306
- 2181
提示:
开放端口的原则就是:如果你的服务(tomcat,nginx,mysql,kafka等)如果你要对外访问的话,你就必须在安全组中把这些服务器的端口进行配置开放即可。也就说:你一定在安全组中开放了,才可以对外访问。否则全部拒绝。
4、免费领取一个ssl安全证书。
1、在阿里云搜索SSL
2、申请免费证书,输入对应的域名
3、创建证书并填写证书申请(点击认证不成功,需要等一下 会看看在解析一个域名需要点时间才能生效)
4、对证书进行下载,选择需要部署的服务器类型,将证书下载后解压得到两个文件
5、把域名和ssl安全证书进行绑定授权
Nginx安装
nginx下载:http://nginx.org/en/download.html
01、创建nginx服务器目录
mkdir -p /www/kuangstudy/nignxcd /www/kuangstudy/nignx
02、下载安装
wget http://nginx.org/download/nginx-1.20.1.tar.gz
03、安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
04、解压nginx
tar -zxvf nginx-1.20.1.tar.gz
05、创建nginx的临时目录
mkdir -p /var/temp/nginx
06、进入安装包目录
cd nginx-1.20.1
07、编译安装
./configure \--prefix=/usr/local/nginx \--pid-path=/var/run/nginx.pid \--lock-path=/var/lock/nginx.lock \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--with-http_gzip_static_module \--http-client-body-temp-path=/var/temp/nginx/client \--http-proxy-temp-path=/var/temp/nginx/proxy \--http-fastcgi-temp-path=/var/temp/nginx/fastgi \--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \--http-scgi-temp-path=/var/temp/nginx/scgi \--with-http_stub_status_module \--with-http_ssl_module \--with-http_stub_status_module
安装以后的目录信息
nginx path prefix: "/usr/local/nginx" nginx binary file: "/usr/local/nginx/sbin/nginx" nginx modules path: "/usr/local/nginx/modules" nginx configuration prefix: "/usr/local/nginx/conf" nginx configuration file: "/usr/local/nginx/conf/nginx.conf" nginx pid file: "/var/run/nginx.pid" nginx error log file: "/var/log/nginx/error.log" nginx http access log file: "/var/log/nginx/access.log" nginx http client request body temporary files: "/var/temp/nginx/client" nginx http proxy temporary files: "/var/temp/nginx/proxy" nginx http fastcgi temporary files: "/var/temp/nginx/fastgi" nginx http uwsgi temporary files: "/var/temp/nginx/uwsgi" nginx http scgi temporary files: "/var/temp/nginx/scgi"
08、 make编译
make
09、 安装
make install
10、 进入sbin目录启动nginx
cd /usr/local/nginx/sbin
执行nginx启动
./nginx
#停止:./nginx -s stop
#重新加载:./nginx -s reload
注意事项
- 如果在云服务器安装,需要开启默认的nginx端口:80
- 如果在虚拟机安装,需要关闭防火墙
- 本地win或mac需要关闭防火墙
- nginx的安装目录是:/usr/local/nginx/sbin
配置nginx的环境变量
vim /etc/profile
在文件的尾部追加如下:
export NGINX_HOME=/usr/local/nginxexport PATH=$NGINX_HOME/sbin:$PATH
重启配置文件
source /etc/profile
6、授权成功以后,然后把证书安装到nginx中。
SSL安全证书的上传
在nginx的conf目录下新建一个cert目录,将证书下载后解压得到两个文件上传到cert目录下
Nginx和SSL配置
# 这个服务器是解析的域名的服务
server {
listen 80;
server_name 解析的域名; #需要将yourdomain.com替换成证书绑定的域名。
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
location / {
index index.html index.htm;
}
}
# 这个服务器是解析的域名的服务
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name 解析的域名; #需要将yourdomain.com替换成证书绑定的域名。
root html;
index index.html index.htm;
ssl_certificate cert/xxx.xxx.net.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key cert/xx.xxx.net.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录。
index index.html index.htm;
}
}
校验配置是否有误如下:
[root@main]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
然后重启nginx服务
nginx -s reload
然后访问服务器
https://绑定的域名/
如果配置应用程序的https服务
1、准备一个springboot项目
2、编写一个首页
@Controller
public class IndexController{
@GetMapping("/index")
public String index(){
return "index";
}
}
3、上传项目到云服务器上
nohup java -jar springboot-app-0.0.1-SNAPSHOT.jar --server.port=8080 >>1.txt &
nohup java -jar springboot-app-0.0.1-SNAPSHOT.jar --server.port=8081 >>2.txt &;
nohup java -jar springboot-app-0.0.1-SNAPSHOT.jar --server.port=8082 >>3.txt &;
4、配置nginx和tomcat的负载均衡配置
upstream tomcatservers {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name www.itbooking.net; #需要将yourdomain.com替换成证书绑定的域名。
rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
location / {
proxy_pass http://tomcatservers;
}
}
#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name www.itbooking.net; #需要将yourdomain.com替换成证书绑定的域名。
root html;
index index.html index.htm;
ssl_certificate cert/6179501_www.itbooking.net.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key cert/6179501_www.itbooking.net.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://tomcatservers;
}
}
#以下属性中,以ssl开头的属性表示与证书配置有关。
server {
listen 443 ssl;
#配置HTTPS的默认访问端口为443。
#如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
server_name api.itbooking.net; #需要将yourdomain.com替换成证书绑定的域名。
root html;
index index.html index.htm;
ssl_certificate cert/6184356_api.itbooking.net.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key cert/6184356_api.itbooking.net.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://tomcatservers;
}
}
5、完成测试和配置
提示:记住:一定要重启nginx服务器即可。
注意:
前提,域名要备案。必须手动安装nginx,如果之前使用宝塔安装过nginx的话,直接把阿里云服务器重置,换个系统,因为宝塔装nginx会写进去一些环境,卸载是卸载不干净的,切记!
HTTP向HTTPS演化的过程
HTTP的访问形式
HTTP它出现的比较早,现在已经有HTTP/2.0了,但是使用最普遍的还是HTTP/1.1。
当我们访问百度的时候,浏览器发送一个请求,通过网址进行访问,如“http://baidu.com”,前面部分是协议,后面就是我们的域名,他们是构成我们整个url地址中最重要的2部分。这个请求首先会到达我们的DNS,通过DNS解析成我们要访问的外网ip,浏览器拿到这个ip后会发起针对这个ip的请求,并且被访问的服务器会跟根据请求的端口号辨认出要提供什么的服务。如果url没有携带资源地址,默认会到达服务的根目录下的index.html,浏览器拿到这个页面后会进行渲染。
HTTP是无状态的
HTTP协议是基于TCP之上的协议,定义了我们客户端和服务端文件的传输方式。如在一个HTTP请求过程,会带有request和response,他们都有一定的规范。HTTP是一个无状态的,每次请求的处理是独立的,不依赖其他请求,我们通过服务端技术Cookie和Session技术实现它的状态,从而满足我们业务场景的请求。
HTTP的缺陷
HtTP很多的缺陷,如通过HTTP进行通信时候,请求信息request和响应信息response是可以被拦截掉的,如果是被黑客拿到这些信息,他们就可以进行很多操作,本质来说它的通信也是明文传输。
HTTP与HTTPS的区别
HTTS是TCP与HTTP之间加一个SSL。想要了解HTTP和HTTPS的区别,我们最重要的还是要去了解什么是SSL。我们现在使用的版本大多是TLS。
什么是SSL
SSL(Secure Sockets Layer 安全套接层),是为网络通信提供安全及数据完整性的一种安全协议。SSL在传输层与应用层之间对网络连接进行加密,防止数据传输过程中被篡改。我们现在使用的版本大多是TLS,他是SSL续任者。
对称加密与非对称加密
•对称加密:加密和解密都是使用到同一个密钥。它存在一个问题,假设客户端传输一个密文,并把密钥也携带过去,那么在传输过程中,只要传输的密钥被拿到,那么对于密文来说一样是透明的。
•非对称加密:有公钥和私钥的概念,通过公钥加密的数据可以用私钥解密,通过私钥加密的数据可以用公钥解密。每一个客户端都有自己的公钥,而私钥放在服务端上,这样它可以解决我们对称加密存在的问题。
协商密钥过程
非对称加密中,我们需要一个协商密钥过程,让每一个客户端拿到不同的公钥,并且保证在交互的情况下才知道用什么算法。
在传统的模式下存在一个问题,客户端向服务端发起一个请求公钥的请求,在返回公钥给客户端的过程中,公钥被中间人篡改了,后续的客户端每一次请求都会用这个假的公钥加密,而中间人可以拦截到这个请求,解密后并篡改数据,用真的公钥加密再发送给服务端。
因为协商的过程一定存在,那么怎么去解决问题呢?我们不可能把公钥直接传给客户端,而是将加密后的公钥传给客户端,这样公钥就不被其他人篡改,那么又要让客户端知道去如何解密被加密后的公钥,这是一个循环的问题。
为了解决上述的问题,引入了第三方机构。服务端发给客户端的公钥先使用第三方机构的公钥加密后发给第三方机构,第三方机构用它自己的私钥解密在一次加密,并返回给服务器,这就是数字证书。
由于客户端拿到的数据证书都可以使用第三方机构的公钥进行解密,那么如果中间人以正规的渠道获取属于它的数字证书,这个时候他可以替换服务端给客户端的数字证书,对于客户端来说还是不知道真假。
HTTPS的处理方式
我们协商里,客户端如何去识别数字证书的合法性?我们的数据证书必须要有一些信息,让客户端知道这个数字证书是对于服务端的,而不中间人。客户端可以去请求第三方辨别。
但是通常情况下客户端可以内置一些第三机构的数字证书和公钥(在设置里面),利用这些可以去验证发服务端过来的数据证书去识别数字证书的合法性。
如果验通过了,浏览器得到公钥了,这个公钥后会加密一个浏览器随机生成的数据作为对称加密,并传给服务端。服务器使用私钥解密,根据3个随机数生成会话密钥,返回给浏览器。
这就是我们客户端对服务端验证的过程,它用到了对称加密,非对称加密,随机数(生成会话密钥)。由于使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率。所以在交换密钥环节使用非对称加密方式,之后的建立通信交换报文阶段则使用对称加密方式。这就是HTTPS的原理。