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、测试、元服务和应用上架分发等。

更多推荐