TLS-RPT 报告解读与自动化分析

TLS-RPT协议概述

TLS Reporting(TLS-RPT)由RFC 8460定义,是与MTA-STS和DANE配套的报告机制。当发送方试图建立加密连接但遭遇失败时,TLS-RPT向域名所有者报告这些失败详情。与DMARC的RUA聚合报告类似,TLS-RPT报告以JSON格式聚合发送方观察到的TLS连接结果。

启用TLS-RPT需要在DNS中发布一个TXT记录。报告接收地址通过rua=标签指定,格式为mailto: URI。TLS-RPT与MTA-STS共享DNS部署位置(_smtp._tls.{domain}),但TLS-RPT的记录格式完全不同。

TLS-RPT DNS配置与报告投递

DNS记录格式

# TLS-RPT DNS TXT 记录
_smtp._tls.example.com TXT "v=TLSRPTv1; rua=mailto:tls-reports@example.com"

# 同时为子域配置
_smtp._tls.mail.example.com TXT "v=TLSRPTv1; rua=mailto:tls-subdomain@example.com"

# 多报告地址(逗号分隔)
_smtp._tls.example.com TXT "v=TLSRPTv1; \
  rua=mailto:tls@example.com,mailto:tls-backup@backup.example.com"

投递流程

RFC 8460 §4.4定义了报告投递的流程:发送方收集一个报告周期内的TLS失败记录,通过SMTP邮件投递到rua中指定的邮箱地址。报告邮件必须满足以下要求:Sender头部设置为空且Return-Path必须指向发送方,邮件主题固定为{Report Summary; Format: application/tlsrpt+json; Report-ID: UUID},Content-Type为application/tlsrpt+json。接收方需要设置邮件过滤器来捕获和分类这些报告。

JSON报告结构详解

TLS-RPT报告采用JSON格式(RFC 8259)。顶级结构如下:

{
  "organization-name": "Example Sender Corp",
  "date-range": {
    "start-datetime": "2025-07-28T00:00:00Z",
    "end-datetime": "2025-07-29T00:00:00Z"
  },
  "contact-info": "tls-report@example-sender.com",
  "report-id": "2025-07-28T00:00:00Z_example.com",
  "policies": [
    {
      "policy": {
        "policy-type": "sts",
        "policy-string": ["version: STSv1", "mode: enforce"],
        "policy-domain": "example.com",
        "mx-host": ["mail1.example.com", "*.mx.example.net"],
        "mx-pattern": ["mail1.example.com", "*.mx.example.net"]
      },
      "summary": {
        "total-successful-session-count": 850,
        "total-failure-session-count": 3
      },
      "failure-details": [
        {
          "result-type": "certificate-expired",
          "sending-mta-ip": "198.51.100.10",
          "receiving-mx-hostname": "mail1.example.com",
          "receiving-mx-helo": "mail1.example.com",
          "receiving-ip": "203.0.113.50",
          "failed-session-count": 2,
          "additional-information": "Certificate expired 2025-07-25T23:59:59Z"
        }
      ]
    }
  ]
}

关键字段解读:

失败原因类型与诊断

RFC 8460 §1定义了9种标准result-type。每种类型对应特定的TLS故障模式:

result-type 含义 常见原因 排修优先级
starttls-not-supported 服务器未响应STARTTLS MTA版本过旧或端口配置错误
certificate-expired 接收方证书已过期 忘记更新CA证书
certificate-not-yet-valid 证书尚未生效 系统时间不同步或证书有效期误配
certificate-host-mismatch 证书CN/SAN与MX主机不匹配 证书颁发给错误的域名或泛域名未正确覆盖
certificate-revoked 证书已被吊销 CA撤销或私钥泄露 紧急
tlsa-invalid TLSA记录无效 DANE记录类型/协议/端口参数错误
validation-failure TLS验证失败 证书链问题算法不匹配
sts-policy-fetch-error MTA-STS策略获取失败 HTTPS证书到期或.mta-sts子域不可达
sts-policy-invalid 策略文件解析错误 格式错误或缺少必填字段

自动化分析管道搭建

邮件提取与解析

# 使用Python解析TLS-RPT报告
import json
import email
from email import policy

with open('tls-report.eml', 'r') as f:
    msg = email.message_from_file(f, policy=policy.default)
    
# 验证Content-Type
if msg.get_content_type() != 'application/tlsrpt+json':
    raise ValueError(f"Not a TLS-RPT report: {msg.get_content_type()}")

payload = msg.get_content()
report = json.loads(payload)

# 提取策略和失败信息
for policy_entry in report.get('policies', []):
    policy_info = policy_entry['policy']
    summary = policy_entry['summary']
    
    success_rate = summary['total-successful-session-count'] / \
        (summary['total-successful-session-count'] + \
         summary['total-failure-session-count']) * 100
    
    print(f"Policy: {policy_info['policy-domain']}")
    print(f"Success rate: {success_rate:.2f}%")
    
    for failure in policy_entry.get('failure-details', []):
        print(f"  FAIL: {failure['result-type']}")
        print(f"    MX: {failure['receiving-mx-hostname']}")
        print(f"    Count: {failure['failed-session-count']}")

告警规则配置

基于TLS-RPT报告的告警规则建议:

  1. 单日失败次数>100或成功率<90%时触发告警
  2. certificate-revoked类型出现即触发紧急告警
  3. certificate-expired类型在证书到期前30天即预警
  4. 连续3天收到同一MX的sts-policy-fetch-error需手动排查

与DMARC RUA报告的配合分析

TLS-RPT报告与DMARC RUA报告互为补充。RUA报告提供发件域的身份验证通过率,TLS-RPT提供加密传输的连接质量。联合分析的最佳实践:

建议将TLS-RPT报告管理纳入邮件运维的SLA标准流程。至少每周检查一次报告摘要,每月做一次趋势分析。对突然出现的批量失败迅速响应,这往往是证书到期或策略配置错误的早期信号。

参考文献

  1. RFC 8460 — SMTP TLS Reporting (TLS-RPT)
  2. RFC 8461 — SMTP MTA Strict Transport Security (MTA-STS)
  3. RFC 7672 — SMTP Security via Opportunistic DNS-Based Authentication of Named Entities (DANE) Transport Layer Security
  4. RFC 8259 — The JavaScript Object Notation (JSON) Data Interchange Format

引用本文

ztpop.net 知识库编辑. "TLS-RPT 报告解读与自动化分析" ztpop.net 知识库.

本站技术文章采用 CC-BY 4.0 许可,可自由引用,仅需标注来源 ztpop.net。