HarmonyOS HTTPS 证书边界实战:域名、环境、CA 与发布校验

网络安全配置经常在临近发布时暴露问题:测试环境域名混进生产包,自签证书只在开发机可用,HTTPS 证书过期导致接口全挂,预发布和生产配置被同一个开关控制。HTTPS 证书边界治理要把环境、域名、CA 信任、证书有效期和发布检查都纳入工程流程。

请添加图片描述

本文解决:环境怎么隔离,域名白名单怎么写,证书策略如何表达,发布前怎么避免测试配置进入生产。

1. 证书问题先从环境边界查

很多证书事故不是 TLS 本身的问题,而是环境串了。生产包请求测试域名,测试证书不被信任,用户看到的就是接口失败。

请添加图片描述

环境 域名 证书要求
开发 dev.example.com 可用内部证书
预发 staging.example.com 接近生产
生产 api.example.com 可信 CA、有效期明确

2. HTTPS 资料边界和工程目录

HarmonyOS 网络安全需要关注 HTTPS、证书链、CA 证书和网络安全配置。工程上要把环境配置和发布校验分开。

资料入口 工程落点
HTTP 数据请求 请求时使用 HTTPS 地址
HTTPS 证书校验 证书校验和安全连接
网络安全配置 域名和 CA 信任边界
entry/src/main/ets/common/security/
  EnvConfig.ets
  DomainAllowList.ets
  CertificatePolicy.ets
  ReleaseGuard.ets
  SecurityAudit.ets

3. EnvConfig 区分环境

export type AppEnv = 'dev' | 'staging' | 'production'

export interface EndpointConfig {
  env: AppEnv
  apiBase: string
  cdnBase: string
}

export const EndpointTable: Record<AppEnv, EndpointConfig> = {
  dev: { env: 'dev', apiBase: 'https://dev.example.com', cdnBase: 'https://dev-cdn.example.com' },
  staging: { env: 'staging', apiBase: 'https://staging.example.com', cdnBase: 'https://staging-cdn.example.com' },
  production: { env: 'production', apiBase: 'https://api.example.com', cdnBase: 'https://cdn.example.com' }
}

环境配置要集中,不能在页面或仓库层散落域名字符串。

4. DomainAllowList 限制请求目标

export class DomainAllowList {
  allowedHosts(env: AppEnv): string[] {
    const cfg = EndpointTable[env]
    return [new URL(cfg.apiBase).hostname, new URL(cfg.cdnBase).hostname]
  }

  verify(env: AppEnv, url: string): boolean {
    const host = new URL(url).hostname
    return this.allowedHosts(env).includes(host)
  }
}

白名单可以防止临时调试域名进入生产包。

5. CertificatePolicy 表达证书要求

export interface CertificateRequirement {
  host: string
  issuer: string
  expireBeforeDays: number
  pinningRequired: boolean
}

export class CertificatePolicy {
  requirement(env: AppEnv): CertificateRequirement[] {
    if (env === 'production') {
      return [
        { host: 'api.example.com', issuer: 'Trusted CA', expireBeforeDays: 30, pinningRequired: true },
        { host: 'cdn.example.com', issuer: 'Trusted CA', expireBeforeDays: 30, pinningRequired: false }
      ]
    }
    return [{ host: `${env}.example.com`, issuer: 'Internal CA', expireBeforeDays: 7, pinningRequired: false }]
  }
}

生产证书策略要比测试环境严格,尤其是有效期和固定证书策略。

6. ReleaseGuard 发布前检查

请添加图片描述

export interface ReleaseCheckResult {
  passed: boolean
  errors: string[]
}

export class ReleaseGuard {
  check(env: AppEnv, urls: string[]): ReleaseCheckResult {
    const allow = new DomainAllowList()
    const errors: string[] = []
    if (env !== 'production') errors.push('发布包环境不是 production')
    for (const url of urls) {
      if (!url.startsWith('https://')) errors.push(`${url} 不是 HTTPS`)
      if (!allow.verify(env, url)) errors.push(`${url} 不在生产白名单内`)
    }
    return { passed: errors.length === 0, errors }
  }
}

发布检查要在打包前执行,不要等审核或线上用户发现。

7. SecurityAudit 记录安全配置

export interface SecurityAuditRecord {
  env: AppEnv
  host: string
  item: 'domain' | 'certificate' | 'ca' | 'release'
  result: 'pass' | 'fail'
  reason?: string
}

export class SecurityAudit {
  private readonly records: SecurityAuditRecord[] = []

  append(record: SecurityAuditRecord): void {
    this.records.push(record)
  }

  failures(): SecurityAuditRecord[] {
    return this.records.filter(item => item.result === 'fail')
  }
}

安全配置的变更要留下记录,方便发布审查和事故复盘。

8. 页面和网络层如何使用

export function buildApiUrl(env: AppEnv, path: string): string {
  const base = EndpointTable[env].apiBase
  if (!path.startsWith('/')) throw new Error('接口路径必须以 / 开头')
  return `${base}${path}`
}

业务层只传路径,不能自己拼域名。域名由环境配置统一控制。

9. HTTPS 发布验收动作

场景 操作 预期结果
生产包 检查环境 必须是 production
域名检查 扫描接口地址 全部命中白名单
非 HTTPS 写入 http 地址 发布检查失败
证书过期 模拟剩余天数不足 发布前拦截
测试域名 混入 staging 直接失败
export function assertProductionEndpoint(url: string): void {
  if (!url.startsWith('https://')) throw new Error('生产接口必须使用 HTTPS')
  if (!new DomainAllowList().verify('production', url)) throw new Error('生产接口不在白名单内')
}

10. 证书边界异常排查表

证书问题要从环境、域名、证书链和有效期四层定位。

现象 优先查看 处理建议
生产接口全失败 证书有效期 提前告警
只有测试机正常 CA 信任 不把内部 CA 带到生产
请求到测试环境 EnvConfig 发布包冻结生产配置
某个域名失败 白名单和证书链 单域名排查
审核问网络安全 安全配置记录 提供域名、CA、HTTPS 说明

发布前建议生成一份安全配置摘要,交给测试和审核资料一起归档。摘要不需要暴露密钥,只列出环境、域名、HTTPS 状态、证书策略和最近一次检查结果。

export interface ReleaseSecuritySummary {
  env: AppEnv
  domains: string[]
  httpsOnly: boolean
  certificatePolicyCount: number
  generatedAt: number
}

export function buildReleaseSummary(env: AppEnv): ReleaseSecuritySummary {
  const domains = new DomainAllowList().allowedHosts(env)
  const policies = new CertificatePolicy().requirement(env)
  return {
    env,
    domains,
    httpsOnly: domains.every(host => host.length > 0),
    certificatePolicyCount: policies.length,
    generatedAt: Date.now()
  }
}

这份摘要的价值在于“发布前可复核”。如果生产包里出现测试域名,摘要会马上暴露;如果证书策略数量异常,也能在提交审核前拦下来。

HTTPS 证书复现场景:给读者一组可执行核验

证书边界要按环境验证。测试域名、正式域名、证书过期和 CA 变化都要有记录,避免发版后才发现握手失败。

核验维度 读者需要准备的证据
输入 页面入口、用户动作、关键参数
过程 日志、状态变化、异常分支
输出 UI 表现、回调结果、持久化结果
回归 同场景重复执行后的结果
interface HttpsReplayCase {
  host: any
  env: any
  certExpireDays: any
  caMatched: any
}

const replay87: HttpsReplayCase = {
  host: 'sample',
  env: 'sample',
  certExpireDays: 'sample',
  caMatched: 'sample',
}

function assertReplay87(item: HttpsReplayCase): void {
  if (item.env === 'prod' && !item.caMatched) throw new Error('正式环境 CA 不匹配')
}

这组核验把证书环境和 CA 匹配情况写清楚,适合在测试域名切正式域名前使用。

证书环境回放表:把文章方法变成可复现动作

HTTPS 证书问题常发生在测试环境切正式环境。建议准备测试域名、正式域名、过期证书和错误 CA 四种记录,验证发布前不会带错配置。

回放动作 核验方式
测试域名隔离 准备输入、执行操作、记录结果、给出结论
正式域名匹配 准备输入、执行操作、记录结果、给出结论
过期证书告警 准备输入、执行操作、记录结果、给出结论
错误 CA 阻断 准备输入、执行操作、记录结果、给出结论

HTTPS 证书边界要跟环境绑定。读者可以把测试域名、预发域名、正式域名分别列入表格,记录证书过期时间、CA 来源和域名匹配情况。发布前如果测试 CA 混入正式环境,或者正式域名证书即将过期,就应该阻断发布,而不是等用户请求失败后再定位。

证书发布的落地边界:不要把边界留给读者猜

HTTPS 证书治理要进入发布流程。证书过期时间、域名匹配、环境隔离、CA 来源都应该在发版前确认。读者如果只在请求失败后排查证书,线上问题已经发生。

落地项 处理要求
证书过期提前提醒 需要有明确输入、处理边界和失败兜底
域名和环境绑定 需要有明确输入、处理边界和失败兜底
测试 CA 不进正式包 需要有明确输入、处理边界和失败兜底
发布前保留核验记录 需要有明确输入、处理边界和失败兜底

这类边界写清楚后,读者不需要猜哪些逻辑属于页面、哪些属于服务、哪些属于发布前验收。文章的价值也会从“讲了一个功能”变成“给了一套可迁移的工程判断”。

证书联调步骤:按真实路径走一遍

证书联调建议在发版前固定执行。第一步确认测试包只访问测试域名,第二步确认正式包只访问正式域名,第三步确认域名和证书主体匹配,第四步确认过期时间在安全窗口内,第五步确认错误 CA 会被阻断。这样证书问题不会在用户请求失败后才暴露。

这一步的意义是让读者拿到文章后可以直接复现,而不是只理解概念。技术文章如果能把“输入、动作、日志、结果、失败兜底”写完整,读者照着做时出错概率会低很多。

证书验收补充:补上容易漏掉的边界

建议把证书核验结果写进发布记录:包名、环境、域名、证书到期天数、CA 来源和核验人。后续如果出现某个渠道包请求失败,可以先对比发布记录,而不是重新猜测是否打错包或连错环境。

证书相关问题建议纳入发布前自动清单。除了人工查看证书有效期,还可以把域名、环境、证书过期天数写入构建记录,正式包发现测试域名或证书有效期过短时直接阻断。这样证书治理不会依赖某个人发版前临时想起来检查。

这类补充不是为了增加篇幅,而是为了让读者在真实项目里少踩坑:正常路径一般最容易跑通,异常路径、退出路径和恢复路径才是质量差距所在。

11. 小结:证书安全要前置到发布流程

HTTPS 证书边界不是最后一刻才检查的配置项。环境、域名、CA、证书有效期和发布校验都要进入工程流程。只要生产包不能请求测试域名、不能使用非 HTTPS、不能绕过证书策略,网络安全事故就会少很多。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐