当前位置 博文首页 > JustinQin:nginx--基于openssl自颁发SSL证书实现HTTPS协议安全

    JustinQin:nginx--基于openssl自颁发SSL证书实现HTTPS协议安全

    作者:[db:作者] 时间:2021-09-12 08:59

    学习背景

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

    • 但实际应用中,有很多网站基于安全方面上的考虑,都有自己的SSL证书,基于HTTPS协议进行访问,例如:
      在这里插入图片描述

    • 这篇文章主要是介绍基于openssl生成自颁发证书实现HTTPS协议访问,进入正文之前,先来复习一下,HTTPHTTPS的区别吧

    • HTTP全称Hypertext Transfer Proctocol超文本传输协议,是计算机世界里专门在两点之间传输数据的约定和规范,主要分为HypertextTransferProctocol三部分

      • 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,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。

    吧啦吧啦,开头也将了HTTPSHTTPS的区别,主要区别也体现在这个S(Secure)-安全上,而安全就是通过这个SSL证书来保证的~

    • 自颁发SSL证书
      证书签名请求文件.csr和在私钥文件key,给自己自颁发免费的crtSSL证书
      当然如果你比较有钱的话,可以拿自己生成的这个证书签名请求文件.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默认监听端口是80https默认监听端口是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访问需要放开80443端口

    • 先查看防火墙状态,再放开端口,最后重启防火墙端口生效。

      • 查看状态
        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端口!
      阿里云 -> 安全组规则,果然!!看到未配置8443443端口,导致访问不通,添加端口即可,腾讯云的话,也类似的,安全组就是一个虚拟的防火墙!!!
      在这里插入图片描述
    • 免费SSL证书
      腾讯也有免费的SSL证书,不过只有1年,有需要可以申请来学习学习~
      腾讯云 -> 我的证书:https://console.cloud.tencent.com/ssl
      在这里插入图片描述
    cs