增加证书删除指令

This commit is contained in:
yihzhou 2024-04-11 15:29:30 +08:00
parent 9c2cdb5214
commit f05c04f957
7 changed files with 252 additions and 4 deletions

64
DProto/8011.xml Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" ?>
<packet extend="base">
<req>
<command>
<bin>8011</bin>
</command>
<data extend="data">
<certDn cn="证书dn">
</certDn>
</data>
</req>
<res>
<command>
<bin>8012</bin>
</command>
<data>
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
<options>
<option cn="无错误">
<hex>00</hex>
</option>
<option cn="公钥不符合编码规则">
<hex>04</hex>
</option>
<option cn="无效的加密标识">
<hex>06</hex>
</option>
<option cn="无效的附加模式标识">
<hex>07</hex>
</option>
<option cn="密钥奇偶校验错误">
<hex>10</hex>
</option>
<option cn="LMK 错误">
LMK 错误;报告给管理员。
<hex>13</hex>
</option>
<option cn="输入数据错">
<hex>15</hex>
</option>
<option cn="DSP 错误">
DSP 错误;报告给管理员。
<hex>47</hex>
</option>
<option cn="私钥错误">
私钥错误;报告给管理员。
<hex>49</hex>
</option>
<option cn="密钥块长度错误">
<hex>76</hex>
</option>
<option cn="输入数据长度错误">
<hex>80</hex>
</option>
</options>
</error>
</data>
</res>
<script> </script>
</packet>

View File

@ -1,5 +1,7 @@
package com.sunyard.inf; package com.sunyard.inf;
import com.sunyard.SydApiException;
/** /**
* 不经过 CA 授信 * 不经过 CA 授信
* 直接使用公私钥对签名验签 * 直接使用公私钥对签名验签
@ -92,6 +94,27 @@ interface SydNakedSVApi {
byte[] sign, byte[] sign,
String sCertDN String sCertDN
); );
/**
* 使用指定的证书 DN对指定的原始数据编制裸验签遵循PKCS#1 安徽农信定制接口
* @param cert 上传证书
* @param rFlag 摘要算法 1DIGEST_ALGO_MD5 M
* * 2DIGEST_ALGO_SHA1 S
* * 3DIGEST_ALGO_SHA256 R
* 4-SM2 国密证书SM3算法
* * S代表RSA-SHA1进行签名如果为R代表RSA-SHA256进行签名如果为M代表RSA-MD5进行签名
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerifyAll4NX (
String cert,
int rFlag,
byte[] orgData,
byte[] sign,
String sCertDN
) ;
} }

View File

@ -522,6 +522,25 @@ public class SydApi4j implements SydApi {
} }
public boolean SYD_NakedVerifyAll4NX(String cert,int rFlag,byte[] orgData,byte[] sign, String sCertDN){
boolean verify = false;
try {
//先导入证书
importCert(cert.getBytes(),null);
if( rFlag == 4 ){//SM2 国密算法
verify = SYD_NakedVerify(orgData,sign,sCertDN);
}else {
verify = SYD_NakedVerify(rFlag,orgData,sign,sCertDN);
}
//删除导入的证书
deleteCert(sCertDN);
return verify;
} catch ( SydApiException e) {
throw e;
}
}
public byte[] SYD_NakedSign(byte[] orgData, String sCertDN) { public byte[] SYD_NakedSign(byte[] orgData, String sCertDN) {
if (orgData == null) { if (orgData == null) {
throw new IllegalArgumentException("输入数据为 null"); throw new IllegalArgumentException("输入数据为 null");
@ -812,14 +831,14 @@ public class SydApi4j implements SydApi {
) { ) {
throw new SydApiException("包序号不匹配", -4); throw new SydApiException("包序号不匹配", -4);
} }
ret = (Map<String, Object>) ret.get("data"); ret = (Map<String, Object>) ret.get("data");
PacketSection error = (PacketSection) ret.get("error"); PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes(); byte[] be = error.getBytes();
if ((0 != (be[0] ^ be[1]))) { if ((0 != (be[0] ^ be[1]))) {
SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); throw new SydApiException(error.getInfo(), error.autoInt());
println("验签失败=" + e.toString());
return false;
} }
return true; return true;
} }
@ -1749,7 +1768,47 @@ public class SydApi4j implements SydApi {
@Override @Override
public boolean deleteCert(String dn) { public boolean deleteCert(String dn) {
return false; Proto8011 proto = new Proto8011();
// 填充数据
HashMap<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("certDn", dn);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
Packet p = proto.parse(bb, packet);
Map<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) ret.get("data");
PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes();
if ((be[0] ^ be[1]) != 0) {
SydApiException e = new SydApiException(error.getInfo(), error.autoInt());
println("删除失败=" + e.toString());
return false;
} else {
return true;
}
} }
// 测试通过 // 测试通过

View File

@ -118,6 +118,10 @@ public class Sample4ZS {
// List<String> allCert = api.getAllCert(); // List<String> allCert = api.getAllCert();
// System.out.println(allCert); // System.out.println(allCert);
api.GetX509CertInfo("MIICxjCCAmqgAwIBAgIFIGZACVcwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTIzMDYwNjA5MDIzNFoXDTI1MDYwNjE1NTk1OVowfDELMAkGA1UEBhMCY24xFTATBgNVBAoMDENGQ0EgVEVTVCBDQTEOMAwGA1UECwwFQ05BUFMxFDASBgNVBAsMC0VudGVycHJpc2VzMTAwLgYDVQQDDCcwNDFAWjMxMzIwNTA1NzgzMEAzMTMyMDUwNTc4MzBAMDAwMDAwMDgwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQzwB2NYu5u0YaSEpnH4rsDh1OOhiHD");
} }

View File

@ -2,6 +2,7 @@ package sample;
import com.sunyard.SydApi; import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;

View File

@ -1,6 +1,7 @@
package sample; package sample;
import cn.hutool.core.codec.Base64; import cn.hutool.core.codec.Base64;
import com.sunyard.RetWrap;
import com.sunyard.SydApi; import com.sunyard.SydApi;
import com.sunyard.SydApiException; import com.sunyard.SydApiException;
import com.sunyard.cert.X509; import com.sunyard.cert.X509;
@ -201,5 +202,49 @@ public class Test4Nongxin {
}
@Test
public void test(){
System.setProperty("com.sunyard.sydapi4j.debug", "true");
//设置连接
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.156");
SydApi4j api = (SydApi4j) builder.build();
String cert = "-----BEGIN CERTIFICATE-----\n" +
"MIIDcTCCAlmgAwIBAgIFEEcHQmgwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UEBhMC\n" +
"Q04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhv\n" +
"cml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTEwHhcNMjExMjEwMDgyOTA0WhcN\n" +
"MjYxMjEwMDgyOTA0WjBoMQswCQYDVQQGEwJDTjESMBAGA1UEChMJQ0ZDQSBPQ0Ex\n" +
"MQ8wDQYDVQQLEwZUUEMtUzMxGTAXBgNVBAsTEE9yZ2FuaXphdGlvbmFsLTExGTAX\n" +
"BgNVBAMTEEFSQ1U1MjkxMDAwMDA3MDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ\n" +
"AoGBAL+kPIjcWzRwQE6Q3ydtQsDaJGMxv0At2WrIQqb9ONEvqMbQZCd69qfBvsRj\n" +
"QI/UlG3btk6P/ZBGkNc99fX43VMqPtIlVjgRozLQcQJPFbiU5cT5PPqnrxo652RU\n" +
"KNFQhwmanPjAjmZd9woc2l0BnfF92QFDPDRprS1fWLFbKPTvAgMBAAGjgbUwgbIw\n" +
"HwYDVR0jBBgwFoAUz3CdYeudfC6498sCQPcJnf4zdIAwOQYDVR0fBDIwMDAuoCyg\n" +
"KoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vUlNBL2NybDgzMjA1LmNybDALBgNV\n" +
"HQ8EBAMCA+gwHQYDVR0OBBYEFGey5r5CdOUDaW3KRdZ0xg19n+dhMCgGA1UdJQQh\n" +
"MB8GCCsGAQUFBwMCBggrBgEFBQcDBAYJKoZIhvcvAQEFMA0GCSqGSIb3DQEBBQUA\n" +
"A4IBAQChyjTNJUkdspDa/6sPYuZdE0/yPFcbd0ag4wLWrSCiRyV0J5BhJPIApdRT\n" +
"3kCIem2jRbq3H/W1vUYi1JeGHcrvTOOMQb9yfgCzfQLvAdv0at4zupy1uXL6uE1S\n" +
"WL1v6Vub630tJ0A45KsVESB5Fb+UZ/cvdJIMHjcYYzPw+HHH6q9e3R0QUMz3Mxpl\n" +
"DCg66HQBL/jKSl/w13QTdRPL9dSDBtpzDqZH5JQK4rbZSdFnbC2TQs+ljsKd5TCg\n" +
"52HcC92peeCXCEsb3Zw0js5nTbX+1da8FgqDQTeKIItgXBvQIRJUeelKga6opRNM\n" +
"QM0Egoc/dBdM45jVnxzpreRKzsDQ\n" +
"-----END CERTIFICATE-----";
String odata = "<?xml version=\"1.0\" encoding=\"utf-8\"?><SignData><TradeType name=\"银行账号转账\" authLevel=\"0\">BankAcctTransfer</TradeType><Timestamp>1710469760912</Timestamp><Fields><AcctType>INNERDEBIT</AcctType><PayerSubAcSeq></PayerSubAcSeq><PayerBankAcType>96</PayerBankAcType><PayerAcNo>6229539600100010640</PayerAcNo><PayerAcName>王二类</PayerAcName><PayerCurrency>156</PayerCurrency><PayeeAcNo name=\"收款人账号:\">6217788308301020599</PayeeAcNo><PayeeAcName name=\"收款人名称:\">王二类</PayeeAcName><Amount name=\"转账金额:\">1</Amount><PayeeBankCode>402/402361018886</PayeeBankCode><PayeeBankName>安徽农金</PayeeBankName><ProvinceCode></ProvinceCode><ProvinceName></ProvinceName><CityCode></CityCode><CityName></CityName><UnionDeptId></UnionDeptId><UnionDeptName></UnionDeptName><TransType>0</TransType><Remark></Remark><Fee>0.00</Fee><CRFlag>1</CRFlag><TransTypeFlag>0</TransTypeFlag><TrsRouteType>0</TrsRouteType><AddPayeeBookFlag>1</AddPayeeBookFlag></Fields></SignData>";
String signRsa = "0564FC7C0E3FDAF225295BBD0E32BF16081D561B4C262B5E095E04E828DC8AAC71723F849B615A41AA012FB9B532017D382919A498A93EAD35CB3AA80BA29510C174BF61B6E5DCEA78DF9AF7C3B80513BA82F82030347F463C03826C90CC9C207012BD456C21D9DF4E2C79EE042B8BE229EA3C40F232AF661BE63E61A07DC2A3";
try {
String rsaDn = "C=CN,O=CFCA OCA1,OU=TPC-S3,OU=Organizational-1,CN=ARCU529100000701";
boolean nakedVerify2 = api.SYD_NakedVerifyAll4NX(cert,2,odata.getBytes(),Util.hexString2Bytes(signRsa),rsaDn);
System.out.println("RSA数据验签"+nakedVerify2 );
} catch (SydApiException e) {
e.printStackTrace();
}
} }
} }

View File

@ -0,0 +1,52 @@
package sample;
import com.sunyard.SydApiException;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
public class sample4nx {
public static void main(String[] args) {
//打印调试日志
System.setProperty("com.sunyard.sydapi4j.debug", "true");
//设置连接
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.156");
SydApi4j api = (SydApi4j) builder.build();
String cert = "-----BEGIN CERTIFICATE-----\n" +
"MIIDcTCCAlmgAwIBAgIFEEcHQmgwDQYJKoZIhvcNAQEFBQAwWDELMAkGA1UEBhMC\n" +
"Q04xMDAuBgNVBAoTJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhv\n" +
"cml0eTEXMBUGA1UEAxMOQ0ZDQSBURVNUIE9DQTEwHhcNMjExMjEwMDgyOTA0WhcN\n" +
"MjYxMjEwMDgyOTA0WjBoMQswCQYDVQQGEwJDTjESMBAGA1UEChMJQ0ZDQSBPQ0Ex\n" +
"MQ8wDQYDVQQLEwZUUEMtUzMxGTAXBgNVBAsTEE9yZ2FuaXphdGlvbmFsLTExGTAX\n" +
"BgNVBAMTEEFSQ1U1MjkxMDAwMDA3MDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ\n" +
"AoGBAL+kPIjcWzRwQE6Q3ydtQsDaJGMxv0At2WrIQqb9ONEvqMbQZCd69qfBvsRj\n" +
"QI/UlG3btk6P/ZBGkNc99fX43VMqPtIlVjgRozLQcQJPFbiU5cT5PPqnrxo652RU\n" +
"KNFQhwmanPjAjmZd9woc2l0BnfF92QFDPDRprS1fWLFbKPTvAgMBAAGjgbUwgbIw\n" +
"HwYDVR0jBBgwFoAUz3CdYeudfC6498sCQPcJnf4zdIAwOQYDVR0fBDIwMDAuoCyg\n" +
"KoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vUlNBL2NybDgzMjA1LmNybDALBgNV\n" +
"HQ8EBAMCA+gwHQYDVR0OBBYEFGey5r5CdOUDaW3KRdZ0xg19n+dhMCgGA1UdJQQh\n" +
"MB8GCCsGAQUFBwMCBggrBgEFBQcDBAYJKoZIhvcvAQEFMA0GCSqGSIb3DQEBBQUA\n" +
"A4IBAQChyjTNJUkdspDa/6sPYuZdE0/yPFcbd0ag4wLWrSCiRyV0J5BhJPIApdRT\n" +
"3kCIem2jRbq3H/W1vUYi1JeGHcrvTOOMQb9yfgCzfQLvAdv0at4zupy1uXL6uE1S\n" +
"WL1v6Vub630tJ0A45KsVESB5Fb+UZ/cvdJIMHjcYYzPw+HHH6q9e3R0QUMz3Mxpl\n" +
"DCg66HQBL/jKSl/w13QTdRPL9dSDBtpzDqZH5JQK4rbZSdFnbC2TQs+ljsKd5TCg\n" +
"52HcC92peeCXCEsb3Zw0js5nTbX+1da8FgqDQTeKIItgXBvQIRJUeelKga6opRNM\n" +
"QM0Egoc/dBdM45jVnxzpreRKzsDQ\n" +
"-----END CERTIFICATE-----";
String odata = "<?xml version=\"1.0\" encoding=\"utf-8\"?><SignData><TradeType name=\"银行账号转账\" authLevel=\"0\">BankAcctTransfer</TradeType><Timestamp>1710469760912</Timestamp><Fields><AcctType>INNERDEBIT</AcctType><PayerSubAcSeq></PayerSubAcSeq><PayerBankAcType>96</PayerBankAcType><PayerAcNo>6229539600100010640</PayerAcNo><PayerAcName>王二类</PayerAcName><PayerCurrency>156</PayerCurrency><PayeeAcNo name=\"收款人账号:\">6217788308301020599</PayeeAcNo><PayeeAcName name=\"收款人名称:\">王二类</PayeeAcName><Amount name=\"转账金额:\">1</Amount><PayeeBankCode>402/402361018886</PayeeBankCode><PayeeBankName>安徽农金</PayeeBankName><ProvinceCode></ProvinceCode><ProvinceName></ProvinceName><CityCode></CityCode><CityName></CityName><UnionDeptId></UnionDeptId><UnionDeptName></UnionDeptName><TransType>0</TransType><Remark></Remark><Fee>0.00</Fee><CRFlag>1</CRFlag><TransTypeFlag>0</TransTypeFlag><TrsRouteType>0</TrsRouteType><AddPayeeBookFlag>1</AddPayeeBookFlag></Fields></SignData>";
String signRsa = "0564FC7C0E3FDAF225295BBD0E32BF16081D561B4C262B5E095E04E828DC8AAC71723F849B615A41AA012FB9B532017D382919A498A93EAD35CB3AA80BA29510C174BF61B6E5DCEA78DF9AF7C3B80513BA82F82030347F463C03826C90CC9C207012BD456C21D9DF4E2C79EE042B8BE229EA3C40F232AF661BE63E61A07DC2A3";
try {
String rsaDn = "C=CN,O=CFCA OCA1,OU=TPC-S3,OU=Organizational-1,CN=ARCU529100000701";
boolean nakedVerify2 = api.SYD_NakedVerifyAll4NX(cert,2,odata.getBytes(), Util.hexString2Bytes(signRsa),rsaDn);
System.out.println("RSA数据验签"+nakedVerify2 );
} catch (SydApiException e) {
e.printStackTrace();
}
}
}