签名

通过API请求保全网时,每一个请求的payload都要用RSA私钥进行签名,这样保全网也无法伪造您的数据。

第一步:注册保全网企业账号,在账户信息-基本设置中先完成企业实名认证。

_images/key_1.png

第二步:进入账户信息-密钥管理,新建秘钥(测试时使用测试密钥,正式上线后转为生产密钥)。

_images/key_2.png

第三步:上传RSA公钥,上传成功后的结果如下:

_images/key_3.png

可以参考如下shell命令制作自己的证书,openssl版本要求>=1.0.2:

openssl req -x509 -newkey rsa:1024 -nodes -keyout key.pem -out cert.pem

将cert.pem中的内容粘贴到文本框中,然后选择是沙盒还是正式。 在正式环境下编辑好的模板可以在沙盒环境下使用,但沙盒环境下的数据会被定期清除。所以在您的开发环境和测试环境下请使用沙盒的access key,在生产环境使用正式的access key。

注解

请保管好自己的私钥,另外强烈推荐在正式环境下使用CA机构签发的证书作为公钥。

假定待签名数据为:

{
        "request_id": "2XiTgZ2oVrBgGqKQ1ruCKh",
        "access_key": "2y7cg8kmoGDrDBXJLaizoD",
        "tonce": 1464594744,
        "payload": {
                "template_id": "2hSWTZ4oqVEJKAmK2RiyT4",
        }
}

签名过程用Java代码描述如下:

// RSA私钥文件路径
String keyFile = "/path/to/rsa_key.pem";

// 请求数据
String requestId = "2XiTgZ2oVrBgGqKQ1ruCKh";
String accessKey = "2y7cg8kmoGDrDBXJLaizoD";
String tonce = 1464594744;
String payload = "{\"template_id\": \"2hSWTZ4oqVEJKAmK2RiyT4\"}";

// API path
String apiVersion = "v2";
String apiName = "attestations";
String path = String.format("/api/%s/%s", apiVersion, apiName);

// 待签名数据 = 请求方法+API路径+requestId+accessKey+tonce+payload
String data = "".concat("POST").concat(path).concat(requestId).concat(accessKey).concat(tonce).concat(payload);

// 构造签名
PEMReader pemReader = new PEMReader(new InputStreamReader(new FileInputStream(keyFile)));
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(pemReader.readPemObject().getContent());
pemReader.close();
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("SHA256WithRSA");
signature.initSign(privateKey);
signature.update(data.getBytes("UTF-8"));

// 签名使用Base64编码后得到的值即为请求数据中signature字段的值
String signatureEncoded = Base64.getEncoder().encodeToString(signature.sign());

注解

签名所用的方法是SHA256WithRSA,签名数据字符串转换成bytes时要用UTF-8编码格式