网关签名说明
网关签名说明
SDK
当前私有云SDK 支持Java、 Python,已经经过测试,可以跟私有云OpenAPI支持人员获取。其他在开发中的语言为golang、dotnet、nodejs已经有完整的版本但未完全测试,如需要使用可以联系OpenAPI支持人员获取,同时有问题可以反馈,团队会快速支持。同时团队可以提供Rust的签名包。
基本签名流程
ctyun-eop-ak/ctyun-eop-sk基本签名流程
1.
2.
3.
4.
5.
步骤一 信息获取
用户型用户通过云管界面用户信息获取ctyun-eop-ak,ctyun-eop-sk
(https://api.apifox.cn/api/v1/projects/2460723/resources/374261/image-preview)
步骤二 创建待签名字符串
待签名字符串=需要进行签名的Header排序后的组合列表+ "\n" + 排序后的query + "\n" + toHex(SHA256(原封的body))。 toHex指将SHA256的摘要转换为16进制字符串。注意没有请求体时不需要拼接body摘要字符串
字段名 | 字段描述 | 构造格式说明 |
---|---|---|
campmocalHeader | 将需要参与签名的Header信息进行排序后的字符串 | 以 header_name:header_value格式通过\n拼接起来,EOP强制要求ctyun-hybrid-request-id和hybrid-date作为Header中的一部分。进行签名算法的Header需要进行排序(将它们的参数名按ASCII码字典序从小到大排序),将排序后得到的列表遍历组装成待签名的header。 |
afterQuery | 完成排序后的query字符串 | query使用&拼接,键和值以=连接,排序规则按ASCII码字典序从小到大排序,query参数全部都需要进行签名 |
calculateContentHash | 将原封的body信息进行加密以及进制转换后的字符串 | toHex(SHA256(body))。传入的body参数进行SHA256摘要,并将结果转换为hex16进制字符串 |
forSignature | 待签名字符串,用于最终签名数据的生成 | campmocalHeader+"\n+afterQuery+"\n+calculateContentHash |
步骤三 构造动态密钥
动态密钥生成流程
1.
2.
3.
hybrid-date | yyyymmddTHHMMSSZ (20230327T023127Z) 年月日时分秒 |
hybridDdStr | yyyymmdd (20230327) 年月日 |
ktime | HmacSHA256(hybrid-date,ctyun-eop-sk) |
kAk | HmacSHA256(ctyun-eop-ak,ktime) |
kdate | HmacSHA256(hybridDdStr,kAk) |
步骤四 计算签名
由步骤二得到的待签名字符串forSignature和步骤三得到的最终动态密钥kdate生成签名信息signature
signature | HmacSHA256(forSignature,kdate),并将结果进行Base64编码得到最终签名结果 |
---|
范例
构建签名流程所需信息 | 信息描述 | 范例值 |
---|---|---|
调用接口及入参 | 通过部署的网关地址端口调用接口 | http://ip:port/v4/vpc/get-nat-gateway-attribute?regionID=资源池ID&natGatewayID=nat网关ID |
query | query请求参数 | regionID=资源池ID&natGatewayID=nat网关ID |
body | post请求参数 | null |
ctyun-eop-ak | ak | 470bbc5b-10f5-4d7f-bae6-2275046380b3 |
ctyun-eop-sk | sk | b20661e1-7448-405f-ad46-617631a2ea6e |
hybrid-date | 依据年月日T时分秒Z格式构造的日期信息 | 20230403T154057Z |
ctyun-hybrid-request-id | 随机字符串 | 0y13p5g41hwr |
campmocalHeader | 将需要参与签名的Header信息进行排序后的字符串 | ctyun-hybrid-request-id:0y13p5g41hwr\nhybrid-date:20230403T143447Z |
afterQuery | 完成排序后的query字符串 | natGatewayID=nat网关ID®ionID=资源池ID |
calculateContentHash | 将原封的body信息进行加密以及进制转换后的字符串 | null |
forSignature | 待签名字符串 | ctyun-hybrid-request-id:wc0d250x8zh\nhybrid-date:20230403T154247Z\nnatGatewayID=nat网关ID®ionID=资源池ID |
signature | 最终签名 | ejXRxfQRbpKRzDKd24QV55Bgih4j4iQJVVZdfBa6xLY= |
Hybrid-Authorization | 依据最终签名生成的请求头信息 | 470bbc5b-10f5-4d7f-bae6-2275046380b3 Header=hybrid-date;ctyun-hybrid-request-id Signature=ejXRxfQRbpKRzDKd24QV55Bgih4j4iQJVVZdfBa6xLY= |
请求头参数 | 值 |
---|---|
hybrid-date | 20230403T154057Z |
ctyun-hybrid-request-id | 0y13p5g41hwr |
Hybrid-Authorization | 470bbc5b-10f5-4d7f-bae6-2275046380b3 Header=hybrid-date;ctyun-hybrid-request-id Signature=ejXRxfQRbpKRzDKd24QV55Bgih4j4iQJVVZdfBa6xLY= |
完整curl信息如下:
--header 'hybrid-date: 20230403T154057Z'
--header 'ctyun-hybrid-request-id: 0y13p5g41hwr'
--header 'Hybrid-Authorization: 470bbc5b-10f5-4d7f-bae6-2275046380b3 Header=hybrid-date;ctyun-hybrid-request-id Signature=ejXRxfQRbpKRzDKd24QV55Bgih4j4iQJVVZdfBa6xLY='
{
"statusCode": 900,
"returnObj": {},
"errorCode": "auth.gateway.460",
"message": "",
"description": "生成签名与请求值不一致."
}
错误码定义
错误码 | 错误描述 |
---|---|
auth.gateway.450 | 请求未提供认证信息Hybrid-Authorization,认证失败. |
auth.gateway.451 | 请求未提供认证信息ctyun-hybrid-request-id,认证失败. |
auth.gateway.452 | 请求未提供认证信息hybrid-date,认证失败. |
auth.gateway.453 | 请求头Hybrid-Authorization、ctyun-hybrid-request-id和hybrid-date值不能为空. |
auth.gateway.454 | 签名时间戳已超过5分钟. |
auth.gateway.455 | hybrid-Authorization格式有误,签名参数不完整. |
auth.gateway.456 | 请求头缺少待签名HEADER. |
auth.gateway.457 | 待签名HEADER对应值不能为空. |
auth.gateway.458 | AccessKey不存在或未启用. |
auth.gateway.459 | 签名PATH未配置. |
auth.gateway.460 | 生成签名与请求值不一致. |
auth.gateway.461 | 服务调用异常,或不返回结果. |
auth.gateway.462 | 服务调用超时. |
auth.gateway.463 | 找不到此url,请检查您的配置. |
auth.gateway.464 | 找不到对应选择器,请检查您的配置. |
auth.gateway.465 | 找不到对应规则,请检查您的配置. |
auth.gateway.466 | 请求头字段过大 |
auth.gateway.467 | 请求实体过大. |
auth.gateway.468 | 找不到健康的上游url,请检查服务是否启动或者检查网关配置. |
auth.gateway.470 | 认证信息hybrid-date格式错误,认证失败. |
auth.gateway.500 | 服务内部错误 |
java 签名参考代码demo
Python 签名参考代码demo
Golang 签名参考代码demo