文章目录
引言:在搭建Nginx服务时,我们经常会遇到在服务安装后向其添加一些特殊功能的模块,使其支持一些功能,本文将介绍在实际生产中经常用到的一个模块SSL模块
一.SSL介绍
1.1SSL概述
SSL(Security Socket Layer)是一个安全协议,为基于TCP(Transmission Control Protocol)的应用层协议提供安全连接,SSL介于TCP/IP协议栈第四层和第七层之间。主要提供私密性、完整性和身份验证;我们常见的就是 SSL为HTTP(Hypertext Transfer Protocol)协议提供安全连接。SSL协议是一种在两个机器之间提供安全通道的协议,它具有保护数据传输以及识别通信机器的功能。
1.2SSL证书
SSL证书是数字证书的一种。因为配置在服务器上,也称为SSL服务器证书。SSL证书由受信任的数字证书颁发机构颁发,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道。由于SSL技术已建立到所有主要的浏览器和WEB服务器程序中,因此,仅需安装服务器证书就可以激活该功能了。即通过它可以激活SSL协议,实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且用户可以通过服务器证书验证他所访问的网站是否是真实可靠。
1.3HTTPS
HTTP over SSL 简写https,加密网页浏览是设计SSL的初衷,HTTP也是第一个使用SSL保障安全的应用层协议。
使用https://来标识HTTP over SSL,因此我常见的https的全称就是HTTP over SSL。后来HTTPS在RFC2818被标准化。HTTPS工作在443端口,而HTTP默认工作在80端口。
1.4SSL工作原理
- 浏览器发送一个https的请求给服务器;
- 服务器要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥;
- 服务器会把公钥传输给客户端;
- 客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
- 客户端把加密后的随机字符串传输给服务器;
- 服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
- 服务器把加密后的数据传输给客户端;
- 客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
二.创建SSL证书
2.1程序安装
检查是否安装openssl程序
rpm -q openssl openssl-devel
若没有安装,则
yum install -y openssl openssl-devel
2.2生成证书
1.创建密钥目录,此处建议放在nginx/conf目录下
mkdir -p /usr/local/nginx/conf/ssl_key
切换目录
cd /usr/local/nginx/conf/ssl_key
2.创建私钥
openssl genrsa -idea -out server.key 2048
3.生成证书
openssl req -days 3650 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
三.Nginx配置
nginx -V 查看nginx服务配置,查看是否安装ssl模块
3.1添加ssl模块
切换到服务安装目录
cd /opt/nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module #为ssl模块
make
注:因为之前编译了nginx,所以此时不用make install
停止服务 systemctl stop nginx.service
备份源服务文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
[root@xiayan nginx-1.20.2]# cp objs/nginx /usr/local/nginx/sbin/nginx
再次查看nginx服务配置
3.2添加SSL证书
vim /usr/local/nginx/conf/nginx.conf
server {
listen 443 ssl; #SSL 访问端口为443
server_name www.xiayan.com; #证书绑定域名
charset utf-8;
access_log /var/log/nginx/nginx.log; #日志文件
ssl_certificate ssl_key/server.crt; #证书文件名称
ssl_certificate_key ssl_key/server.key; #私钥文件名
#此处文件若不在conf目录下,则需填写文件绝对路径
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;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
mkdir -p /var/log/nginx/nginx.log #创建日志文件目录
3.3将http请求重定向到https
#在server全局设置中添加重定向转发规则
rewrite (.+) https://www.xiayan.com permanent;
检查配置文件是否有问题,并重启服务
向本地hosts文件,添加主机映射地址
四.测试
使用本机或者虚拟主机,访问www.xiayan.com,看是否跳转https://
博主使用的是w10虚拟主机,这里需要改下主机映射
打开浏览器访问
因为它不是由已配置为信任浏览器的证书颁发机构签名的证书,所以会报错。单机继续
五.总结
1.简单来说,SSL协议为http提供了一种加密的传输协议https
2.在实际生产中,我们常将http的请求重定向为https的。比如我们访问百度,CSDN等等网站时,地址都会转为https
3.因本文使用的是自创的ssl证书,是不受浏览器信任的。在实际生产环境中,可以向专门颁发ssl证书的机构进行申请,然后将下载的证书放到nginx配置文件中,添加配置即可