nginx--基于openssl生成自颁发证书实现HTTPS协议访问
Posted JustinQin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx--基于openssl生成自颁发证书实现HTTPS协议访问相关的知识,希望对你有一定的参考价值。
学习背景
- 大家在nginx安装(nginx安装教程)后,启动nginx,访问静态页面时,一般都是直接通过
HTTP
协议进行访问页面,如下图所示:
但实际很多场景基于安全方面的考虑,需要基于HTTPS
协议进行访问,这篇文章主要是介绍基于openssl生成自颁发证书实现HTTPS协议访问
,进入正文之前,先来复习一下,HTTP
和HTTPS
的区别吧 - 1、
HTTP
全称Hypertext Transfer Proctocol
超文本传输协议,是计算机世界里专门在两点之间传输数据的约定和规范,主要分为Hypertext
、Transfer
、Proctocol
三部分Hypertext
:超文本,两点之间传送的数据,不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转Transfe
r:传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方Proctocol
:协议指的就是网络中传递、管理信息的一些规范,如同人与人之间相互交流通过语言、肢体动作等规范完成,计算机也需要遵循相应的规则,这些规则称为协议,如TCP/IP
网络模型中,网络层基于IP协议、传输层基于TCP/UDP
协议、应用层基于HTTP/FTP/Telnet
协议等
*HTTP
是不安全的协议,未经过任何加密,传输过程容易被攻击者监听、数据容易被窃取、发送方和接收方容易被伪造HTTP
默认端口HTTP是80
- 2、
HTTPS
并非新协议,相比于HTTP
只是多了个S,表示Secure
安全- 安全的原理是基于
HTTP
+TCL/SSL
协议组合实现的,所以HTTP和HTTPS的主要区别本质在于TCL/SSL安全协议
上的区别 HTTPS
是一种安全的协议,通过密钥交换算法 - 签名算法 - 对称加密算法 - 摘要算法确保安全HTTPS
默认443
端口
- 安全的原理是基于
进入正文~
一、证书生成
1.1 生成私钥
- 登录Linux服务器,本文使用示例用户
nginx
,检查openssl
是否安装
openssl version
- 创建自颁发证书存放路径
mkdir -p /home/nginx/certificate/
cd /home/nginx/certificate/
- 生成基于openssl自颁发的
www.justin.com.key
私钥文件
openssl genrsa -des3 -out www.justin.com.key 2048
按提示两次输入密码(按实际需要设置密码,自己记得就好),示例123456
:
–参数说明:
genrsa
表示生成RSA私钥
-des3
表示des3算法
-out www.justin.com.key
表示生成的私钥文件名,这里我直接用域名
作为文件名了
2048
表示私钥长度是2048位,常用1024,2048
- 建议去掉私钥
www.justin.com.key
中的密码(非必须
)
openssl rsa -in www.justin.com.key -out www.justin.com.key
输入前面设置的密码123456
,若提示writing RSA key 说明去掉server.key
私钥的密码成功!
1.2 生成CSR
CSR(Certificate Sign Request)
表示证书签名请求
,CSR
在部署https
访问时,并没有用到,但是如果你有钱,想找权威的机构给你颁发安全一点的证书,那需要你生成这个CSR
去给他们,他们会颁发给你颁发权威的crt
证书。- 生成
CSR
命令格式说明
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=organization/OU=szorganization/CN=www.xxx.com"
参数说明:
req
表示生成证书签名请求
-new
表示新生成
-key
用到的私钥文件
-out
生成的csr文件
-subj
表示生成CSR的相关信息,其中:
- C-表示两位字母国家代码
- ST-表示省份或州
- L-表示城市或区域
- O-表示组织名称
- OU-表示组织单位名称
- CN-表示用户姓名或域名
- 生成
CSR
根据参数说明
修改对应的生成CSR
的命令格式内容,执行命令,得到www.justin.com.csr
证书签名请求文件~
openssl req -new -key www.justin.com.key -out www.justin.com.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=Justin/OU=Justin/CN=www.justin.com"
1.3 生成自签名SSL证书
- 生成SSL证书文件
www.justin.com.crt
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 配置nginx
- 修改nginx的配置
/etc/nginx/conf.d/default.conf
HTTP
默认监听端口是80
,HTTPS
默认监听端口是443
- 标记部分内容如下:
需要修改配置中对应的证书路径
为自己的路径,再拷贝到nginx的default.conf
配置中
#http默认监听80端口
listen 80;
#https默认监听443端口,nginx 1.1版本后写法
listen 443 ssl;
#填写绑定证书的域名,没有有效域名则写localhost
server_name www.justin.com;
#指定证书的位置,绝对路径
ssl_certificate /home/nginx/certificate/www.justin.com.crt;
#指定密钥的位置,绝对路径
ssl_certificate_key /home/nginx/certificate/www.justin.com.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;
#错误码497表示开启https时如果发http请求过来错误码为497,错误码301为将HTTP请求重定向,这里重定向为HTTPS
error_page 497 301 https://$host$request_uri;
2.2 重启nginx
- 重启nginx前先检查下nginx配置是否正确,命令为
nginx -t
- 重启nginx(nginx运行中,不重启nginx的情况下,重新加载最新nginx最新配置文件)
nginx -s reload
- 如果nginx未运行,则直接启动nginx,命令为
nginx
- 其他nginx常用命令
停止nginx命令nginx -s stop
重开nginx日志命令nginx -s reopen
查看nginx进程ps -ef|grep nginx
三、防火墙检查
-
正常来说,防火墙也可以不开启,但是为了安全起见,Linux服务器一般都需要开启防火墙,如果需要监听端口,只需要放开相关端口即可。
配置https
访问需要放开80
和443
端口
先查看防火墙状态,再放开端口,最后重启防火墙端口生效。 -
防火墙常用命令
- 查看状态
systemctl status firewalld
- 启动
systemctl start firewalld
- 重启
systemctl restart firewalld
- 停止
systemctl stop firewalld
- 显示已放开端口
firewall-cmd --zone=public --list-ports
- 放开指定
80
、443
端口
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
- 查看状态
-
放开其他端口
要么不开启防火墙,如果开启了,用到的端口都要放开,比如3306
、8080
等常用端口
firewall-cmd --permanent --zone=public --add-port=3306/tcp
firewall-cmd --permanent --zone=public --add-port=8080/tcp
四、HTTPS访问
-
浏览器访问地址:https://ip:443 或https://ip不需要指定端口号
* 如果default.conf中配置的域名有效,并且已备案的,也可以直接使用域名访问,比如https://www.justin.com
-
点击红色三角警告,查看证书。
-
本地安装证书,使得浏览器信任
附录
- 安全组规则配置
nginx配置https
访问完成后,检查了其他地方都没问题,但https
访问还是不成功,最后想到自己的服务器是阿里云的,应该是阿里云安全组规则
没配置https
的默认443
端口!
阿里云 -> 安全组规则
,果然!!看到未配置8443
和443
端口,导致访问不通,添加端口即可,腾讯云的话,也类似的,安全组就是一个虚拟的防火墙!!!
- 免费SSL证书
腾讯也有免费的SSL证书,不过只有1年,有需要可以申请来学习学习~
腾讯云 -> 我的证书:https://console.cloud.tencent.com/ssl
以上是关于nginx--基于openssl生成自颁发证书实现HTTPS协议访问的主要内容,如果未能解决你的问题,请参考以下文章