背景

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

实践

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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/ ###

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

  1. Linux下Nginx配置阿里云 SSL证书实现HTTPS访问

    这篇文章主要介绍了nginx配置ssl证书实现https访问的示例 1.服务器系统:Centos 2. 阿里云申请SSL证书 选择“免费版DV SSL”,点击立即购买: 下载证书 列表中找到已签发的证 ...

  2. Nginx 配置 HTTPS自签名证书

    工具: OpenSSL ssl的开源实现,几乎实现了市面上所有的加密 libcrypto: 通用加密库, 任何软件要实现加密功能 链接调用这个库 libssl: TLS/SSL 加密库 openssl ...

  3. nginx 配置本地https(免费证书)

    Linux系统下生成证书 生成秘钥key,运行: $ openssl genrsa -des3 -out server.key 20481会有两次要求输入密码,输入同一个即可 输入密码 然后你就获得了 ...

  4. Nginx配置SSL自签名证书

    生成自签名SSL证书 生成RSA密钥(过程需要设置一个密码,记住这个密码) $ openssl genrsa -des3 -out domain.key 1024 拷贝一个不需要输入密码的密钥文件 $ ...

  5. apache、nginx配置openssl自签名证书

    1.生成私钥 生成rsa私钥,des3算法,2048位强度.server.key是秘钥文件名,需要提供一个至少4位的密码. [root@localhost ~]# openssl genrsa -de ...

  6. Linux中Nginx中添加自签证书TLS

    创建自签证书TLS openssl req \ -newkey rsa: \ -x509 \ -nodes \ -keyout test.com.key \ -new \ -out test.com. ...

  7. 使用vault pki 为nginx 生成tls 证书文件

    关于vault pki 管理的使用的可以参考官方文档或者docker-vault 以下演示一个简单的基于vault pki 为nginx 提供tls 证书 项目环境配置 nginx 配置文件   wo ...

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

    您的通知服务器可以使用TLS证书与Apple推送通知服务(APN)通信. 首先在开发者帐户中启用推送通知.接下来生成适用于开发和生产环境的APNs客户端TLS证书.然后从Mac导出客户端TLS标识并将 ...

  9. [nginx][tls] nginx配置https与ssl/tls的sni的方法

    一 https的sni配置方法 http {       }       server {               listen 443 ssl;               server_nam ...

随机推荐

  1. Flask框架之功能详解

    1|0浏览目录 配置文件 路由系统 视图 请求相关 响应 模板渲染 session 闪现 中间件 蓝图(blueprint) 特殊装饰器 1|1配置文件 知识点 给你一个路径 "settin ...

  2. python27期day09:函数的初始、函数的定义、函数的调用、函数的返回值、函数的参数、作业题。

    1.函数的作用:封装代码.大量的减少了重复的代码. 2.全局空间:顶行写的就是全局空间. 图解 : 3.函数的定义: def 是一个关键字.申明要定义一个函数 my_len 函数的名字.遵循变量命名的 ...

  3. Docker容器数据卷(七)

    Docker致力于: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker co ...

  4. window.devicePixelRatio ,px,rem

    window属性:devicePixelRatio 设备像素比 https://www.w3cschool.cn/fetch_api/fetch_api-atvq2nma.html devicePix ...

  5. 史上最全NOIP初赛知识点

    CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...

  6. 洛谷 U87052 一线天

    洛谷 U87052 一线天 题目传送门 题目背景 \(JDFZ\)即将举办第一届"一线天"趣味运动会...... 题目描述 "一线天"运动会在\(JLU\)南岭 ...

  7. 13 opencv训练器

    https://blog.csdn.net/WZZ18191171661/article/details/91305466 https://blog.csdn.net/qq_25352981/arti ...

  8. [LeetCode] 21. Merge Two Sorted Lists 混合插入有序链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  9. 数据库的查——select的基本使用

    --创建学生表 create table students ( id int unsigned not null auto_increment primary key, name varchar(20 ...

  10. [LeetCode] 62. Unique Paths 不同的路径

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...