API调用安全的核心是“三重防线”:认证层使用AK/SK签名确保请求合法性、传输层使用HTTPS加密防止窃听、时间层使用15分钟时间戳校验防重放攻击。华为云这份API网关开发指南在10种语言SDK的示例代码中反复强调一个原则——AK/SK禁止硬编码,必须通过环境变量或配置管理工具存储。访问密钥应定期轮换(建议每90天),企业联邦用户优先使用临时访问凭证(临时AK/SK+SecurityToken)。时间戳与服务器时间差超过15分钟将导致请求被拒绝,这要求客户端保持NTP同步。
AK/SK安全存储与环境变量管理
所有语言的SDK示例代码都强调:“Directly writing AK/SK in code is risky. For security, encrypt your AK/SK and store them in the configuration file or environment variables.” AK/SK硬编码在代码中会导致凭证泄露风险(代码仓库泄露、反编译、日志泄露等)。推荐做法是使用环境变量:Linux系统在~/.bashrc中设置export HUAWEICLOUD_SDK_AK="AK值"和export HUAWEICLOUD_SDK_SK="SK值",执行source ~/.bashrc生效;Windows系统在系统环境变量中设置。各语言SDK从环境变量读取AK/SK的方式:Java使用System.getenv("HUAWEICLOUD_SDK_AK"),Go使用os.Getenv("HUAWEICLOUD_SDK_AK"),Python使用os.getenv('HUAWEICLOUD_SDK_AK'),C使用Environment.GetEnvironmentVariable("HUAWEICLOUD_SDK_AK")。
访问密钥管理方面:每个用户最多可创建2个访问密钥,每个密钥仅能下载一次。建议定期轮换(每90天),轮换方式为删除旧密钥后重新生成。如开启访问密钥保护,仅管理员可管理用户的访问密钥。
时间戳校验与防重放攻击机制
API网关校验请求消息头X-Sdk-Date的时间格式(ISO8601标准:YYYYMMDDTHHMMSSZ)和时效性。客户端须注意本地时间与时钟服务器的同步,时间差大于15分钟时API网关将拒绝请求。这一机制有效防止了重放攻击(Replay Attack)——攻击者截获合法请求后无法在15分钟后重放。
各语言SDK中时间戳的设置方式:Java使用httpClientRequest.addHeader("X-Sdk-Date", DateUtils.formatDate(new Date())),Go在Sign方法中自动添加,Python在Sign方法中自动添加,C使用DateTime.UtcNow.ToString("yyyyMMddTHHmmssZ")。后端校验时需解析X-Sdk-Date并计算与服务器时间的差值:Java使用DateTimeFormatter.parseMillis和DateTime.now().getMillis(),Python使用datetime.strptime与datetime.utcnow(),C使用DateTime.ParseExact与DateTime.Now。
HTTPS传输与证书验证
API调用应使用HTTPS协议确保传输层安全。Java SDK支持SSL证书验证(SSLClientSuiteUtil.createHttpClientWithVerify(Constant.INTERNATIONAL_PROTOCOL))和不验证证书(createHttpClient)两种模式,生产环境应使用证书验证模式。Android SDK和OkHttpDemo默认支持HTTPS。curl命令中使用-H "X-Sdk-Date: ..."和-H "Authorization: ..."头域,通过HTTPS协议发送请求。
跨域请求(CORS)安全:浏览器JavaScript发起跨域请求需在API网关配置跨域共享策略并绑定API,允许指定来源和方法的跨域访问。WebSocket场景支持通过WebSocketDemo访问,同样需要签名认证。
企业联邦用户与临时访问凭证
企业联邦用户(通过SSO登录华为云的用户)不能创建永久访问密钥,但可以创建临时访问凭证(临时AK/SK和SecurityToken)。临时访问凭证通过IAM接口获取,有效期可配置(15分钟至24小时),到期自动失效,降低了凭证泄露的长期风险。临时访问凭证的获取方式参见IAM接口文档,获取后使用方式与永久AK/SK相同(同时传入securityToken参数)。
临时访问凭证的优势在于:有效期短,泄露影响范围有限;可通过Policy字段精确控制权限范围;适合临时授权场景(如第三方应用短期访问、CI/CD流水线等)。企业联邦用户应在需要调用API时获取临时凭证,用完即弃。访问密钥保护关闭时所有IAM用户可以管理自己的访问密钥;开启时仅管理员可以管理。
最佳实践总结与常见安全误区
最佳实践五条:①AK/SK禁止硬编码,使用环境变量或密钥管理服务存储;②定期轮换访问密钥(建议每90天);③启用HTTPS协议并验证SSL证书;④保持客户端NTP时间同步,确保X-Sdk-Date与服务器时间差在15分钟内;⑤开启访问密钥保护和敏感操作保护,删除密钥等操作需二次验证。
常见安全误区:将AK/SK写在配置文件并提交到代码仓库(×);使用HTTP协议传输敏感数据(×);忽略时间戳同步导致请求被拒绝(×);使用永久AK/SK在第三方应用中(应使用临时访问凭证)(×);AK/SK泄露后不及时删除重新生成(×)。正确的做法是:环境变量存储AK/SK、HTTPS传输、NTP同步、临时凭证用于第三方、泄露立即吊销。