# P7签名
用户对某数据进行P7签名操作
# 一、请求说明
- 请求地址:http://IP:PORT/openapi/ces/v1/sign/p7
- 服务接口名称(即公共参数method的值): sign/p7
- 请求方式:POST
# 二、请求参数
| 名称 | 类型 | 是否必须 | 描述 |
|---|---|---|---|
| signType | CertSearchEnum | 是 | 签名方式 (P7签名不支持密钥索引) |
| signItemValue | String | 是 | 签名方式的值 |
| data | String | 是 | 待签名数据 |
| dataType | DataType | 是 | 待签名数据格式 |
| signatureAlgorithm | SignatureAlgorithm | 否 | 签名算法:SM2证书签名算法为SM3withSM2,RSA默认为SHA256withRSA |
| signDataType | DataType | 否 | 签名后数据格式 (base64、hex) |
| attach | Boolean | 否 | 签名是否包含原文 true-包含原文 false-不包含原文;默认false |
注:当待签名数据格式为摘要base64或摘要hex时,注意摘要长度应与签名算法对应。具体算法的摘要长度见签名算法字段解释。
字段解释
CertSearchEnum 签名方式
| 类型字段 | 介绍 |
|---|---|
| CERT | 证书 |
| CERT_ID | 证书ID |
| SN_HEX | 证书序列号(十六进制格式) |
| SN_DEC | 证书序列号(十进制格式) |
| TN_HASH | 证书指纹 |
| CERT_CN | 证书持有者 |
| CERT_DN | 证书主题项 |
- DataType 数据类型介绍
生成摘要的摘要算法和接口中的签名算法保持一致。
| 字段 | 类型介绍 |
|---|---|
| BASE64 | 原文BASE64 |
| HEX | 原文Hex |
| ORIGINAL | 原文 |
| DIGEST_BASE64 | 摘要base64 |
| DIGEST_HEX | 摘要hex |
| ASN1_BASE64 | ASN.1格式BASE64 注:此类型为PKI3.4.5版本新增 SM2证书不支持 |
| ASN1_HEX | ASN.1格式HEX 注:此类型为PKI3.4.5版本新增 SM2证书不支持 |
- SignatureAlgorithm 签名算法介绍
| 字段 | 介绍 |
|---|---|
| SM3withSM2 | SM3withSM2签名算法(摘要长度应为32字节) |
| SHA1withRSA | SHA1withRSA签名算法(摘要长度应为20字节) |
| SHA256withRSA | SHA256withRSA签名算法(摘要长度应为32字节) |
| SHA512withRSA | SHA512withRSA签名算法(摘要长度应为64字节) |
# 三、响应参数
| data 结果信息 | 类型 | 描述 |
|---|---|---|
| signData | String | 签名结果 |
| verification | Integer | 验证信息状态码 |
| message | String | 验证提示信息 |
- verification 返回码介绍
| 字段 | 状态码 | 状态介绍 |
|---|---|---|
| SUCCESS | 0 | 验证成功 |
| CERT_NOT_EXIST | 8 | 证书不存在 |
# 四、成功示例
JSON示例
{
"code":0,
"message":"success",
"requestId":"xxx",
"data":{
"verification":0,
"message":"success",
"signData":"BMY18jZgCLgQ1Jp9rbmQbEo+Pj6vsd7L6+z......"
}
}
# 五、失败示例
JSON示例
{
"code":10024,
"requestId":"xxx",
"message":"App签名错误"
}
# 六、SDK请求示例
// 提供的URL
String url = "http://172.16.6.76:20501";
// 您的appKey
String appKey = "XXX";
// 您的appSecret
String appSecret = "XXX";
// 1.原客户端
PkiClient client = new PkiOkhttpClient(url, appKey, appSecret);
String data = "签名数据";
P7SignRequest request = new P7SignRequest();
//通过何种方式进行签名 CERT_ID:证书ID,KEY_INDEX:密钥索引, SN_HEX:证书序列号(十六进制格式),SN_DEC:证书序列号(十进制格式),TN_HASH:证书证书指纹,CERT_CN:证书CN ,CERT_DN:证书主题项(DN)
request.setSignType(CertSearchEnum.CERT_DN);
//签名项目的值
request.setSignItemValue("C=CN,UniqueIde......");
// 签名数据
request.setData(data);
//签名项目的值
request.setDataType(DataType.ORIGINAL);
// 签名算法:SM2证书签名算法为SM3withSM2,RSA默认为SHA256withRSA
request.setSignatureAlgorithm(SignatureAlgorithm.SHA1withRSA);
// 签名是否包含原文
request.setAttach(false);
// 签名后数据格式
request.setSignDataType(DataType.BASE64);
try {
P7SignResponse response = client.execute(request);
// 后续业务
if (response.isSuccess()) {
System.out.println("成功响应:" + response.getResult());
P7SignResponse.Result result = response.getResult();
System.out.println("签名结果: " + result.getSignData());
System.out.println("验证信息状态码: "+result.getVerification());
System.out.println("验证提示信息: "+result.getMessage());
} else {
System.out.println("失败响应:" + response.getBody());
}
} catch (ApiException e) {
e.printStackTrace();
}