访问控制

用户签名验证(Authentication)

NCDN通过使用访问凭证ID/访问凭证密钥(AccessID/SecretKey)对称加密的方法来验证某个请求的发送者身份。AccessID用于标识用户,SecretKey是用户用于加密签名字符串和NCDN用来验证签名字符串的密钥,其中SecretKey必须保密,只有用户和NCDN知道。每个访问凭证对都有active/inactive两种状态。

  • active表明用户可以用此ID对签名验证请求
  • inactive表明用户暂停此ID对签名验证的功能

一个用户可以同时拥有0至2个active或者inactive的ID对。用户可以登录网易云计算管理平台(http://cloud.netease.com)查看访问凭证。当用户想以个人身份向NCDN发送请求时,需要首先将发送的请求按照NCDN指定的格式生成签名字符串;然后使用SecretKey对签名字符串进行加密产生验证码。NCDN收到请求以后,会通过AccessID找到对应的SecretKey,以同样的方法提取签名字符串和验证码,如果计算出来的验证码和提供的一样即认为该请求是有效的;否则,NCDN将拒绝处理这次请求,并返回相关的错误码。例如若AccessID格式有误,返回错误码:InvalidAccessKeyId。

在Head中包含签名

用户可以在HTTP请求头中增加Authorization(授权)来包含签名信息,表明这个消息已被授权。如果用户的请求中没有Authentication字段,则认为是匿名访问。

验证码计算

 Authorization = "NCDN " + AccessKey + ":" + Signature
 Signature =	Base64(HMAC-SHA256(SecretKey,
               HTTP-Verb + "\n"  
               + Content-MD5 + "\n"  
               + Content-Type + "\n"  
               + Date + "\n"   
               + CanonicalizedResource))
  • HTTP-Verb表示HTTP请求类型,如:PUT,GET,DELETE等
  • Content-MD5表示内容数据的MD5值,非必须
  • Content-Type表示内容的类型,非必须
  • Date表示此次操作的时间,格式必须符合RFC1123的日期格式,示例:Wed, 01 Mar 2009 12:00:00 GMT
  • CanonicalizedResource 表示用户想要访问的NCDN资源

其中,Date和CanonicalizedResource不能为空,其余字段如为空,用空字符串""代替;如果请求中的Date时间和NCDN服务器的时间差正负15分钟以上,NCDN服务器将拒绝该服务,并返回错误码:AccessDenied。

构建CanonicalizedResource的方法

用户发送请求中想访问的NCDN目标资源被称为CanonicalizedResource。它的构建方法如下:

  • 将CanonicalizedResource置成空字符串""
  • 放入要访问的NCDN资源:对于创建加速域名操作,资源为/domain;对于创建缓存刷新请求,资源为/domain/${domainName}/purge;对于预热请求,资源为/domain/${domainName}
  • 如果请求包含子资源(sub-resource),那么将所有子资源的Key按照字典序排列,并以”&”为分隔符生成子资源字符串。在CanonicalizedResource字符串尾添加”?”和子资源字符串。示例:/domain/${domainName}/report/flow?dateFrom=${dateFrom}&dateTo=${dateTo}&type=&{type}

Attention

sub-resource,指的是NCDN里面某些特殊的请求参数。NCDN当前支持的子资源包括:”enable”, “disable”, “pageSize”, “pageNum”, “dateFrom”, “dateTo”, “type”, “orderType”, “sortField”, “serviceType”, “status”, “isEnabled”

在计算签名头的时候请遵循如下规则

  1. 用来签名的字符串为UTF-8格式,URL中的resource和queryString应该经过URL encode。
  2. 签名的方法用RFC 2104中定义的HMAC-SHA256方法,其中Key为Secretkey。
  3. Content-Type和Content-MD5在请求中不是必须的,但是如果请求需要签名验证,空值的话以回车符代替

注意事项

  1. 如果传入的AccessID不存在或inactive,返回403 Forbidden。错误码:InvalidAccessKeyId。
  2. 若用户请求头中Authorization值的格式不对,返回403 Forbidden。错误码:InvalidAccessKeyId。
  3. 如果签名验证的时候,请求头中没有传入Date或者格式不正确,返回403 Forbidden错误。错误码:AccessDenied。
  4. 传入请求的时间必须在NCDN服务器当前时间之后的15分钟以内,否则返回403 Forbidden。错误码:RequestTimeTooSkewed。
  5. 如果AccessID是active的,但NCDN判断用户的请求发生签名错误,则返回403 Forbidden,错误码AccessDenied。