写在最前
DANE 并不被浏览器原生支持,需要另外安装 Add-ons 才能看出效果
DANE 的功能 HPKP 都可以做到,并且更加优雅以及有效
DANE 依赖于 DNSSEC 保障不被篡改,而这会另外带来额外的流量消耗以及可能影响用户体验
DANE 简介
DANE 全称是 DNS-Based Authentication of Named Entities,一个基于 DNS 的名称实体验证方案。
假如你的网站或者例如 MySQL 之类的运行在一个证书之下,不管这个证书是受信任的 CA 颁发的也好还是自签发的,那么你可能会遇到的一个问题就是如何确保这个证书是你想要的证书。
DANE 就是用来解决这个问题的,他通过一条 TLSA 记录,来声明某个证书的是可信的(不同于证书透明度,自签发证书也可以进行声明是可信的)。由于 DANE 是基于 DNS 协议的,可能会有被挟持的可能,因此他又是基于 DNSSEC 来保障记录在传输过程中不被修改。
TLSA 记录
格式
- 用途
- 选择器
- 匹配类型
- 证书关联数据
用途
- 0: PKIX-TA: 证书颁发机构约束: 规定证书链中必须有对应的 CA 签发的证书
- 1: PKIX-EE: 服务证书约束: 指定应当用于某一域名的准确 TLS 证书
- 2: DANE-TA: 信任锚断言: 指定一个 CA
- 3: DANE-EE: 域颁发证书: 指定一个具体的 TLS 证书
选择器
- 0: Cert: 使用整个证书
- 1: SPKI: 使用主体的公钥
匹配类型
- 0: Full: 不进行 Hash
- 1: SHA-256: SHA-256 hash
- 2: SHA-512: SHA-512 hash
例子
; <<>> DiG 9.10.3-P4 <<>> _443._tcp.imlonghao.com tlsa
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51349
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_443._tcp.imlonghao.com. IN TLSA
;; ANSWER SECTION:
_443._tcp.imlonghao.com. 3599 IN TLSA 3 0 2 D809CBCC9E8BE0AE49F986ECEE168926258BEA2706B8C9C356F01DBE 82052DB2870BF60AD9FD4396E8AC476E06CA781E5C58E0712D3E8BA3 2F1459B62186D7CD
;; Query time: 496 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Mar 28 20:36:21 CST 2016
;; MSG SIZE rcvd: 131
DANE 配置
想要配置 DANE ,首先你得启用 DNSSEC ,然后你得确保你的 DNS 解析服务器可以使用 TLSA 记录
这里我们以我的网站 imlonghao.com
为例子,主要围绕的就是 TLSA 记录的生成
通过 openssl 生成
首先,/var/ssl/imlonghao.crt
是本站的 SSL 证书,里面包含了 Comodo 完整的证书链
通过 openssl 也有两种方式可以生成我们需要的证书关联数据
请注意加密方式的选择会影响到后面的 TLSA 写法
方式一
SHA-256
openssl x509 -in /var/ssl/imlonghao.crt -outform DER | shasum -a 256 | awk '{print $1;}'
SHA-512
openssl x509 -in /var/ssl/imlonghao.crt -outform DER | shasum -a 512 | awk '{print $1;}'
方式二
SHA-256
openssl x509 -in /var/ssl/imlonghao.crt -noout -fingerprint -sha256 | sed -e 's/^.*=//' -e 's/://g'
SHA-512
openssl x509 -in /var/ssl/imlonghao.crt -noout -fingerprint -sha512 | sed -e 's/^.*=//' -e 's/://g'
通过在线网站生成
这里使用到的网站是:Generate TLSA Record
将我们完整的证书粘帖到网站中,填写好端口、协议以及域名之后直接点击 Generate
即可
设置域名
假设我们这里的域名是 imlonghao.com
,端口是 443
,协议是 tcp
那么我们就要新增一条 TLSA 记录到这个地址 _443._tcp.imlonghao.com
根据上面 TLSA 的写法,我们可以将内容写成
3 0 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxx
这样,保存,然后就大功告成了!
检测是否成功
这里我们直接使用浏览器插件进行检查,具体的下载地址自行搜索
如果看到如下图的时候,大概就已经是成功的了。