用户自定义域是 SaaS 服务平台中一项广泛运用的功能,诸如 Shopify 等知名平台均已提供此项服务,旨在为用户带来更加个性化和灵活的使用体验。
在常规操作模式下,SaaS 平台的用户通过购买平台提供的软件服务,构建出独具特色的用户体验,进而服务于最终用户。作为服务的起始点,SaaS 平台通常为每位用户分配一个随机生成的子域作为默认访问入口。然而,为了满足用户对于个性化访问地址的需求,平台亦支持用户将自有域名设置为访问入口,从而增强品牌的辨识度和用户访问的便捷性。
本文旨在深入探讨如何在实际产品开发中实现用户自定义域名的功能,以期为开发者提供有益的参考和启示。
问题分析
您可能心生疑问:只要用户将域的 DNS CNAME 记录指向平台提供的随机域不就能实现这个功能了吗?
实际上问题更为复杂,主要集中在以下两个方面:
现代互联网服务都使用 HTTPS 协议来确保通信安全。最终用户尝试访问由 SaaS 平台提供的站点,此时如果使用平台提供的随机子域作为入口,可直接用泛域 TLS 证书,证书的管理不会存在问题,此时用户与 SaaS 平台的 HTTPS 服务进行握手并证书可信。而使用用户自定义域时,SaaS 平台必须持有该域的可信证书,最终用户的浏览器才能与平台正确的建立连接,这要求平台接受用户上传证书或提供托管的证书管理服务。
建立安全的连接后,SaaS 平台也需要识别最终用户正在尝试访问平台上的哪个租户,这要求平台维护一个域和租户标识的映射表,平台在接收到请求时从请求中提取特定的租户信息,比如 Host 请求头,并根据映射表查找租户 ID,并向请求者返回租户下的所需数据。
TLS 证书管理
主流云服务
主流云服务提供商如 AWS(Amazon Web Services)和 GCP(Google Cloud Platform)均设有完善的证书管理服务及相应 API 接口,Cloudflare 更是针对 SaaS 服务推出了专用的 Cloudflare for SaaS 解决方案。
以 AWS 为例,其提供的 AWS Certificate Manager 服务,通过调用其 API,使得 SaaS 平台能够轻松为其用户配置的自定义域签发可信证书。作为 AWS 生态中的一项服务,它与其他核心功能如 Elastic Load Balancer 和 CloudFront 实现了无缝集成,使得 ACM 签发的证书能够直接用于 TLS 终止。
基于这些云服务,平台能够一站式地管理 TLS 证书,听起来确实颇具吸引力。在 SaaS 服务的初创阶段,使用这些云服务确实能够大幅减轻开发者的负担,让他们能够更专注于业务逻辑的实现。然而,在追求一致的用户体验时,这些云服务也暴露出一些潜在问题。
以 AWS Certificate Manager 为例,它在签发证书时会要求进行域所有权验证。这一过程要求域所有者在其 DNS 记录中设置特定的 CNAME 记录,指向 acm-validations.aws 的地址。并且这一记录需要长期保持,以便后续的证书续期操作。这意味着 SaaS 平台不得不将特定于云平台的实现细节暴露给用户。此外,这种机制并非遵循任何通用的证书自动化标准,如 ACME 协议。因此,SaaS 平台可能会因此被牢牢绑定在 AWS 的云服务上,当 SaaS 平台拥有大量用户时,进行迁移(要求每个用户重新调整 DNS 记录)几乎成为一项不可能完成的任务。
此外,由 ACM 服务签发的可信证书并不支持下载功能,这意味着这些证书只能被 AWS 生态内的其他服务所使用,而无法轻松扩展至其他云供应商,从而限制了多云的灵活性。
自动化证书管理
随着 Let's Encrypt 等基于 ACME(Automatic Certificate Management Environment, RFC 8555)协议逐渐成为主流,自动化的证书管理已不再是云服务的专有技术。如今,任何开发者都能简便地实现自动证书签发和续签,这极大地提升了服务的易用性和安全性。
ACME 规范定义了多种域所有权认证机制,包括但不限于 DNS TXT、HTTP、TLS ALPN 等,这些机制为证书申请者提供了灵活多样的选择。在 SaaS 场景下,HTTP 认证方式尤为适用。用户仅需为自定义域配置 DNS CNAME 记录,使其指向平台分配的随机域或统一的 CNAME 接入点。例如,平台可以要求用户将 example.com 解析至 cname.contoso.com,而该 CNAME 接入点则指向平台自部署的 HTTP 服务。这样的设计使得证书签发过程更为简洁和高效。
一旦域名配置正确,平台即可调用 CA 提供的 API 创建证书订单。CA 随后会通过 HTTP 访问用户的域名,由于此时该域名已指向平台的接入点,因此平台能够轻松地满足 CA 要求的特定随机字符串验证条件,从而完成域所有权验证并下载证书。
这种机制不仅简化了用户的配置流程,还避免了频繁修改 DNS 记录的麻烦。更重要的是,它摆脱了特定云服务供应商的束缚,使得 SaaS 平台能够提供更友好和一致的用户体验。
此外,使用这种机制并不意味着无法利用云上的 CDN 或负载均衡服务完成 TLS 终止。事实上,AWS 等云服务供应商提供的证书管理服务都支持开发者通过 API 将自我管理的证书导入,并用于流量接入。开发者只需在自己的程序中完成证书签发后,便可将证书导入云供应商的证书管理服务中,从而实现无缝集成和高效利用云资源。
多租户系统
在成功处理 TLS 证书之后,紧接着的挑战在于管理 SaaS 平台上的多租户逻辑。鉴于 SaaS 平台并非仅服务于少数用户的特定需求,而是致力于向广大用户提供统一的功能集,其系统架构通常采用多租户设计。在这种设计中,平台通过唯一的租户 ID 来识别不同租户,并为他们各自的最终用户提供相应的服务。
实现租户识别机制相对直接。由于需要验证域所有权和管理证书,用户必须在 SaaS 平台控制台配置自定义域,并遵循系统指引设置 DNS 解析。一旦系统完成证书配置,自定义域的记录将被存储在系统中,并与当前租户建立关联。因此,每当系统接收到请求时,只需从 HTTP 请求头中提取 Host 字段,即可确定客户端浏览器所使用的访问域名。进而,通过查询该域名对应的租户记录,系统能够迅速识别出租户标识。一旦获取到租户标识,系统便能够精确地查询和访问对应租户的数据。
总结
自定义域是 SaaS 平台上的一项核心功能,它旨在为用户提供更加个性化和灵活的访问体验。在实现自定义域功能的过程中,必须解决两大关键问题:TLS 证书管理和多租户管理。确保数据传输的安全性,保障不同用户间的数据隔离与隐私保护,对于提升 SaaS 平台的稳定性与用户体验至关重要。