nginx配置多个TLS证书,以及TLS SNI简介

背景

原来申请的正式域名备案通过,TLS证书也申请了。之前使用的临时域名和证书作为测试环境使用。于是要在单个ECS主机上配置nginx多个证书和多个域名。

实践

nginx部署多个TLS证书很简单,在不同的virtual host分别配置证书就搞定了。比如我有a.comb.com两个域名,在nginx.conf分别配置2个server就可以了

123456789101112131415161718192021
server {    listen 443 ssl http2;    server_tokens off;    server_name a.com; 

    ssl_certificate cert/a.com.pem;     #将domain name.pem替换成您证书的文件名。    ssl_certificate_key cert/a.com.key; #将domain name.key替换成您证书的密钥文件名。

    # more config}

server {    listen 443 ssl http2;    server_tokens off;    server_name b.com; 

    ssl_certificate cert/b.com.pem;     #将domain name.pem替换成您证书的文件名。    ssl_certificate_key cert/b.com.key; #将domain name.key替换成您证书的密钥文件名。

    # more config}

ps. 推荐一个nginx conf配置在线美化工具:Nginx Beautifier

问题再深入

在一个主机(IP)上配置多个域名,使用虚拟主机(virtual host)就可以解决了。但是申请TLS证书的时候,是绑定了具体的域名和IP地址。建立TLS连接的时候,服务器要下发哪个证书呢?
等等,证书明明和域名绑定,都知道了域名,为什么会有选择选择证书的问题?
那是因为,域名是http的概念。client和server先建立了tcp连接,再经过TLS握手,才能实现https通信。在最初,这个过程,是没有域名的概念的!
为了解决当个主机部署多个TLS证书的问题,带来了TLS的SNI扩展。

(图片来源:https://blogs.akamai.com/2017/03/reaching-toward-universal-tls-sni.html

SNI介绍

摘自wiki,”服务器名称指示”

服务器名称指示(英语:Server Name Indication,缩写:SNI)是TLS的一个扩展协议,在该协议下,在握手过程开始时客户端告诉它正在连接的服务器要连接的主机名称。这允许服务器在相同的IP地址和TCP端口号上呈现多个证书,并且因此允许在相同的IP地址上提供多个安全(HTTPS)网站(或其他任何基于TLS的服务),而不需要所有这些站点使用相同的证书。

TLS SNI在client hello握手阶段,增加了一个扩展字段,表明想要和哪个域名建立TLS连接(注意是明文)。服务器根据SNI,选择证书并且下发。以下是TLS v1.2握手抓包

这个扩展字段,OpenSSL 0.9.8 版本开始支持。现代的浏览器和服务器都支持了。

TLS v1.2的SNI是明文传输,这就可以被第三方直接截获,暴露了域名,甚至阻止建立https连接(等等,有人在敲门,我先收个快递)。。。这就是censorship问题了。

TLS ESNI扩展

TLS v1.2的SNI是明文传输引发安全隐患,那么加密不就可以了吗?不行,因为TLS连接还没有建立。这就是先有鸡还是先有蛋的问题。
google、amazon、microsoft等大厂想出一个办法,既然SNI是明文,我就传输无公害的host,比如他们自家的域名,等tls连接建立之后,再把真实域名传输过去。
这就是TLS ESNI扩展,使用的技术叫域前置(英语:Domain fronting)。

如果要censorship,那么就要一刀切都关闭!
怎么样,是不是很狂拽酷炫吊炸天!不过,理想很丰满,现实很骨感。截至目前,Google、Amazon都由于不可描述的原因,关闭了此项服务。

在此只聊聊技术上的问题。
即使有了TLS v1.3 ESNI,在建立连接后返回真实域名,但是传统的DNS查询是明文的!解决方式就是加密DNS,DNS over TLS (DoT) and DNS over HTTPS (DoH)。具体以后再研究。

小结

  • 单个主机上nginx多个证书的配置,在不同的server上配置ssl_certificatessl_certificate_key即可。
  • 背后的原理涉及到TLS的SNI扩展。
  • TLS v1.2的SNI扩展字段是明文的,并且由于在client hello阶段传输,会被第三方直接获取,带来安全隐患。
  • TLS v1.3引入ESNI扩展,技术上叫domian fronting,使用安全的host建立TLS连接,之后再传输目标域名。结合加密DNS,实现安全通信。

参考资料

### 本文作者ycwu314,转载请注明出处 https://ycwu314.github.io/p/https-sni-nginx-config/ ###

原文地址:https://www.cnblogs.com/ycwu314/p/11335332.html

时间: 2024-10-28 21:40:03

nginx配置多个TLS证书,以及TLS SNI简介的相关文章

Nginx配置SSL自签名证书

生成自签名SSL证书 生成RSA密钥(过程需要设置一个密码,记住这个密码) $ openssl genrsa -des3 -out domain.key 1024 拷贝一个不需要输入密码的密钥文件 $ openssl rsa -in domain.key -out domain_nopass.key 生成一个证书请求 $ openssl req -new -key domain.key -out domain.csr 这里会提示输入国家,地区组织,email等信息.最重要的一个是"common

[Apple开发者帐户帮助]六、配置应用服务(5.2)推送通知(APN):使用TLS证书与APN通信

您的通知服务器可以使用TLS证书与Apple推送通知服务(APN)通信. 首先在开发者帐户中启用推送通知.接下来生成适用于开发和生产环境的APNs客户端TLS证书.然后从Mac导出客户端TLS标识并将其安装在通知服务器上.稍后,当您分发应用程序时,Xcode会自动将应用程序的配置从开发环境更改为生产环境. 或者,在Xcode项目中启用推送通知,以执行应用程序的其他步骤. 所需角色:帐户持有人或管理员. 生成APNs客户端TLS证书 为您使用推送通知分发的每个应用生成单独的客户端TLS证书.完全生

nginx 配置https并自签名证书

2016-10-28 转载请注明出处:http://daodaoliang.com/ 作者: daodaoliang 版本: V1.0.1 邮箱: [email protected] 参考链接: 这里 和 这里 和 官方文档 1. 制作服务器证书 服务器CA私钥: openssl genrsa -des3 -out ca.key 2048 制作解密后的CA私钥(一般无此必要): openssl rsa -in ca.key -out ca_decrypted.key ca.crt CA根证书(公

Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程

一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS 网站已不再是

为nginx配置https并自签名证书

一.把证书准备好. 步骤与使用OpenSSL自签发服务器https证书所述大同小异.在这里再重复一次. 1.制作CA证书: ca.key CA私钥: openssl genrsa -des3 -out ca.key 2048 制作解密后的CA私钥(一般无此必要): openssl rsa -in ca.key -out ca_decrypted.key ca.crt CA根证书(公钥): openssl req -new -x509 -days 7305 -key ca.key -out ca.

[转] Nginx 配置 SSL 证书 + 搭建 HTTPS 网站教程

一.HTTPS 是什么? 根据维基百科的解释: 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定.HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输.HTTPS不应与在RFC 2660中定义的安全超文本传输协议(S-HTTP)相混. HTTPS 目前已经是所有注重隐私和安全的网站的首选,随着技术的不断发展,HTTPS 网站已不再是

Nginx 配置https证书认证

一.什么是SSL证书 SL证书全程:SSL安全通道(Secure socket layer(SSL).该安全协议主要用来提供对用户和服务器的认证:对传送的数据进行加密和隐藏:确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准. SSL证书是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书. SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA(如VeriSign),在验证服务器身份后颁发,具有服务器身份验证和数据传

购买https证书以及nginx配置https

文章来源运维公会:购买https证书以及nginx配置https 1.https的作用https的全名是安全超文本传输协议,是在http的基础上增加了ssl加密协议.在信息传输的过程中,信息有可能被劫持,从而造成数据的丢失,而如果使用的是https的话,即使信息被劫持,因为在传输过程中,信息是被加密的,所以也能保证数据的安全性. 2.申请证书目前在阿里云或者腾讯云上都可以购买证书,现在以阿里云为例购买证书在阿里云的产品与服务上找到SSL证书点击购买证书,可以看到有免费型的SSL证书.如果是个人使

创建TLS证书和秘钥

创建TLS证书和秘钥 前言 执行下列步骤前建议你先阅读以下内容: 管理集群中的TLS:教您如何创建TLS证书 kubelet的认证授权:向您描述如何通过认证授权来访问 kubelet 的 HTTPS 端点. TLS bootstrap:介绍如何为 kubelet 设置 TLS 客户端证书引导(bootstrap). **注意:**这一步是在安装配置kubernetes的所有步骤中最容易出错也最难于排查问题的一步,而这却刚好是第一步,万事开头难,不要因为这点困难就望而却步. 如果您足够有信心在完全