# Railway 自定义域名：CNAME、TXT、SSL 与 Cloudflare

> Railway 绑定自定义域名并自动签发 Let's Encrypt 证书：CNAME 和 TXT 两条记录、根域名怎么配、通配符、CAA，以及证书卡在 Validating Challenges 的处理。

Source: https://ssl.sh/zh/guides/railway-custom-domain/
Last updated: 2026-11-10

Railway 会在自定义域名验证通过后自动签发免费的 Let's Encrypt 证书。证书用 ECDSA 密钥，有效期 90 天，剩 30 天时自动续期。每个域名都要加两条记录：一条 CNAME 指向服务的 `up.railway.app` 地址，一条 TXT 用来证明所有权。Railway 支持通配符域名，但不支持上传自己的证书。

步骤和菜单名称以 Railway 官方文档为准（截至 2026 年 11 月）。`abc123.up.railway.app` 和 `example.com` 是示例。

## 速查表

| 问题 | Railway 的做法 |
|---|---|
| 自动证书的 CA | Let's Encrypt（ECDSA 密钥） |
| 子域名 `www.example.com` | `CNAME` 指向 `abc123.up.railway.app`，再加一条 `TXT` |
| 根域名 `example.com` | 需要 CNAME 拉平或动态 `ALIAS`，再加一条 `TXT` |
| CAA 要放行 | `letsencrypt.org` |
| 通配符证书 | 支持，额外加一条 `_acme-challenge` CNAME |
| 上传自有证书 | 不支持 |
| 续期 | 自动，90 天有效期剩 30 天时 |
| 自定义域名数量 | Trial 1 个；Hobby 每个服务 2 个；Pro 每个服务 20 个（可申请提高） |

## 国内访问说明

Railway 的服务部署在境外，从中国大陆访问的速度和稳定性没有保证，不同网络环境差别很大，这和证书配置无关。需要面向国内用户长期稳定运行、或者需要 ICP 备案的业务，建议部署在阿里云、腾讯云等国内云上，证书可以参考 [acme.sh 用阿里云 DNS/DNSPod 签证书](https://ssl.sh/zh/guides/acme-sh-dnspod-aliyun-dns/) 或 [阿里云 SSL 证书](https://ssl.sh/zh/guides/aliyun-ssl-certificate/)。

## 第一步：添加域名

打开服务的 **Settings → Public Networking**，点 “+ Custom Domain”，输入域名，选择应用监听的目标端口。Railway 会给出两条要添加的记录：

- 一条 `CNAME`，比如 `g05ns7.up.railway.app`；
- 一条用于验证所有权的 `TXT` 记录。

`example.com` 和 `www.example.com` 算两个自定义域名，所以只能加 1 个域名的 Trial 套餐没法两个都用。Freenom 的域名不支持。

## 第二步：添加 DNS 记录

两条记录都要严格按控制台显示的内容添加。缺了 TXT 记录，即使 CNAME 已经生效，请求也会返回 `404`，因为 Railway 先确认所有权再转发流量。

| 主机记录 | 类型 | 记录值 |
|---|---|---|
| `www` | `CNAME` | `abc123.up.railway.app` |
| 按控制台显示 | `TXT` | 按控制台显示 |

**根域名。** Railway 不提供 A 记录的目标 IP，DNS 服务商必须支持 CNAME 拉平（Cloudflare 支持）或动态 ALIAS（比如 DNSimple）。Railway 文档点名不支持的有 AWS Route 53、Azure DNS、Hostinger、GoDaddy、NameSilo、Hurricane Electric、Squarespace。遇到这种情况，要么把域名的 NS 换到支持 CNAME 拉平的服务商，要么只用 `www` 提供服务。根域名用阿里云解析或 DNSPod 的，先确认服务商是否支持在根域名上这样做，不支持就同样采用上面两种办法之一。

同一个主机名上不要同时存在 `A` 和 `CNAME` 记录。DNS 全球生效最长可能要 72 小时。

## 第三步：检查 CAA 记录

没有 CAA 记录就没有限制。如果有，要包含 Let's Encrypt：

```dns
example.com.  3600  IN  CAA  0 issue "letsencrypt.org"
```

可以用 `dig CAA example.com` 或 [CAA 检测工具](https://ssl.sh/zh/tools/caa-checker/) 查看当前策略。

## 第四步：等待绿色对勾

Railway 验证域名后，域名旁边会出现绿色对勾，证书一般在一小时内签好。如果记录开了 Cloudflare 代理，Railway 还会显示 **Cloudflare proxy detected**。

## 在 Cloudflare 上同时用根域名和 www

Railway 文档的做法是根域名提供服务，`www` 跳转到根域名，步骤如下：

1. 在 Railway 里把 `example.com` 添加为自定义域名。
2. 在 Cloudflare 添加 `@` 的 `CNAME`，指向 Railway 给的地址，开启代理；再添加 `TXT` 记录。
3. 再加一条 `www` 的 `CNAME`，目标填 `@`，开启代理。
4. **SSL/TLS > Overview** 选 Full，不要选 Full (Strict)。
5. 在 **SSL/TLS > Edge Certificates** 里开启 Universal SSL。
6. 建一条 Bulk Redirect，从 `https://www.example.com` 以 `301` 跳到 `https://example.com`。

不开代理时，Cloudflare 不会把这个域名和你的 Railway 项目关联起来，会出现 `ERR_TOO_MANY_REDIRECTS`。开了代理时，比一级子域名更深的名字（`*.sub.example.com`）需要 Cloudflare 的 Advanced Certificate Manager，否则只能设为 DNS only。

## 通配符域名

添加 `*.example.com` 时，Railway 会给出两条 CNAME 和一条 TXT：一条 CNAME 给通配符本身，一条给 `_acme-challenge`（Railway 签证书要用），TXT 用于所有权验证，三条缺一不可。指向 `authorize.railwaydns.net` 的那条 CNAME 不能开代理，所以在 Cloudflare 上要把 `_acme-challenge` 记录设成 DNS only（灰色云），并开启 Universal SSL。通配符可以用在任意层级（`*.sub.example.com`），但不能嵌套（`*.*.example.com`）。

## 自有证书

Railway 文档写明目前不支持外部 SSL 证书。必须使用某家 CA 的证书时，只能在 Railway 前面终止 TLS，比如放在 Cloudflare 后面。

## 验证

配置正确时，颁发者是 Let's Encrypt，SAN 里有你的域名；返回 `*.up.railway.app` 证书说明你的域名证书还没签下来。用 [SSL 证书检查](https://ssl.sh/zh/tools/ssl-checker/) 检查，或在终端运行：

```bash
curl ssl.sh/example.com
```

查看 Railway 返回的证书：

```bash
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -issuer -subject -ext subjectAltName -dates
```


## 自动续期

Railway 在证书剩余 30 天时自动续期。Let's Encrypt 的默认有效期 2027 年 2 月 10 日缩短到 64 天、2028 年 2 月 16 日缩短到 45 天，Railway 文档里的 90 天是现在的默认值。续期依赖的 DNS 和首次签发一样，CNAME、TXT 以及通配符的 `_acme-challenge` 都要保留。建议用 [ssl.sh 监控](https://ssl.sh/zh/monitor/)（开发中） 盯着域名。

## 常见问题排查

先做这几件事：确认服务已部署且在运行，用无痕窗口测试，清本地 DNS 缓存，添加域名后至少等一小时。不要反复删除再添加域名：Let's Encrypt 对完全相同的一组域名，7 天内最多签 5 张证书，反复重试可能被挡好几天，见 [Let's Encrypt 频率限制](https://ssl.sh/zh/errors/lets-encrypt-rate-limit/)。

- **证书卡在“Validating Challenges”**：DNS 没生效或填错、CAA 挡住了 Let's Encrypt、DNSSEC 配置有误（用 dnsviz.net 检查），或者 Cloudflare 代理干扰。Railway 推荐的“切换法”：先把 Cloudflare 记录改成 DNS only，等 Railway 出现绿色对勾，再把代理打开。
- **ERR_TOO_MANY_REDIRECTS**：Cloudflare 用的是 Flexible 模式，改成 Full。
- **Error 526: Invalid SSL Certificate**：Cloudflare 用的是 Full (Strict)，改成 Full。
- **Error 525: SSL Handshake Failed**：证书还没签下来或签发过程临时出错。等一等，检查 DNS，切换一下代理开关。
- **证书显示 `*.up.railway.app`**：域名还没验证通过，检查两条记录，删掉冲突的 `A` 记录。
- **只有部分用户打不开**：可能是旧系统旧浏览器、公司代理或杀毒软件的 HTTPS 扫描，从其他网络用 `openssl s_client` 测一下。
- **CAA 报错**：见 [CAA 记录阻止签发](https://ssl.sh/zh/errors/caa-record-prevents-issuance/)。签发卡住超过 72 小时，联系 Railway 支持。
