草庐IT

Nginx系列之支持SSL认证

taoli-qiao 2023-06-05 原文

在了解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的使用介绍。

有关Nginx系列之支持SSL认证的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby-on-rails - 使用一系列等级计算字母等级 - 2

    这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. 阿里云RDS——产品系列概述 - 2

    基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于

  6. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  7. ruby - token 认证 - 2

    简单代码require'net/http'url=URI.parse('getjson/otherdatahere[link]')req=Net::HTTP::Get.new(url.to_s)res=Net::HTTP.start(url.host,url.port){|http|http.request(req)}putsres.body只是想知道如何在phpcURL中放置身份验证token,我是这样做的    curl_setopt($ch,CURLOPT_HTTPHEADER,array('Authorization:Bearerxxx'));//Bearertokenfora

  8. Ruby SSL 错误 - sslv3 警报意外消息 - 2

    我正在尝试在ruby​​脚本中连接到服务器https://www.xpiron.com/schedule。但是,当我尝试连接时:require'open-uri'doc=open('https://www.xpiron.com/schedule')我收到以下错误消息:OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv2/v3readserverhelloA:sslv3alertunexpectedmessagefrom/usr/local/lib/ruby/1.9.1/net/http.rb:678:in`conn

  9. ruby - 如何使用 readline 支持重新安装 ruby​​? - 2

    我已经按照https://github.com/wayneeseguin/rvm#installation上的说明通过RVM安装了Ruby.有关信息,我有所有文件(readline-5.2.tar.gz、readline-6.2.tar.gz、ruby-1.9.3-p327.tar.bz2、rubygems-1.8.24.tgz、wayneeseguin-rvm-stable.tgz和yaml-0.1.4.tar.gz)在~/.rvm/archives目录中,我不想在任何目录中重新下载它们方式。当我这样做时:sudo/usr/bin/apt-getinstallbuild-essent

  10. ruby - 如何在非 SSL 或 http 网站上使用 Stripe? - 2

    我正在使用Rails3.2.6和Stipe进行支付。是否有可能在不购买ssl证书的情况下进行付款。我可以使用Stripe页面作为我的支付页面吗? 最佳答案 您可以使用stripe.js在技术上跳过SSL但我强烈建议您设置SSL。它所做的是将信用卡信息直接传递给stripe,然后stripe会给你一个token,用于实际进行收费。这样做意味着信用卡信息永远不会接触您的服务器,您不必担心PCI合规性。但是,您仍应设置SSL以防止中间人攻击。您可以在https://stripe.com/docs/tutorials/forms找到有关如何

随机推荐