Nginx系列之支持SSL认证

在了解Nginx支持SSL认证前,先来看看SSL相关的基础概念。SSL是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全。TLS(传输层安全)是更为安全的升级版SSL。由于SSL这一术语更为常用,因此仍然将安全证书称作SSL。当您从DigiCert购买SSL时,您真正购买的是最新的TLS证书,证书有 ECC、RSA 或 DSA 三种加密方式可以选择。如果某个网站受SSL证书保护,其相应的URL中会显示HTTPS(超文本传输安全协议)。单击浏览器地址栏的挂锁图标,可查看证书详细信息,包括颁发机构和网站所有者的公司名称等。下图是访问google和baidu,查看网站签发的证书的相关信息。

 在进行加密时分为对称加密和非对称加密,对称加密指加密和解密都使用同一个密钥,非对称加密指加密和解密使用不同的密钥,对于非对称加密,密钥分为公钥和私钥。一个用于加密密钥,一个用于解密密钥。公钥都是公开的,如何保证公钥不被篡改呢?这里就牵涉到证书签发机构,证书签发机构用自己的私钥对申请者的公钥进行加密,生成数字证书。当其他人想知道这个公钥是否被篡改,那么就可以用CA机构的公钥对数字证书进行解密,如果能解密成功,说明这个公钥是得到证书机构认证的,用这个公钥再去解密服务端发送过来的信息是可信的。关于证书、数字签名、加解密更详细的描述可查看这里

证书分为三类,域名验证证书,组织验证证书,扩展验证证书,签发机构颁发证书时,会对合法性进行验证。域名证书验证最宽松,验证该域名确实是申请者的即可,扩展验证证书最严格。下面是三种不同的证书举例。

当访问某个网站时,查看操作系统,会看到证书链信息,证书链中分三层证书。如下图所示,一级根证书是DigCert Global Root CA,根证书变更频率小,例如操作系统window,Android等都会申请根证书,大部分浏览器一般会使用操作系统的证书作为根证书,但比如Firefox等可能会用自己签发的根证书。接下来是二级证书,二级证书后面是具体的域名证书。下面右图是抓包信息,当访问某个网站时都会发送二级证书和域名证书信息,因为一级证书已经内置在了浏览器中。

 上面介绍了部署成https访问,需要有一张被信任的CA( Certificate Authority )也就是证书授权中心颁发的SSL安全证书,并且将它部署到你的网站服务器上。理论上,我们自己也可以签发SSL安全证书,但是我们自己签发的安全证书不会被主流的浏览器信任,所以我们需要被信任的证书授权中心( CA )签发的安全证书,如果是本地实验或者内部服务可以采用自签证书。一般的SSL安全证书签发服务都比较贵,比如Godaddy、GlobalSign等机构签发的证书。为了加快推广 HTTPS的普及,一个公益组织叫ISRG( Internet Security Research Group )从2015年开始推出了 Let’s Encrypt免费证书。所以可以利用Let’s Encrypt提供的免费证书部署HTTPS服务。Let’s Encrypt项目发布了一个官方的客户端Certbot ,利用它可以完全自动化的获取、部署和更新安全证书。可以通过yum或者apt在linux服务器上安装certbot(yum install python2-certbot-nginx),安装完成后即可通过命令生成证书。在对某个域名颁发证书时,CA会验证域名是否真正属于申请证书者, 如果想通过Certbort生成网站的证书首先需要申请网站的域名,具体的证书生成过程可以查看这里。下面的实验demo为了简单,则采用自签证书的方式。

自签证书主要通过opessl命令行工具来完成。那么什么是openssl呢?OpenSSL是一个健壮的、商业级的、功能齐全的用于传输层安全(TLS)协议的开源工具包,以前称为安全套接字层(SSL)协议。该协议的实现基于一个全强度通用加密库,该库也可以独立使用。openssl是OpenSSL提供的命令行工具,用于加密任务、测试和分析的命令行工具。它可以用来创建关键参数,创建X.509证书、csr和crl,消息摘要的计算,加密和解密,SSL/TLS客户端和服务器测试,处理S/MIME签名或加密邮件等。如果要通过openssl命令行工具创建自签证书,需要执行下面五个步骤

第一步:创建根证书(签发机构)的私匙,加密强度选择2048,常规一般是1024
openssl genrsa -out ca.key 2048

第二步:利用私钥创建根证书
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj \
"/C=CN/ST=Jiangsu/L=Yangzhou/O=Your Company Name/OU=Your Root CA"
这里/C表示国家(Country),只能是国家字母缩写,如CN、US等;/ST表示州或者省(State/Provice);/L表示城市或者地区(Locality);/O表示组织名(Organization Name);/OU其他显示内容,一般会显示在颁发者这栏

第三步:创建SSL证书私匙,这里加密强度仍然选择2048
openssl genrsa -out server.key 2048位

第四步:利用刚才的私匙创建SSL证书请求文件
openssl req -new -key server.key -out server.csr -subj \
"/C=CN/ST=Jiangsu/L=Yangzhou/O=Your Company Name/OU=wangye.org/CN=wangye.org"
这里需要注意的是,/O字段内容必须与刚才的CA根证书相同;/CN字段为公用名称(Common Name),必须为网站的域名(不带www);/OU字段最好也与为网站域名,当然选择其他名字也没关系

第五步:用CA根证书签署SSL自建证书
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

需要注意:由于是自签名证书,所以客户端需要安装根证书,将刚才第2步创建的根证书ca.crt下载到客户端,然后双击导入,否则会提示不受信任的证书发布商问题。如果是内部服务配置https,那么使用自签发证书也是ok的,如果对外的网站,建议购买专业的证书签发机构签发的证书,或者使用Let’s Encrypt项目提供的免费证书(该证书3个月就会过期,需要写脚本完成自动续签)。如果对外的网站仍然想使用自签发证书,那么当用户访问该网站时,需要强制用户下载自签的根证书后,才能正常访问网站。上面介绍了SSL相关的理论知识,接下来通过实验方式看看Nginx如何支持SSL。

 下面是通过openssl命令生成根证书ca.crt、签发a.crt和b.crt证书以及生成私钥。

创建CA私钥
openssl genrsa -out ca.key 2048
制作CA根证书
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

创建私钥
下面的证书用户后端服务
openssl genrsa -out a.pem 1024
openssl rsa -in a.pem -out a.key
生成签发请求
openssl req -new -key a.pem -out a.csr
使用CA证书进行签发
openssl x509 -req -sha256 -in a.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out a.crt
验证签发的证书是否正确
openssl verify -CAfile ca.crt a.crt

创建私钥(下面的证书用于客户端)
openssl genrsa -out b.pem 1024
openssl rsa -in b.pem -out b.key
生成签发请求
openssl req -new -key b.pem -out b.csr
使用CA证书进行签发
openssl x509 -req -sha256 -in b.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out b.crt
验证签发的证书是否正确
openssl verify -CAfile ca.crt b.crt

通过上面的命令生成crt证书时,需要输入CN/LT/L等信息,按提示信息输入即可,证书生成成功后,执行最后一条验证证书的命令,返回ok则说明证书生成正确。

 除了手动方式生成证书,还可以利用网上现有的脚本更轻便的生成证书。here

生成证书后,启动两个nginx服务,一个nginx作为反向代理服务,另一个nginx模拟后端服务。实验例子关系如下图所示:

 下面是作为反向代理的nginx的配置,这里配置了proxy_ssl_trusted_certificate=自签发的根证书,另外,配置了nginx自身认证需要的crt和key,即b.crt和b.key,这里使用的证书由根证书ca.crt签发.反向代理路由到https://taoli.test.pub.

下面是模拟后端服务的Nginx服务的配置,server_name是taoli.test.pub,这里配置了自身认证需要的key和crt,即a.crt和a.key,这个证书也是由根证书ca.crt签发的。location里面打印的是Nginx提供的ssl相关的一些变量值。

 配置完后,使用curl命令“curl localhost:8099/test”访问nginx(作为反向代理的nginx),实验结果如下,说明认证过程成功。

需要注意一点,http-ssl-module默认不会编译进nginx,需要通过--with编译进去。为了成功编译进http-ssl-module,需要安装openssl,编译的时候带上openssl的路径。./configure命令执行成功后,如果在make过程中发生如下错误,下载解压openssl源代码,重新执行.configure命令,openssl路径指定为解压后的源代码路径,而不是本机安装的openssl路径。

curl -O https://www.openssl.org/source/openssl-3.0.4.tar.gz
tar -xf openssl-3.0.4.tar.gz
./configure --prefix=/Users/taoli/nginx2 --with-http_ssl_module --with-openssl=/Users/taoli/Downloads/openssl-3.0.4

以上就是Nginx支持SSL的使用介绍。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taoli-qiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值