API的开放者创建签名密钥并绑定到某个API,绑定成功后,云API网关在请求您的后端服务时会根据绑定的签名密钥的Key和Secret增加签名验证信息,后端服务在本地也进行相应的签名计算,通过比较网关的签名信息来保障后端服务的调用安全。有关签名密钥生成方式,请参考验证签名密钥信息部分。API在绑定签名密钥策略之前需要完成发布操作,签名密钥和API相互独立,用户可以创建签名密钥策略,并将签名密钥绑定到不同的API的不同环境上。
创建签名密钥
步骤1:点击左侧【签名密钥】菜单进入签名密钥列表页,点击列表页面【创建签名密钥】,弹出创建签名密钥弹框。
步骤2:填写签名密钥名称、Key、Secret、再次输入Secret和描述,点击【确定】完成创建,点击【取消】完成取消创建签名密钥操作。
说明:
1.签名密钥地域默认为当前控制台所选资源池,签名密钥名称、Key、Secret、再次输入Secret为必填项,描述信息为选填项。
2.签名密钥的Key和Secret为一对密钥对,加密算法通过签名密钥的密钥对进行加密。
3.签名密钥的创建提供自动生成Secret操作,【自动生成Secret】按钮打开,用户无需手动输入Secret,系统自动随机生成32个字符的Secret。
签名密钥绑定API签名密钥和API本身是相互独立的,只有将签名密钥绑定API后,签名密钥才对绑定的API生效,且绑定成功后,立即生效。
步骤1:点击左侧【签名密钥】菜单进入签名密钥列表页,在待绑定的签名密钥所在行,单击“绑定API”,弹出绑定API弹框;签名密钥详情页面,单击【绑定API】按钮,弹出绑定API弹框。
步骤2:绑定API弹框,根据分组、环境、API名称筛选出符合条件的API,勾选API(可多选),单击“确定”,完成API绑定策略。
说明:
1.同一个API在一个环境中只能绑定一个签名密钥,一个签名密钥可以同时绑定给多个API。
2.若某API已经绑定了一个策略,仍然可以绑定签名密钥,原来的签名密钥将被覆盖,绑定成功后原来的策略立即失效,新的策略立即生效。
签名密钥解绑
API进入需要解绑的签名密钥的详情页面,详情页面的绑定的API列表中,选中需要解绑的API,点击【解绑】,二次确认后完成解绑操作,支持批量解绑API。
删除签名密钥当已创建的签名密钥不再提供服务时,可以将此签名密钥删除。
进入签名密钥列表页面,找到需要删除的策略,点击列表【删除】按钮,弹出二次弹框确认,完成签名密钥的删除操作。当该签名密钥存在已绑定的API时,提示“该密钥当前已被API绑定,请先解绑,再进行删除操作”,点击【立即前往】,跳转至签名密钥详情页面先完成解绑API操作,再进行策略删除。说明:
1.仅在签名密钥未绑定任何API时,支持删除,否则请先解绑API。
验证签名密钥
如果API绑定了签名密钥策略,网关在向该API发送请求时,会带上签名密钥信息,API后端服务接收到网关请求后时可对请求内容进行签名校验。
请求的header中的X-Apig-Proxy-Signature字段值是API网关计算的网关签名,API后端服务需根据请求信息重新计算sign值并与网关签名进行对比,签名相同则签名校验通过,不同则签名校验不通过。
签名计算方法如下:
获取header中的X-Apig-Proxy-Signature-Secret-Key的值,这个是API绑定的密钥的Key,可使用这个Key值获取API的Secret。调用sign帮助类SignHelperProxy.sign(String secret,String method,String path,Map<String, String> headers,Map<String, String> queries,String body)方法计算sign.
Jar包引入方式:SDK jar包:APIG-SIGN-SDK.zip
<dependency>
<groupId>com.chinamobile.apig</groupId>
<artifactId>apig-sign-sdk</artifactId>
<version>0.0.1</version>
<scope>system</scope>
<systemPath>path/apig-sign-sdk-0.0.1.jar</systemPath>
</dependency>
方法: public static String sign(String secret,String method,String path,Map<String, String> headers,Map<String, String> queries,String body)
参数说明:
参数名称 |
说明 |
secret |
签名密钥 |
method |
http请求方法(可选值GET,PUT, POST, DELETE) |
path |
请求路径(url去除http://ip:port/**/openapi后的部分) |
headers |
请求头, 参见APP认证调用API的请求Headers参数 |
queries |
请求参数 |
body |
请求体 |