nginx--基于openssl生成自颁发证书实现HTTPS协议访问

Posted JustinQin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx--基于openssl生成自颁发证书实现HTTPS协议访问相关的知识,希望对你有一定的参考价值。

学习背景

  • 大家在nginx安装(nginx安装教程)后,启动nginx,访问静态页面时,一般都是直接通过HTTP协议进行访问页面,如下图所示:

    但实际很多场景基于安全方面的考虑,需要基于HTTPS协议进行访问,这篇文章主要是介绍基于openssl生成自颁发证书实现HTTPS协议访问,进入正文之前,先来复习一下,HTTPHTTPS的区别吧
  • 1、HTTP全称Hypertext Transfer Proctocol超文本传输协议,是计算机世界里专门在两点之间传输数据的约定和规范,主要分为HypertextTransferProctocol三部分
    • Hypertext:超文本,两点之间传送的数据,不单单只是本文,它还可以传输图片、音频、视频,甚至点击文字或图片能够进行超链接的跳转
    • Transfer:传输就是数据需要经过一系列的物理介质从一个端系统传送到另外一个端系统的过程。通常我们把传输数据包的一方称为请求方,把接到二进制数据包的一方称为应答方
    • 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默认监听端口是80HTTPS默认监听端口是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访问需要放开80443端口
    先查看防火墙状态,再放开端口,最后重启防火墙端口生效。

  • 防火墙常用命令

    • 查看状态systemctl status firewalld
    • 启动systemctl start firewalld
    • 重启systemctl restart firewalld
    • 停止 systemctl stop firewalld
    • 显示已放开端口firewall-cmd --zone=public --list-ports
    • 放开指定80443端口
      firewall-cmd --permanent --zone=public --add-port=80/tcp
      firewall-cmd --permanent --zone=public --add-port=443/tcp
  • 放开其他端口
    要么不开启防火墙,如果开启了,用到的端口都要放开,比如33068080等常用端口
    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端口!
    阿里云 -> 安全组规则,果然!!看到未配置8443443端口,导致访问不通,添加端口即可,腾讯云的话,也类似的,安全组就是一个虚拟的防火墙!!!
  • 免费SSL证书
    腾讯也有免费的SSL证书,不过只有1年,有需要可以申请来学习学习~
    腾讯云 -> 我的证书:https://console.cloud.tencent.com/ssl

以上是关于nginx--基于openssl生成自颁发证书实现HTTPS协议访问的主要内容,如果未能解决你的问题,请参考以下文章

keytool和openssl的区别

用openssl生成的ssl证书和付费的有啥区别

我实践:自建CA及证书颁发(openssl)

自签名证书颁发及验证

nginx中的CA证书的实现详解

openssl生成自签名证书