nginx--基于openssl自颁发SSL证书实现HTTPS协议安全访问网站
学习背景
-
大家在nginx安装(nginx安装教程)后,启动nginx,访问静态页面时,一般都是直接通过
HTTP
协议进行访问页面,如下图所示:
-
但实际应用中,有很多网站基于安全方面上的考虑,都有自己的
SSL证书
,基于HTTPS
协议进行访问,例如:
-
这篇文章主要是介绍
基于openssl生成自颁发证书实现HTTPS协议访问
,进入正文之前,先来复习一下,HTTP
和HTTPS
的区别吧 -
HTTP
全称Hypertext Transfer Proctocol
超文本传输协议,是计算机世界里专门在两点之间传输数据的约定和规范,主要分为Hypertext
、Transfer
、Proctocol
三部分Hypertext
:超文本,两点之间传送的数据,不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转Transfer
:传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方Proctocol
:协议指的就是网络中传递、管理信息的一些规范,如同人与人之间相互交流通过语言、肢体动作等规范完成,计算机也需要遵循相应的规则,这些规则称为协议,如TCP/IP
网络模型中,网络层基于IP协议、传输层基于TCP/UDP
协议、应用层基于HTTP/FTP/Telnet
协议等
*HTTP
是不安全的协议,未经过任何加密,传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造HTTP
默认端口HTTP是80
-
HTTPS
并非新协议,相比于HTTP
只是多了个S,表示Secure
安全- 安全的原理是基于
HTTP
+TCL/SSL
协议组合实现的,所以HTTP和HTTPS的主要区别本质在于TCL/SSL安全协议
上的区别 HTTPS
是一种安全的协议,通过密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法确保安全HTTPS
默认443
端口
- 安全的原理是基于
进入正文~
一、SSL证书生成
1.1 检查环境
- 登录Linux服务器,本文使用示例用户
nginx
,检查openssl
是否安装
openssl version
1.2 规划目录
- 创建自颁发证书存放路径
mkdir -p /home/nginx/certificate/
cd /home/nginx/certificate/
1.3 生成私钥
- 基于
openssl
生成私钥文件
这里我以域名www.justin.com
作为文件名,后缀.key
,实际可以按需要进行命名~
openssl genrsa -des3 -out www.justin.com.key 2048
–参数说明:
genrsa
表示生成RSA私钥
-des3
表示des3算法
-out www.justin.com.key
表示生成的私钥文件名,这里我直接用域名
作为文件名了
2048
表示私钥长度是2048位,常用1024,2048
回车上述命令,按提示两次输入密码(按实际需要设置密码,自己记得就好),我这里在设置为123456
:
得到私钥文件www.justin.com.key
,私钥是绝对保密的,只有自己知道,不要透漏给任何机构和个人,CA
也不会知道你的私钥~
- 去掉私钥
www.justin.com.key
中的密码(可选
)
生产或实际用途不要去掉密码,保证每次读取私钥文件
时都需要输入密码进行确认
这里为了方便测试,将证书中的密码去除,~
openssl rsa -in www.justin.com.key -out www.justin.com.key
上述命令回车,按提示输入前面设置的密码123456
,若提示writing RSA key 说明去掉server.key
私钥的密码成功!
1.4 生成CSR
-
什么是CSR?
CSR(Certificate Sign Request)
表示证书签名请求
,通过私钥文件
+证书签名请求文件
可以颁发我们最终要的SSL安全证书
。 -
生成
CSR
openssl req -new -key www.justin.com.key -out www.justin.com.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=organization/OU=szorganization/CN=www.justin.com"
参数说明:
req
表示生成证书签名请求
-new
表示新生成
-key
用到的私钥文件
-out
生成的csr文件
-subj
表示生成CSR的相关信息,其中:
- C-表示两位字母国家代码
- ST-表示省份或州
- L-表示城市或区域
- O-表示组织名称
- OU-表示组织单位名称
- CN-表示用户姓名或域名
回车上述指令,得到www.justin.com.csr
证书签名请求文件~
1.5 生成自签名SSL证书
- 什么是SSL证书?
SSL证书
百科
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
SSL 证书 [1] 就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
吧啦吧啦,开头也将了HTTPS
和HTTPS
的区别,主要区别也体现在这个S(Secure)
-安全上,而安全就是通过这个SSL证书
来保证的~
-
自颁发SSL证书
证书签名请求文件.csr
和在私钥文件key
,给自己自颁发免费的crt
SSL证书
当然如果你比较有钱的话,可以拿自己生成的这个证书签名请求文件.csr
去找比较权威的CA(Certificate Authority)
机构给你颁发SSL证书,他们会颁发给你权威的SSL证书.crt
,原理跟我们接下来自己颁发的SSL证书.crt
原理是一样的,只不过人家比较权威,浏览器信任它们的证书,不信任咱们的~
– 注意:
这里再次提下私钥文件.key
用于生产环境的话,绝对要保密的,只有自己知道,存放在自己的服务器中,任何所谓的"CA"
机构和和个人说要私钥才能提供的SSL证书.crt
的都是骗子~ -
基于openssl颁发证书命令
openssl x509 -req -in www.justin.com.csr -signkey www.justin.com.key -out www.justin.com.crt -days 3650
参数说明:
x509
表示证书为x509格式
-days
表示证书有效期,单位(天数)
-in www.justin.com.csr
指定证书签名请求文件www.justin.com.csr
-signkey www.justin.com.key
指定签名私钥文件www.justin.com.key
- 查看证书内容
openssl x509 -in www.justin.com.crt -noout -text
二、nginx安装SSL证书
2.1 配置https
- 修改nginx配置
http
默认监听端口是80
,https
默认监听端口是443
vi /etc/nginx/conf.d/default.conf
- 重定向http
将所有http请求,重定向为https请求,如果需要保留http请求,则不需要配置这里的重定向http,将listen 80
放回原server
模块中,并且将https
配置中的301
状态码去掉~
server {
#http默认监听端口
listen 80;
#将http请求重定向为https 并返回301状态码
return 301 https://$host$request_uri;
}
- 配置https
注意需要修改配置中对应的证书路径
为自己的路径,再拷贝内容到nginx的/etc/nginx/conf.d/default.conf
配置的server
模块中
#########基于openssl的https协议访问配置#########
#nginx 1.1版本后写法
listen 443 ssl;
#填写绑定证书的域名,没有有效域名则写localhost
server_name localhost;
#指定证书的位置,绝对路径
ssl_certificate /home/nginx/certificate/1_justinqin.cn_bundle.crt;
#指定密钥的位置,绝对路径
ssl_certificate_key /home/nginx/certificate/2_justinqin.cn.key;
ssl_session_timeout 5m;
#按照此协议进行配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:DHE;
ssl_prefer_server_ciphers on;
#根据状态码重定向为https请求
#开启https后如果收到http请求状态码为497,301为http重定向为https的状态码
error_page 497 301 https://$host$request_uri;
#########基于openssl的https协议访问配置#########
2.2 重启nginx
nginx -t
测试nginx配置是否正确nginx -s reload
加载最新的nginx配置(不会重启nginx,需要确保处于nginx运行状态)- 如果nginx未运行,则直接启动nginx,命令为
nginx
或/usr/sbin/nginx - 其他nginx常用命令
nginx -s stop
停止nginx
nginx -s reopen
重开nginx日志
ps -ef|grep nginx
查看nginx进程
三、防火墙检查
-
正常来说,防火墙也可以不开启,但是为了安全起见,Linux服务器一般都需要开启防火墙,如果需要监听端口,只需要放开相关端口即可。
nginx配置https
访问需要放开80
和443
端口 -
先查看防火墙状态,再放开端口,最后重启防火墙端口生效。
- 查看状态
systemctl status firewalld
- 放开端口
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
- 更新防火墙规则(无需重启)
systemctl reload firewalld
- 查看状态
-
防火墙其他常用命令
systemctl start firewalld
启动防火墙systemctl restart firewalld
重启防火墙systemctl stop firewalld
停止防火墙firewall-cmd --zone=public --list-ports
显示防火墙已放开端口
四、HTTPS访问
-
浏览器访问地址:https://ip:443 或https://ip不需要指定端口号
* 如果/etc/nginx/conf.d/default.conf
中配置的server_name
域名有效,并且已备案的,也可以直接使用域名访问,比如https://www.justin.com
-
点击红色三角警告,查看证书。
-
本地安装证书,使得浏览器信任
附录
- 安全组规则配置
nginx配置https
访问完成后,检查了其他地方都没问题,但https
访问还是不成功,最后想到自己的服务器是阿里云的,应该是阿里云安全组规则
没配置https
的默认443
端口!
阿里云 -> 安全组规则
,果然!!看到未配置8443
和443
端口,导致访问不通,添加端口即可,腾讯云的话,也类似的,安全组就是一个虚拟的防火墙!!!
- 免费SSL证书
腾讯也有免费的SSL证书,不过只有1年,有需要可以申请来学习学习~
腾讯云 -> 我的证书:https://console.cloud.tencent.com/ssl
- 点赞
- 收藏
- 关注作者
评论(0)