完善异常信息捕获、证书列表获取

This commit is contained in:
yihzhou 2022-11-28 10:17:52 +08:00
parent 99a7462fdf
commit 0f28395ce9
5 changed files with 130 additions and 186 deletions

View File

@ -107,6 +107,12 @@ public class SydApiException extends RuntimeException{
transMsg(); transMsg();
} }
public SydApiException(int retCode, Exception e) {
super("SydApiException(" + "code = "+String.format("%04x", retCode) + ")" , e);
this.retCode = retCode;
transMsg();
}
public SydApiException(String msg, int retCode){ public SydApiException(String msg, int retCode){
super("SydApiException(" + String.format(" %04X", retCode) + ":" + ( null == msg ? transMsg(retCode) : msg ) + ")" ); super("SydApiException(" + String.format(" %04X", retCode) + ":" + ( null == msg ? transMsg(retCode) : msg ) + ")" );

View File

@ -1310,7 +1310,7 @@ public class SydApi4j implements SydApi {
while (bb.limit() - bb.position() >= 128) { while (bb.limit() - bb.position() >= 128) {
byte[] cert = new byte[128]; byte[] cert = new byte[128];
bb.get(cert); bb.get(cert);
certs.add(new String(cert, "GBK")); certs.add(new String(cert, "GBK").trim());
} }
// r.put("certDNs",certs.toArray(new String[0]) ); // r.put("certDNs",certs.toArray(new String[0]) );
@ -1333,10 +1333,9 @@ public class SydApi4j implements SydApi {
PacketSN sn = PacketSN.gen(); PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array()); packet.put("header", sn.getSn().array());
data.put("dataFlag$option", dataFlag); data.put("dataFlag",Util.slenBytes(dataFlag,4));
String sqlite3 = "1 = 1 "; data.put("sqlite3", sqlite);
data.put("sqlite3", sqlite3);
// 渲染发送 // 渲染发送
ByteBuffer bb = proto.rend(packet); ByteBuffer bb = proto.rend(packet);
@ -1365,24 +1364,29 @@ public class SydApi4j implements SydApi {
RetWrap r = new RetWrap(); RetWrap r = new RetWrap();
PacketSection resDataFlag = (PacketSection) ret.get("dataFlag"); PacketSection resDataFlag = (PacketSection) ret.get("dataFlag");
r.put("dataFlag", (int) resDataFlag.getBytes()[0]);
PacketSection certAllNum = (PacketSection) ret.get("certAllNum"); PacketSection certAllNum = (PacketSection) ret.get("certAllNum");
r.put("certAllNum", (int) certAllNum.getBytes()[0]);
PacketSection realCertNum = (PacketSection) ret.get("realCertNum");
r.put("realCertNum", (int) realCertNum.getBytes()[0]);
PacketSection dataAttrFlag = (PacketSection) ret.get("dataAttrFlag"); PacketSection dataAttrFlag = (PacketSection) ret.get("dataAttrFlag");
r.put("dataAttrFlag", (int) dataAttrFlag.getBytes()[0]); PacketSection realCertNum = (PacketSection) ret.get("realCertNum");
try {
r.put("dataFlag",Util.smallLen(resDataFlag.getBytes()) );
r.put("certAllNum", Util.smallLen(certAllNum.getBytes()));
r.put("dataAttrFlag", Util.smallLen(dataAttrFlag.getBytes()));
r.put("realCertNum", Util.smallLen(realCertNum.getBytes()));
} catch (Exception e) {
e.printStackTrace();
}
r.put("certLenMax", Integer.parseInt(Util.bytes2HexString(Util.toArray(bb)).substring(60, 62), 16)); r.put("certLenMax", Integer.parseInt(Util.bytes2HexString(Util.toArray(bb)).substring(60, 62), 16));
List<String> certs = new ArrayList<String>(); List<String> certs = new ArrayList<String>();
while (bb.limit() - bb.position() >= 128) { while (bb.limit() - bb.position() >= 128) {
byte[] cert = new byte[128]; byte[] cert = new byte[128];
bb.get(cert); bb.get(cert);
certs.add(new String(cert, "GBK")); certs.add(new String(cert, "GBK").trim());
} }
r.put("certDNs", certs.toArray(new String[0])); // r.put("certDNs",certs.toArray(new String[0]) );
r.put("certDNlist", certs);
r.put("certDNs",certs);
return r; return r;
} }
@ -1760,7 +1764,7 @@ public class SydApi4j implements SydApi {
} }
socket.setSoTimeout(timeout); socket.setSoTimeout(timeout);
} catch (Exception e) { } catch (Exception e) {
socket = reConnect(new SydApiException(-2)); socket = reConnect(new SydApiException(-2, e));
} }

View File

@ -10,6 +10,8 @@ import org.junit.Test;
import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap; import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
@ -17,12 +19,30 @@ public class CertTest {
public static void main(String[] args) { public static void main(String[] args) {
System.setProperty("com.sunyard.sydapi4j.debug", "true"); //System.setProperty("com.sunyard.sydapi4j.debug", "true");
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.1.129", 8889, null, 1000); SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
try{ try{
String sql=" certtype in (0,2) "; //签名解密
String sql2=" certtype in (1,3) "; //验签加密
ArrayList<String> m_certs =new ArrayList<String>();
//查出证书总数一次次的拿出来
RetWrap allCert = api.getAllCert(0); RetWrap allCert = api.getAllCert(0);
printRetWrap(allCert); printRetWrap(allCert);
Integer allnum =(Integer) allCert.get("certAllNum");//总数
List<String> certs = (List<String>)allCert.get("certDNs");//部分证书列表
System.out.println(certs.toString());
m_certs.addAll(certs);
int loop = allnum%16;//循环次数
for (int i = 1; i < loop; i++) {
RetWrap partCert= api.getAllCert(16*i);
List<String> partcerts = (List<String>)partCert.get("certDNs");
m_certs.addAll(partcerts);
}
System.out.println("证书:"+m_certs);
System.out.println("aa"+m_certs.get(20));
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();

View File

@ -21,17 +21,18 @@ import java.util.List;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap; import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
public class Shanghairenhang { public class Shanghairenhang {
private static final byte[] orgData2k = new byte[ 100 ]; private static final byte[] orgData2k = new byte[ 1*1024 ];
private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"; private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException { public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException {
//System.setProperty("com.sunyard.sydapi4j.debug", "true"); // System.setProperty("com.sunyard.sydapi4j.debug", "true");
long startTime = System.currentTimeMillis(); //获取开始时间 long startTime = System.currentTimeMillis(); //获取开始时间
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApi4j api = (SydApi4j) builder.build(); SydApi4j api = (SydApi4j) builder.build();
try { try {
String orgData = "123456"; String orgData = "123456";
@ -41,7 +42,20 @@ public class Shanghairenhang {
* @param pcData: 明文数据 * @param pcData: 明文数据
* @return RetWrap: 数字信封 * @return RetWrap: 数字信封
*/ */
RetWrap signData = api.generateDEByDn(4,RSA, orgData2k);
// 获取加密证书
// String cert = api.getCertByDn(pcDnEN);
//
// System.out.println("cert=" + cert);
RetWrap status = api.getStatus();
String mem =(String) status.get("MEM");
String cpu =(String) status.get("CPU");
String disk =(String) status.get("DISK");
System.out.println(mem+cpu+disk);
RetWrap signData = api.generateDEByDn(pcDnEN, orgData.getBytes());
byte[] cpkey2 = (byte[]) signData.get("CipherKey"); byte[] cpkey2 = (byte[]) signData.get("CipherKey");
System.out.println("加密信封:" + new String(cpkey2)); System.out.println("加密信封:" + new String(cpkey2));
@ -51,14 +65,10 @@ public class Shanghairenhang {
* @param cpkey: 数字信封 * @param cpkey: 数字信封
* @return preData: 原数据 * @return preData: 原数据
*/ */
RetWrap oDataWrap = api.decryptDEByDN(4,RSA, cpkey2); RetWrap oDataWrap = api.decryptDEByDN(pcDnEN,cpkey2 );
byte[] preData = (byte[]) oDataWrap.get("oData"); byte[] preData = (byte[]) oDataWrap.get("oData");
System.out.println("解密信封:" + Util.bytes2HexString(preData)); System.out.println("解密信封:" + Util.bytes2HexString(preData));
//
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
@ -66,49 +76,20 @@ public class Shanghairenhang {
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间 System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
} }
// String [] certDNs =(String []) allCert.get("certDNs");
// System.out.println(certDNs);
} }
@Test @Test
public void testRenhang(){ public void testRenhang() throws UnsupportedEncodingException {
System.setProperty("com.sunyard.sydapi4j.debug", "true"); //System.setProperty("com.sunyard.sydapi4j.debug", "true");
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApi4j api = (SydApi4j) builder.build(); SydApi4j api = (SydApi4j) builder.build();
String attachedSign = api.attachedSign(2,orgData2k, RSA); // String attachedSign = api.attachedSign(2,orgData2k, RSA);
System.out.println(attachedSign); // System.out.println(attachedSign);
boolean attachedVerify = api.attachedVerify(2,attachedSign); // boolean attachedVerify = api.attachedVerify(2,attachedSign);
System.out.println(attachedVerify); // System.out.println(attachedVerify);
}
@Test
public void getCerts() throws UnsupportedEncodingException {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.1.129");
SydApi4j api = (SydApi4j) builder.build();
RetWrap allCert = api.getAllCert(0,"");
printRetWrap(allCert);
String[] certDNs =(String[]) allCert.get("certDNs");
ArrayList<String> certlist = new ArrayList<String>();
Collections.addAll(certlist, certDNs);
System.out.println("aaa:"+certDNs[0]);
byte[] bytes = api.SYD_NakedSign(orgData2k, pcDnEN);
System.out.println(Util.bytes2HexString(bytes));
} }
} }

View File

@ -26,112 +26,77 @@ public class ShangqingXingye {
private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001"; private static final String RSA = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException { public static void main(String[] args) throws UnsupportedEncodingException, CertificateException, NoSuchProviderException {
//System.setProperty("com.sunyard.sydapi4j.debug", "true"); System.setProperty("com.sunyard.sydapi4j.debug", "true");
long startTime = System.currentTimeMillis(); //获取开始时间 long startTime = System.currentTimeMillis(); //获取开始时间
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200"); SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.200");
SydApi4j api = (SydApi4j) builder.build(); SydApi4j api = (SydApi4j) builder.build();
try { try {
String orgData = "123456"; String orgData = "123456";
// String signData = null;
// String certByDn = api.getCertByDn(RSA);
// System.out.println(certByDn);
// boolean signedBySM2Cert = CertUtil.isSM2Cert(certByDn);
// System.out.println(signedBySM2Cert);
// signData= api.attachedSign(2,orgData.getBytes(),RSA);
// System.out.println("加签"+signData);
// RetWrap ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(signData);
// String cert =(String)ret.get("cert");
// //
// /**
// String cert_begin = "-----BEGIN CERTIFICATE-----\n"; * 产生对称密钥通过公钥加密生成数字信封
// String end_cert = "\n-----END CERTIFICATE-----"; * @param pcDnEN: 清算所的公钥证书
// String pemCert = cert_begin + cert + end_cert; * @param pcData: 明文数据
// System.out.println(pemCert); * @return RetWrap: 数字信封
// boolean signedBySM2Cert1 = CertUtil.isSM2Cert(pemCert); */
// System.out.println(signedBySM2Cert1); RetWrap signData = api.generateDEByDn(pcDnEN, orgData2k);
// byte[] cpkey2 = (byte[]) signData.get("CipherKey");
// boolean signedBySM2Cert2 = CertUtil.isSignedBySM2Cert(signData); System.out.println("加密信封:" + new String(cpkey2));
// System.out.println(signedBySM2Cert2);
RetWrap retWrap = api.countHash(2,1, orgData.getBytes(),null);
// byte[] hashData = (byte[]) retWrap.get("hash");
byte[] filterData = (byte[]) retWrap.get("filterData");
System.out.println("过渡数据:"+Util.bytes2HexString(filterData));
RetWrap retWrap2 = api.countHash(2,3, orgData.getBytes(),filterData);
//byte[] filterData2 = (byte[]) retWrap2.get("filterData");
byte[] finalhash = (byte[]) retWrap2.get("hash");
//System.out.println("中间数据:"+Util.bytes2HexString(filterData2));
System.out.println("最终数据:"+Util.bytes2HexString(finalhash));
/**
* 接收用私钥解密数字信封还原原文
* @param pcDnEN: 清算所的公钥证书
* @param cpkey: 数字信封
* @return preData: 原数据
*/
RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2);
byte[] preData = (byte[]) oDataWrap.get("oData");
System.out.println("解密信封:" + Util.bytes2HexString(preData));
// //
// /** // /**
// * 产生对称密钥通过公钥加密生成数字信封 // * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名遵循PKCS#7
// * @param pcDnEN: 清算所的公钥证书 // * @param orgData: 待签名的原始数据
// * @param pcData: 明文数据 // * @param pcDnEN: 签名者证书 DN
// * @return RetWrap: 数字信封 // * @return signsData: 签名数据
// */ // */
// RetWrap signData = api.generateDEByDn(pcDnEN, orgData2k); String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN);
// byte[] cpkey2 = (byte[]) signData.get("CipherKey"); System.out.println("签名数据:" + signsData);
// System.out.println("加密信封:" + new String(cpkey2));
// /**
// /** * 利用清算所的公钥证书对签名数据进行验签
// * 接收用私钥解密数字信封还原原文 * @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1)
// * @param pcDnEN: 清算所的公钥证书 * @param orgData: 待签名的原始数据
// * @param cpkey: 数字信封 * @param sign: 签名数据
// * @return preData: 原数据 */
// */ boolean result = api.detachedVerify(1, orgData2k, signsData);
// RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2); System.out.println("验签结果:" + result);
// byte[] preData = (byte[]) oDataWrap.get("oData");
// System.out.println("解密信封:" + Util.bytes2HexString(preData));
// /**
//// * 产生对称密钥通过清算所公钥证书加密生成数字信封
//// /** * 利用会员的私钥证书对数据进行签名
//// * 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名遵循PKCS#7 * 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
//// * @param orgData: 待签名的原始数据 * @param pcDnEN: 清算所的公钥证书
//// * @param pcDnEN: 签名者证书 DN * @param pcDnSign会员的私钥证书
//// * @return signsData: 签名数据 * @param pcData: 明文数据
//// */ * @return pcSignData: 签名数字信封
//// String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN); */
//// System.out.println("签名数据:" + signsData); String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k);
//// System.out.println("签名数字信封:" + pcSignData);
//// /**
//// * 利用清算所的公钥证书对签名数据进行验签 /**
//// * @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1) * 利用清算所公钥证书对签名数据进行验签接收用会员的私钥证书解密数字信封还原原文
//// * @param orgData: 待签名的原始数据 * 上清所 byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData );
//// * @param sign: 签名数据 * @param pcDnDe: 会员的私钥证书
//// */ * @param pcDnVerify: 清算所公钥证书
//// boolean result = api.detachedVerify(1, orgData2k, signsData); * @param pcSignData: 签名数字信封数据
//// System.out.println("验签结果:" + result); * @return pcData原数据
//// */
//
// /** byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData);
// * 产生对称密钥通过清算所公钥证书加密生成数字信封 System.out.println("原数据:" + Util.bytes2HexString(oData));
// * 利用会员的私钥证书对数据进行签名
// * 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
// * @param pcDnEN: 清算所的公钥证书
// * @param pcDnSign会员的私钥证书
// * @param pcData: 明文数据
// * @return pcSignData: 签名数字信封
// */
// String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k);
// System.out.println("签名数字信封:" + pcSignData);
//
// /**
// * 利用清算所公钥证书对签名数据进行验签接收用会员的私钥证书解密数字信封还原原文
// * 上清所 byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData );
// * @param pcDnDe: 会员的私钥证书
// * @param pcDnVerify: 清算所公钥证书
// * @param pcSignData: 签名数字信封数据
// * @return pcData原数据
// */
//
// byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData);
// System.out.println("原数据:" + Util.bytes2HexString(oData));
} catch (Exception e) { } catch (Exception e) {
@ -141,38 +106,6 @@ public class ShangqingXingye {
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间 System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
} }
RetWrap allCert = api.getAllCert(0);
printRetWrap(allCert);
String[] certDNs =(String[]) allCert.get("certDNs");
System.out.println(certDNs[1]);
ArrayList<String> certlist = new ArrayList<String>();
Collections.addAll(certlist, certDNs);
System.out.println("1111"+certlist.get(2));
String certByDn = api.getCertByDn(RSA);
System.out.println(certByDn);
X509 certInfo = api.GetX509CertInfo(certByDn);
System.out.println(certInfo.getSubject());
boolean sm2Cert = CertUtil.isSM2Cert(certByDn);
System.out.println(sm2Cert);
// String [] certDNs =(String []) allCert.get("certDNs");
// System.out.println(certDNs);
} }
} }