diff --git a/pom.xml b/pom.xml index b1306fa..0a0ef4c 100644 --- a/pom.xml +++ b/pom.xml @@ -108,8 +108,8 @@ - - + + diff --git a/src/main/java/com/jmeter/test/Test4Jemter.java b/src/main/java/com/jmeter/test/Test4Jemter.java index 805450a..a03024a 100644 --- a/src/main/java/com/jmeter/test/Test4Jemter.java +++ b/src/main/java/com/jmeter/test/Test4Jemter.java @@ -2,19 +2,18 @@ package com.jmeter.test; import com.google.gson.Gson; import com.sunyard.SydApiException; +import com.sunyard.entity.ImportResult; import com.sunyard.proto.Util; +import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import racal.sunyard.main.SydApi4j; -import racal.sunyard.main.SydApiBuilder; +import java.io.StringWriter; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class Test4Jemter extends AbstractJavaSamplerClient { @@ -37,6 +36,17 @@ public class Test4Jemter extends AbstractJavaSamplerClient { private int dataLength; + private String cert; + private String nodes; + private String snmpIP; + private String snmpPort; + private String snmpOID; + private String snmpCommunity; + + private int timeout; + + private int logSwitch; + /** * 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数 @@ -50,12 +60,21 @@ public class Test4Jemter extends AbstractJavaSamplerClient { arguments.addArgument("orgData", "12345678"); arguments.addArgument("ip", "172.1.41.139"); arguments.addArgument("ip2", "172.1.41.96"); - arguments.addArgument("port", "8891"); + arguments.addArgument("port", "8889"); + arguments.addArgument("timeout", "2000"); + arguments.addArgument("logSwitch", "1"); // arguments.addArgument("ip2", "172.16.17.161"); arguments.addArgument("dataLength", "1024"); arguments.addArgument("type", "1"); arguments.addArgument("sign", "12345678"); arguments.addArgument("detachedSign", "12345678"); + arguments.addArgument("cert", ""); + arguments.addArgument("nodes", "172.1.41.139:8889;172.1.41.96:8889"); + arguments.addArgument("snmpIP", "172.1.41.139"); + arguments.addArgument("snmpPort", "162"); + arguments.addArgument("snmpOID", "1.3.6.1.4.1.9999"); + arguments.addArgument("snmpCommunity", "public"); + return arguments; } @@ -71,12 +90,21 @@ public class Test4Jemter extends AbstractJavaSamplerClient { oData = context.getParameter("orgData"); ip = context.getParameter("ip"); ip2 = context.getParameter("ip2"); - port = context.getIntParameter("8891"); + port = context.getIntParameter("port"); + timeout = context.getIntParameter("timeout"); + logSwitch = context.getIntParameter("logSwitch"); // ip2 = context.getParameter("ip2"); dataLength = context.getIntParameter("dataLength"); type = context.getIntParameter("type"); sign = context.getParameter("sign"); detachedSign = context.getParameter("detachedSign"); + cert = context.getParameter("cert"); + nodes = context.getParameter("nodes"); + snmpIP = context.getParameter("snmpIP"); + snmpPort = context.getParameter("snmpPort"); + snmpOID = context.getParameter("snmpOID"); + snmpCommunity = context.getParameter("snmpCommunity"); + System.getProperty("com.sunyard.sydapi4j.debug", "false"); System.setProperty("com.sunyard.dnsort", "false"); api = new ThreadLocal() { @Override @@ -84,7 +112,7 @@ public class Test4Jemter extends AbstractJavaSamplerClient { // // SydApiBuilder builder = new SydApiBuilder().setIp(ip); // final SydApi4j api = (SydApi4j) builder.build(); - SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, 2000); + SydApi4j.SYD_Set_Parameter_HA(ip, ip2, port, timeout); final SydApi4j api1 = (SydApi4j) new SydApi4j(); return api1; } @@ -105,13 +133,17 @@ public class Test4Jemter extends AbstractJavaSamplerClient { //设置开始标志,否则无法统计tps等 sr.sampleStart(); try { -// orgData = oData.getBytes(); //SM2裸签 - orgData = new byte[dataLength]; + orgData = oData.getBytes(); //SM2裸签 +// orgData = new byte[dataLength]; //执行业务逻辑 switch(type){ case 1: // api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null); - api.get().SYD_NakedSign(orgData,SM2dn); + byte[] nakedSign = api.get().SYD_NakedSign(orgData,SM2dn); + if (logSwitch == 1) { + System.out.println("p1签名(hex):"+ Util.bytes2HexString(nakedSign)); + } + sr.setResponseCodeOK(); //sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName()); break; @@ -119,7 +151,10 @@ public class Test4Jemter extends AbstractJavaSamplerClient { case 2: // api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ; - api.get().SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn); + boolean flag = api.get().SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), SM2dn); + if (logSwitch == 1) { + System.out.println("p1验签:"+ flag); + } sr.setResponseCodeOK(); //sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName()); break; @@ -140,7 +175,10 @@ public class Test4Jemter extends AbstractJavaSamplerClient { case 5: // api.get().detachedSign(1, orgData, SM2dn); //p7 detached签名 - api.get().detachedSign(orgData, SM2dn); + String detachedSign1 = api.get().detachedSign(orgData, SM2dn); + if (logSwitch == 1) { + System.out.println("p7 detach签名:"+ detachedSign1); + } sr.setResponseCodeOK(); //sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName()); break; @@ -148,7 +186,10 @@ public class Test4Jemter extends AbstractJavaSamplerClient { case 6: // api.get().detachedVerify(1, orgData, sign); //p7 detached验签 - api.get().detachedVerify(orgData, detachedSign); + boolean ver = api.get().detachedVerify(orgData, detachedSign); + if (logSwitch == 1) { + System.out.println("p7 detach验签:"+ ver); + } sr.setResponseCodeOK(); //sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName()); break; @@ -219,6 +260,8 @@ public class Test4Jemter extends AbstractJavaSamplerClient { break; case 17: + String cert1 = api.get().getCertBySign(detachedSign); + System.out.println("根据p7签名值获取的证书为:" + cert1); sr.setResponseCodeOK(); break; case 18: @@ -229,6 +272,9 @@ public class Test4Jemter extends AbstractJavaSamplerClient { testImportCert(); sr.setResponseCodeOK(); break; + case 20: + boolean delFlag = api.get().deleteCert(SM2dn); + System.out.println("删除证书成功:"+ delFlag); default: sr.setResponseCodeOK(); sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName()); @@ -263,33 +309,35 @@ public class Test4Jemter extends AbstractJavaSamplerClient { // testImportCert(); } - private void testImportCert() { - String cert = "-----BEGIN CERTIFICATE-----\n" + - "MIICMDCCAdagAwIBAgIJAOWoGwJCnjlLMAoGCCqBHM9VAYN1MGcxCzAJBgNVBAYT\n" + - "AkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdIYWlEaWFuMRMwEQYDVQQK\n" + - "DApHTUNlcnQub3JnMR8wHQYDVQQDDBZHTUNlcnQgR00gUm9vdCBDQSAtIDAxMB4X\n" + - "DTI1MDUxMzAyMzUxM1oXDTI2MDUxMzAyMzUxM1owRTELMAkGA1UEBgwCQ04xCzAJ\n" + - "BgNVBAgMAnp6MQswCQYDVQQHDAJ6ejEMMAoGA1UECgwDenp6MQ4wDAYDVQQDDAV6\n" + - "enp6ejBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABK5fyRSACWPIBBr/3U+qvjvp\n" + - "niropv2PrA3ZLU1bG8vQpwAEMA0kwyqGgXURBPbvWdAhN7s9wfvHbJyMd9CMZGqj\n" + - "gYwwgYkwDAYDVR0TAQH/BAIwADALBgNVHQ8EBAMCB4AwLAYJYIZIAYb4QgENBB8W\n" + - "HUdNQ2VydC5vcmcgU2lnbmVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBSQB7UUqEuG\n" + - "kl4mrx3MAhKTptfbYjAfBgNVHSMEGDAWgBR/Wl47AIRZKg+YvqEObzmVQxBNBzAK\n" + - "BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" + - "KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" + - "-----END CERTIFICATE-----"; - List masterNodes = new ArrayList<>(); - masterNodes.add("172.1.41.139:8889"); - int timeout = 1000; + private void testImportCert(){ + List masterNodes = Arrays.asList(StringUtils.split(nodes, ";")); Map map = new HashMap<>(); - map.put("snmp.target.ip", "172.1.41.191"); - map.put("snmp.target.port", "162"); - map.put("enterprise.oid", "1.3.6.1.4.1.9999"); - map.put("snmp.community", "public"); + map.put("snmp.target.ip", snmpIP); + map.put("snmp.target.port", snmpPort); + map.put("enterprise.oid", snmpOID); + map.put("snmp.community", snmpCommunity); map.put("snmp.version", "1"); - String snmpConfig = new Gson().toJson(map); + Gson gson = new Gson(); + String snmpConfig = gson.toJson(map); SydApi4j sydApi4j = new SydApi4j(); - sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig); + String cert21 = convertToPem(Base64.getDecoder().decode(cert)); + ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert21, "12345678", snmpConfig); + System.out.println("证书导入结果:" + gson.toJson(importResult)); + } + + private String convertToPem(byte[] derCert){ + // 使用Base64编码器(兼容RFC 4648,每行64字符) + StringWriter writer = new StringWriter(); + writer.write("-----BEGIN CERTIFICATE-----\n"); + // 将DER转换为Base64并分割为每行64字符 + String base64Cert = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(derCert); + writer.write(base64Cert); + // 如果Base64编码的字符串没有以换行结束,则添加换行 + if (!base64Cert.endsWith("\n")) { + writer.write("\n"); + } + writer.write("-----END CERTIFICATE-----\n"); + return writer.toString(); } /** diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java index 07d2994..9e106af 100644 --- a/src/main/java/racal/sunyard/main/SydApi4j.java +++ b/src/main/java/racal/sunyard/main/SydApi4j.java @@ -59,6 +59,7 @@ import java.time.Duration; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; @@ -85,7 +86,10 @@ public class SydApi4j implements SydApi { private static int ha_port; private static int ha_timeout; - private final AtomicBoolean usingBackup = new AtomicBoolean(false); + private static final AtomicBoolean usingBackup = new AtomicBoolean(false); + + //连接数计数器 + private static final AtomicInteger connectionCounter = new AtomicInteger(0); private final Object reqLock = new Object(); @@ -879,6 +883,7 @@ public class SydApi4j implements SydApi { if ((be[0] ^ be[1]) != 0) { SydApiException e = new SydApiException(error.getInfo(), error.autoInt()); println("验签失败=" + e.toString()); + log.info("验签失败:{}", e.toString()); return false; } else { return true; @@ -1391,6 +1396,7 @@ public class SydApi4j implements SydApi { stringBuilder.append("行号:").append(bkCode).append("\n").append("DN:").append(dn) .append("\n序列号:").append(serialNumber).append("\n证书:").append(cert); log.warn("证书导入失败!\n{}", stringBuilder); + System.out.println("证书导入失败!" + stringBuilder); //异步发送snmp trap消息 String result = "[" + failures.stream() .map(Object::toString) @@ -2372,6 +2378,7 @@ public class SydApi4j implements SydApi { if (!usingBackup.get()) { if (tryConnect(ha_ip1)) { log.info("连接到主节点,ip:{}", ha_ip1); + System.out.println("连接到主节点,ip:" + ha_ip1); return; } } @@ -2379,7 +2386,10 @@ public class SydApi4j implements SydApi { // 连接到备节点 if (tryConnect(ha_ip2)) { log.info("连接到备节点,ip:{}", ha_ip2); - usingBackup.set(true); + System.out.println("连接到备节点,ip:" + ha_ip2); +// usingBackup.set(true); + usingBackup.compareAndSet(false, true); + return; } @@ -2417,8 +2427,7 @@ public class SydApi4j implements SydApi { StopWatch stopWatch = new StopWatch(); stopWatch.start(); log.info("socket收发信息异常,准备重试:{}/当前重试:{}次", e.getMessage(),retryCount + 1); -// System.out.printf("线程[%s]网络故障,尝试切换节点 (重试: %d/%d)%n", -// Thread.currentThread().getName(), retryCount + 1, maxRetries); + System.out.println("socket收发信息异常:" + e.getMessage() + ",准备重试, 当前重试:" + ++retryCount + "次"); boolean currentState = usingBackup.get(); boolean newState = !currentState; @@ -2429,7 +2438,7 @@ public class SydApi4j implements SydApi { try { safeClose(); connect(targetIp, ha_port, ha_timeout); -// System.out.println("故障节点切换成功,当前使用:" + targetIp); + System.out.println("故障节点切换成功,当前使用:" + targetIp); log.info("故障节点切换成功,当前使用ip:{}", targetIp); } catch (Exception ex) { usingBackup.compareAndSet(newState, currentState); @@ -2439,6 +2448,7 @@ public class SydApi4j implements SydApi { } stopWatch.stop(); log.info("节点切换时间:{}", stopWatch.getTotalTimeMillis()); + System.out.println("节点切换时间:" + stopWatch.getTotalTimeMillis() + "ms"); } private void safeClose() { @@ -2490,7 +2500,7 @@ public class SydApi4j implements SydApi { // 发送失败 if (null != ha_ip2) { // HA 模式直接失败 - e.printStackTrace(); +// e.printStackTrace(); throw new SydApiException("Socket write error", -2); } else { // 非 HA 模式检查重试 @@ -3957,10 +3967,12 @@ public class SydApi4j implements SydApi { // 渲染发送 耗时长 ByteBuffer bb = proto.rend(packet); - synchronized (this) { - // 响应解析 - bb = syncRead(syncSend(bb)); - } +// synchronized (this) { +// // 响应解析 +// bb = syncRead(syncSend(bb)); +// } + bb = sendAndGetResponse(bb); + //ProtocolParser parser = pset.getProtocolResParse(); Packet p = proto.parse(bb); @@ -4693,10 +4705,12 @@ public class SydApi4j implements SydApi { // 渲染发送 ByteBuffer bb = proto.rend(packet); - synchronized (this) { - // 响应解析 - bb = syncRead(syncSend(bb)); - } +// synchronized (this) { +// // 响应解析 +// bb = syncRead(syncSend(bb)); +// } + + bb = sendAndGetResponse(bb); //ProtocolParser parser = pset.getProtocolResParse(); Packet p = proto.parse(bb); diff --git a/src/test/java/sample/SydUtils.java b/src/test/java/sample/SydUtils.java new file mode 100644 index 0000000..7a7196c --- /dev/null +++ b/src/test/java/sample/SydUtils.java @@ -0,0 +1,29 @@ +package sample; + +import racal.sunyard.main.SydApi4j; + +public class SydUtils { + + private final SydApi4j sydApi4j; + + static { + System.setProperty("com.sunyard.dnsort", "true"); + SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 3000); + } + + public SydUtils() { + sydApi4j = (SydApi4j) new SydApi4j(); + } + + public void disconnect() { + sydApi4j.disconnect(); + } + + public byte[] nakedSign(byte[] orgData, String SM2dn) { + return sydApi4j.SYD_NakedSign(orgData,SM2dn); + } + + public boolean nakedVerify(byte[] orgData, byte[] nakedSign, String SM2dn){ + return sydApi4j.SYD_NakedVerify(orgData, nakedSign, SM2dn); + } +} diff --git a/src/test/java/sample/Test4NongxinCW.java b/src/test/java/sample/Test4NongxinCW.java index 6b9ee66..448e230 100644 --- a/src/test/java/sample/Test4NongxinCW.java +++ b/src/test/java/sample/Test4NongxinCW.java @@ -2,7 +2,8 @@ package sample; import cn.hutool.core.date.StopWatch; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; +import com.sunyard.RetWrap; +import com.sunyard.SydApi; import com.sunyard.SydApiException; import com.sunyard.entity.ImportResult; import com.sunyard.proto.Util; @@ -13,7 +14,7 @@ import org.junit.Before; import org.junit.Test; import racal.sunyard.main.SydApi4j; -import java.io.UnsupportedEncodingException; +import java.io.StringWriter; import java.security.cert.X509Certificate; import java.util.*; import java.util.concurrent.*; @@ -33,11 +34,6 @@ public class Test4NongxinCW { //主备调用接口 SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 3000); api = (SydApi4j) new SydApi4j(); -// api.startHeartbeat(); - - // 通过设置debug的属性开启debug,如果不设置则默认不打开 -// api = (SydApi4j) new SydApi4j().connect("172.1.41.139", 8891, null, 1000); - } @Test @@ -70,11 +66,13 @@ public class Test4NongxinCW { } } + /** + * 长连接性能测试 + * @throws InterruptedException + * @throws ExecutionException + */ @Test - public void tes() throws InterruptedException, ExecutionException { - // 配置HA参数 -// SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 1000); - + public void testPerformance() throws InterruptedException, ExecutionException { // 创建200个线程并发操作API ExecutorService executor = Executors.newFixedThreadPool(100); List> futures = new ArrayList<>(); @@ -83,15 +81,9 @@ public class Test4NongxinCW { for (int i = 0; i < 100; i++) { futures.add(executor.submit(() -> { -// try { -// startLatch.await(); // 等待统一开始 -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } - SydApi4j api2 = new SydApi4j(); - for (int j = 0; j < 1000; j++) { + for (int j = 0; j < 10000; j++) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); byte[] nakedSign = api2.SYD_NakedSign(orgData,SM2dn); @@ -103,15 +95,12 @@ public class Test4NongxinCW { stopWatch.stop(); System.out.println("p1验签耗时:" + stopWatch.getLastTaskTimeMillis() + "ms"); } + api2.disconnect(); })); } - // 触发所有线程开始 startLatch.countDown(); - - // 随机触发主节点故障(模拟网络中断) Thread.sleep(500); - // 等待所有任务完成 for (Future future : futures) { future.get(); @@ -120,6 +109,44 @@ public class Test4NongxinCW { executor.shutdown(); } + /** + * 短连接性能测试 + * @throws InterruptedException + * @throws ExecutionException + */ + @Test + public void testUtils() throws InterruptedException, ExecutionException { +// 创建200个线程并发操作API + ExecutorService executor = Executors.newFixedThreadPool(200); + List> futures = new ArrayList<>(); + CountDownLatch startLatch = new CountDownLatch(1); + for (int i = 0; i < 200; i++) { + futures.add(executor.submit(() -> { + for (int j = 0; j < 1000; j++) { + StopWatch stopWatch = new StopWatch(); + SydUtils sydUtils = new SydUtils(); + stopWatch.start(); + byte[] nakedSign = sydUtils.nakedSign(orgData,SM2dn); + stopWatch.stop(); + System.out.println("p1签名耗时---:" + stopWatch.getLastTaskTimeMillis() + "ms"); + stopWatch.start(); + boolean ver = sydUtils.nakedVerify(orgData,nakedSign, SM2dn); + stopWatch.stop(); + System.out.println("p1验签耗时:" + stopWatch.getLastTaskTimeMillis() + "ms"); + sydUtils.disconnect(); + } + })); + } + // 触发所有线程开始 + startLatch.countDown(); + Thread.sleep(500); + // 等待所有任务完成 + for (Future future : futures) { + future.get(); + } + executor.shutdown(); + } + @Test public void nakeSign(){ @@ -127,14 +154,15 @@ public class Test4NongxinCW { // orgData = Hex.decode("80a370b809e8a46ba51211a35d6f0180fea32b4acc97916bc9c517ea6651134c"); // byte[] nakedSign1 = api.SYD_NakedSign(SM2dn, (byte[])null, orgData); // System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign1)); + String dn ="C=cn,O=CFCA CS OCA11,OU=CNAPS,OU=Enterprises,CN=041@Z313641099995@BHN@00000010"; orgData = new byte[1024]; - String ss = ""; //裸签 - byte[] nakedSign = api.SYD_NakedSign(orgData,ss); - System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign)); +// byte[] nakedSign = api.SYD_NakedSign(orgData,dn); +// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign)); //裸签验签 -// boolean ver = api.SYD_NakedVerify(orgData,nakedSign, SM2dn); -// System.out.println("SM2验签:"+ ver); + String sign = "30450220400849D815EE6C73A6D7334D76EF6076452367E444BBF902B4278A0D7C9843C302210095086DDC9A42E53ABCD0B172BA6A9A9814AEA580C19CDD229ABD3277321984C1"; + boolean ver = api.SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), dn); + System.out.println("SM2验签:"+ ver); } @Test @@ -322,33 +350,13 @@ public class Test4NongxinCW { "BggqgRzPVQGDdQNIADBFAiEA4kgTdn/iA/XYfjTEeOcELwBXd0tTFghkpfP8DhBF\n" + "KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" + "-----END CERTIFICATE-----"; - String cert1 = "-----BEGIN CERTIFICATE-----\n" + - "MIIDNTCCAh2gAwIBAgIFE2lVIzcwDQYJKoZIhvcNAQEFBQAwITELMAkGA1UEBhMC\n" + - "Q04xEjAQBgNVBAoTCUNGQ0EgT0NBMTAeFw0yMjA0MjIwODIyMTVaFw0yNzA0MjIw\n" + - "ODIyMTVaMGQxCzAJBgNVBAYTAkNOMRIwEAYDVQQKEwlDRkNBIE9DQTExDzANBgNV\n" + - "BAsTBlRQQy1TMzEVMBMGA1UECxMMSW5kaXZpZHVhbC0xMRkwFwYDVQQDExBBUkNV\n" + - "NTIwMDAyNTI3MDg1MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC74cciiBbs\n" + - "UcfmBxVlMWtsILsc85erRngknMaMW6wFyBsfJGrcL0TC7EO5XIsJXRrJN32vWdoo\n" + - "6Qm8WUGour+hrSNDzJ7cVtNA1ragPIjlkmMgbDLD0UsEbjHmA902079Fktv35L4l\n" + - "Hqe/vBygXcUoWJsGY5+8ykmI8W0LYPRkVwIDAQABo4G0MIGxMB8GA1UdIwQYMBaA\n" + - "FNHb6YiC5d0aj0yqAIy+fPKrG/bZMDgGA1UdHwQxMC8wLaAroCmGJ2h0dHA6Ly9j\n" + - "cmwuY2ZjYS5jb20uY24vUlNBL2NybDMwMDgyLmNybDALBgNVHQ8EBAMCA+gwHQYD\n" + - "VR0OBBYEFMM/joQIWvRFdLOx0HarTXAtZk7RMCgGA1UdJQQhMB8GCCsGAQUFBwMC\n" + - "BggrBgEFBQcDBAYJKoZIhvcvAQEFMA0GCSqGSIb3DQEBBQUAA4IBAQANEhHR34gg\n" + - "iivRj9VTO2lS0StsHQy4A4seq9YmaQa6QZDUEndFwcxr5DN6CAf6xA1YiHG5FoYd\n" + - "yH4sLORUhdfzQUWle7ZTPn4TfFjddPh3RDHXMXOh+pHNgrSjXpdACwadHedJO5e4\n" + - "HqXI8wEoNovDA8HT4ucMmsZHbIyQMhxW9k+DgTHx8nvltqv3reoDou3ekQ1tSWvW\n" + - "nUteKp64vop1ktgiIKjLshKRaUmZO4/fo9EcJHCH51J6f/2TAM7S+IaFzXR/VWf3\n" + - "JaiaGbT8kAJI854SmKWqRE8HVzMo/NYNdP0M7xZ2kt68PVE/UIl20xWii9P2/7Oh\n" + - "KYAnLX1nKjbg\n" + - "-----END CERTIFICATE-----"; List masterNodes = new ArrayList<>(); // masterNodes.add("172.16.18.99:8889"); // masterNodes.add("172.16.18.5:8889"); - masterNodes.add("172.1.41.139:8889"); - masterNodes.add("172.1.41.196:8889"); + masterNodes.add("172.1.41.96:8889"); +// masterNodes.add("172.1.41.196:8889"); // masterNodes.add("172.16.18.8:8889"); - int timeout = 1000; + int timeout = 3000; Map map = new HashMap<>(); map.put("snmp.target.ip", "172.1.41.191"); map.put("snmp.target.port", "162"); @@ -369,31 +377,19 @@ public class Test4NongxinCW { @Test public void delCert() { -// String SM2dn1 = "C=CN,ST=北京,L=北京,O=信雅达,OU=测试部门1,CN=172.1.41.139"; -// boolean del = api.deleteCert(SM2dn1); -// System.out.println("删除:"+ del); - SydApi4j api = (SydApi4j) new SydApi4j(); - String sign = "MIID6wYKKoEcz1UGAQQCAqCCA9swggPXAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIC2zCCAtcwggJ7oAMCAQICBSBpB5UzMAwGCCqBHM9VAYN1BQAwXTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEcMBoGA1UEAwwTQ0ZDQSBURVNUIFNNMiBPQ0ExMTAeFw0yNTAzMTcwODQwNTNaFw0yNzEyMTIwODQwNTNaMIGMMQswCQYDVQQGEwJjbjEfMB0GA1UECgwWQ0ZDQSBDUyBURVNUIFNNMiBPQ0ExMTEOMAwGA1UECwwFQ05BUFMxGTAXBgNVBAsMEE9yZ2FuaXphdGlvbmFsLTExMTAvBgNVBAMMKDA1MUA3OTA3NTgxMDAwMDcwQEM5MDc1ODEwMDAwNzBAMDAwMDAwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAR4vx8WcwLXu0gUn+ijMeL7Z8lbN+gRoQa4ZvIQ8fXo9Z/LIJWY92FFz7R2l/YZG/gd/olzZvTAmUehpVkksD54o4H1MIHyMB8GA1UdIwQYMBaAFL6mfk09fI+gVebBLwkuLCBDs0J/MEgGA1UdIARBMD8wPQYIYIEchu8qAQIwMTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNS5odG0wOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovLzIxMC43NC40Mi4zL09DQTExL1NNMi9jcmwyOTMyOS5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBRYhSR9g0x5JcfgN26TZ7hH6DimDDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiEA/ieBxlXaFMFylrmji2p/hqa3bsOu6y94x+a6gSoCxKMCIBwKAC/7+hFHb7Y8woimj1o12A2ROGtnxuz4F4Szu1PLMYHUMIHRAgEBMGYwXTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEcMBoGA1UEAwwTQ0ZDQSBURVNUIFNNMiBPQ0ExMQIFIGkHlTMwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARHMEUCIHpjkQo8s0JLhxccdx2LLutiJ331n91IHp392fPP7olFAiEA1SpAv3LW/0awyxmNSdbrF7/29Aw2096Sp92AxmkWPa8="; - String cert = api.getCertBySign(sign); - System.out.println(cert); - X509Certificate certificate = null; - String dn = ""; - String serialNumber = ""; - try { - certificate = CertUtil.convertToX509Cert(cert); - dn = certificate.getSubjectDN().toString(); - serialNumber = certificate.getSerialNumber().toString(); - } catch (Exception e) { -// log.warn("导入证书格式错误!"); - } - System.out.println("DN:" + dn); - System.out.println("SN:" + serialNumber); + String SM2dn1 = "C=CN,ST=北京,L=北京,O=信雅达,OU=测试部门1,CN=172.1.41.139"; + boolean del = api.deleteCert(SM2dn1); + System.out.println("删除:"+ del); } @Test public void selectCert() throws Exception { - String SM2dn1 = "C=CN,ST=1,L=1,O=1,OU=1,OU=1,CN=1"; - String s = api.getCertByDn(SM2dn); + String SM2dn1 = "C=CN,ST=2,L=3,O=3,OU=1,OU=1,CN=qwqq"; + String dn = "C=CN,ST=2,L=3,O=3,OU=1,CN=qwqq"; + + String dn1 = "C=cn,O=CFCA CS OCA11,OU=CNAPS,OU=Enterprises,CN=041@Z313641099995@BHN@00000010"; + String dn2 = "C=cn,O=CFCA TEST OCA1,OU=DEMP,OU=Organizational-1,CN=041@ZDEMP@DEMP@00000001"; + String s = api.getCertByDn(dn1,0); System.out.println(s); String message = "sdas发顺丰"; byte[] gbkBytes = message.getBytes("GBK"); @@ -406,15 +402,26 @@ public class Test4NongxinCW { } @Test - public void selCert() throws UnsupportedEncodingException { -// String data = "MIIDyQYKKoEcz1UGAQQCAqCCA7kwggO1AgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICujCCArYwggJboAMCAQICBSBhWZmSMAwGCCqBHM9VAYN1BQAwXTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEcMBoGA1UEAwwTQ0ZDQSBURVNUIFNNMiBPQ0ExMTAeFw0yMjEwMjQwMTM4NDdaFw0yNTEwMjQxNTU5NTlaMG0xCzAJBgNVBAYTAmNuMRUwEwYDVQQKDAxDRkNBIFRFU1QgQ0ExDjAMBgNVBAsMBUNOQVBTMRQwEgYDVQQLDAtFbnRlcnByaXNlczEhMB8GA1UEAwwYMDQxQFowMDAwQG5wYzAyQDAwMDAwMDU3MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEogTVy1LIqW7BXiOoNkMZ3h3IsWFXQ7MUOvGuXzsneZTLKxAEUsyzQg+Q1lOwGhU8GzcWs4TFWe0o4xGJZch0zqOB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjI5OTAuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUoOXRJpClT9Q3Gnq/VZhoryt8VNEwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADRwAwRAIgThN7q4hMTNFDM3LcI4BuLpqLjNQA2psZLHBW9/18I74CIHCa1Sfy3DX/IZr0JbDH1EhzArj4ZWtblKC0M/8C38yYMYHTMIHQAgEBMGYwXTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEcMBoGA1UEAwwTQ0ZDQSBURVNUIFNNMiBPQ0ExMQIFIGFZmZIwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARGMEQCIAdiCAIN/KNfW1SlsBfs1FCkDTBCG6Xbt42JvXxLLEO/AiBaAN1AT7JLWxHLz0YcmbB9wkkUy4kZOFXxaVU+qbleHQ=="; -// String s = api.getCertBySign(data); -// System.out.println(s); - -// String cert = api.getCertByDn(SM2dn,0); -// System.out.println(cert); - - System.out.println(Util.bytes2HexString(orgData)); + public void selCert() throws Exception { + String certBase64 = "MIICujCCAl6gAwIBAgIFEFeGNUIwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjMxMDI2MDYwMDU5WhcNMjgxMDI2MDYwMDU5WjByMQswCQYDVQQGEwJjbjEXMBUGA1UECgwOQ0ZDQSBURVNUIE9DQTExDTALBgNVBAsMBERFTVAxGTAXBgNVBAsMEE9yZ2FuaXphdGlvbmFsLTExIDAeBgNVBAMMFzA0MUBaREVNUEBERU1QQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE3NOLwnCvPxeZxS5lUSl+fxojdYwV1mD5eDGOkPeATl88oW0Q1PuBd0aQ29HmufRamZb2BlfLhjcgS5TsKlX4qqOB9DCB8TAfBgNVHSMEGDAWgBRr/hjaj0I6prhtsy6Igzo0osEw4TBIBgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTQuaHRtMDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly91Y3JsLmNmY2EuY29tLmNuL1NNMi9jcmw1Mzg2My5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSElGKzsZJ04RMd60sFqiHpxl9/njAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiEAjmCCIlDNdXw0qRZe7oYrkel4wTpg++c/C+MKLbPfRpgCIEVyrM68qeuVmaFZ5ZA3TtUXQg1RYQjz/5yhl/3jhdQ9"; + String s = "MIICujCCAl6gAwIBAgIFEFeGNUIwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y aXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjMxMDI2MDYwMDU5 WhcNMjgxMDI2MDYwMDU5WjByMQswCQYDVQQGEwJjbjEXMBUGA1UECgwOQ0ZDQSBU RVNUIE9DQTExDTALBgNVBAsMBERFTVAxGTAXBgNVBAsMEE9yZ2FuaXphdGlvbmFs LTExIDAeBgNVBAMMFzA0MUBaREVNUEBERU1QQDAwMDAwMDAxMFkwEwYHKoZIzj0C AQYIKoEcz1UBgi0DQgAE3NOLwnCvPxeZxS5lUSl+fxojdYwV1mD5eDGOkPeATl88 oW0Q1PuBd0aQ29HmufRamZb2BlfLhjcgS5TsKlX4qqOB9DCB8TAfBgNVHSMEGDAW gBRr/hjaj0I6prhtsy6Igzo0osEw4TBIBgNVHSAEQTA/MD0GCGCBHIbvKgEBMDEw LwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTQuaHRt MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly91Y3JsLmNmY2EuY29tLmNuL1NNMi9j cmw1Mzg2My5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBSElGKzsZJ04RMd60sF qiHpxl9/njAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UB g3UFAANIADBFAiEAjmCCIlDNdXw0qRZe7oYrkel4wTpg++c/C+MKLbPfRpgCIEVy rM68qeuVmaFZ5ZA3TtUXQg1RYQjz/5yhl/3jhdQ9"; + String cert = convertToPem( Base64.getDecoder().decode(s)); + System.out.println("------------------------------------------------------------------------------------"); + String dn = api.importCertAndGetDN(cert); + System.out.println("导入证书成功,dn:" + dn); + System.out.println("------------------------------------------------------------------------------------"); + String cert1 = api.getCertByDn(dn,0); + System.out.println("查询证书:" + cert1); + System.out.println("------------------------------------------------------------------------------------"); +// boolean delFlag = api.deleteCert(dn); +// System.out.println("删除证书:"+ delFlag); +// System.out.println("------------------------------------------------------------------------------------"); +// try { +// String cert2 = api.getCertByDn(dn,0); +// System.out.println("删除后查询证书:" + cert1); +// } catch (Exception e) { +// System.out.println("查询证书失败,证书不存在"); +// } } @Test @@ -435,7 +442,8 @@ public class Test4NongxinCW { "KFQCIAXZTL6VPtW67tM/DF4ZgFt5S/YIiFombKa2bWOfL81u\n" + "-----END CERTIFICATE-----"; List masterNodes = new ArrayList<>(); - masterNodes.add("172.1.1.1:8889"); + masterNodes.add("172.1.41.19:8889"); + masterNodes.add("172.1.41.9:8889"); int timeout = 100; Map map = new HashMap<>(); map.put("snmp.target.ip", "172.1.1.191"); @@ -448,12 +456,15 @@ public class Test4NongxinCW { //导入证书并获取DN SydApi4j sydApi4j = new SydApi4j(); - String SM2dn = sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig).getCertDn(); + + ImportResult importResult = sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig); + System.out.println("导入结果ImportResult:" + new Gson().toJson(importResult)); System.out.println("------------------------------------------------------------------------------------"); + String SM2dn = importResult.getCertDn(); System.out.println("导入证书主题为:"+ SM2dn); //主备模式设置 - SydApi4j.SYD_Set_Parameter_HA("192.168.0.8", "172.1.1.2", 8889, 1000); + SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.139", 8889, 1000); SydApi4j api = (SydApi4j) new SydApi4j(); //签名原始数据 @@ -462,9 +473,10 @@ public class Test4NongxinCW { byte[] nakedSign = api.SYD_NakedSign(orgData, SM2dn); System.out.println("------------------------------------------------------------------------------------"); System.out.println("p1签名:"+ Util.bytes2HexString(nakedSign)); - System.out.println("p1签名2:"+ Base64.getEncoder().encodeToString(nakedSign)); + System.out.println("p1签名2:"+ Util.encodeBase64(nakedSign)); //p1裸签验签(国密证书) - boolean ver = api.SYD_NakedVerify(orgData, nakedSign, SM2dn); + String si = "MEUCIQCp26t1r3lAWrSSM6NmvqfJKlOFgdPyVKzK6FyImDnzYAIgXJV8GUztPGk0YxYGNU5OMoIqnFJRyLGh72hkUjfWDaM="; + boolean ver = api.SYD_NakedVerify(orgData, Util.decodeBase64(si), SM2dn); System.out.println("------------------------------------------------------------------------------------"); System.out.println("p1验签:"+ ver); @@ -483,12 +495,75 @@ public class Test4NongxinCW { System.out.println("------------------------------------------------------------------------------------"); System.out.println("根据p7签名值获取的证书为:" + cert1); + //数字信封 +// RetWrap genSM2 = api.generateDEByDn(SM2dn, orgData); +// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY); +// System.out.println("SM2数字信封: " + new String(cipherKey)); +// RetWrap denSM2 = api.decryptDEByDN( SM2dn, cipherKey); +// byte[] oData = (byte[]) denSM2.get("oData"); +// System.out.println("SM2信封解密:"+Util.bytes2HexString(oData)); + //根据证书DN从加密码机删除证书 // boolean delFlag = api.deleteCert(SM2dn); // System.out.println("------------------------------------------------------------------------------------"); // System.out.println("删除证书成功:"+ delFlag); } + @Test + public void testDE() { + SydApi4j sydApi4j = new SydApi4j(); +// String SM2dn = "C=CN,ST=北京,L=北京,O=信雅达,CN=172.1.40.188"; +// String SM2dn = "C=CN,O=China Financial Certification Authority,CN=CFCA ACS TEST SM2 OCA31"; + //数字信封 + RetWrap genSM2 = api.generateDEByDn(SM2dn, orgData); + byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY); + System.out.println("SM2数字信封: " + new String(cipherKey)); + RetWrap denSM2 = api.decryptDEByDN( SM2dn, cipherKey); + byte[] oData = (byte[]) denSM2.get("oData"); + System.out.println("SM2信封解密:"+Util.bytes2HexString(oData)); + } + + @Test + public void verifyCert() throws Exception { + String cert1 = "-----BEGIN CERTIFICATE-----\n" + + "MIIDzQYKKoEcz1UGAQQCAqCCA70wggO5AgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICvjCCArowggJeoAMCAQICBRBXhjVCMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0ExMB4XDTIzMTAyNjA2MDA1OVoXDTI4MTAyNjA2MDA1OVowcjELMAkGA1UEBhMCY24xFzAVBgNVBAoMDkNGQ0EgVEVTVCBPQ0ExMQ0wCwYDVQQLDARERU1QMRkwFwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMSAwHgYDVQQDDBcwNDFAWkRFTVBAREVNUEAwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABNzTi8Jwrz8XmcUuZVEpfn8aI3WMFdZg+XgxjpD3gE5fPKFtENT7gXdGkNvR5rn0WpmW9gZXy4Y3IEuU7CpV+KqjgfQwgfEwHwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsNTM4NjMuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUhJRis7GSdOETHetLBaoh6cZff54wHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAI5ggiJQzXV8NKkWXu6GK5HpeME6YPvnPwvjCi2z30aYAiBFcqzOvKnrlZmhWeWQN07VF0INUWEI8/+coZf944XUPTGB0zCB0AIBATBlMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIFEFeGNUIwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARHMEUCIAty3HjlED9ti0NkRI1wpCr8oUws93qHwlYMU0X2HnS3AiEAtv2/HiXabruxV9WLYeMNsO58qcMiBAy1CKmM/zMJCHI=\n" + + "-----END CERTIFICATE-----"; + String cert2 = + "MIIC3DCCAoCgAwIBAgIFIGiRZIYwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTI0MDgxNTA4MzAxMloXDTI3MDIwMTA4MzAxMlowgZExCzAJBgNVBAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ4wDAYDVQQLDAVDTkFQUzEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMTE2MDQGA1UEAwwtMDUxQFozMTM1ODEwMDMyODRAMzEzNTgxMDAzMjg0Q05BUFMyQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFRjj5zgEwAnsF7hh6RVJfXSdybPBGBlF7gsVOUX5tU7E0YN/eYZk9j1jbOCrBWz611gsr+HkU0OZsFFlQTattKOB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyODkuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUDONZoezPmMkCIHifM0KK9y0N8bQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAKesbWSJQXAHBoLvTbtM+CP7eqwfBMQc0nRridvyXOPOAiAp2Zr1Ncren8n2U1XP4tWeYp1YyPBMke0BSlOFunJ0Jg=="; + byte[] s = Base64.getDecoder().decode(cert2); + System.out.println(convertToPem(s)); + X509Certificate certificate = null; + try { + certificate = CertUtil.convertToX509Cert(cert1); + } catch (Exception e) { + System.out.println("证书格式错误!"); + } + } + + @Test + public void convert() throws Exception { + //原始证书 + String cert = + "MIIC3DCCAoCgAwIBAgIFIGiRZIYwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNBIFRFU1QgU00yIE9DQTExMB4XDTI0MDgxNTA4MzAxMloXDTI3MDIwMTA4MzAxMlowgZExCzAJBgNVBAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ4wDAYDVQQLDAVDTkFQUzEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwtMTE2MDQGA1UEAwwtMDUxQFozMTM1ODEwMDMyODRAMzEzNTgxMDAzMjg0Q05BUFMyQDAwMDAwMDAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEFRjj5zgEwAnsF7hh6RVJfXSdybPBGBlF7gsVOUX5tU7E0YN/eYZk9j1jbOCrBWz611gsr+HkU0OZsFFlQTattKOB9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbvKgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyODkuY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUDONZoezPmMkCIHifM0KK9y0N8bQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhAKesbWSJQXAHBoLvTbtM+CP7eqwfBMQc0nRridvyXOPOAiAp2Zr1Ncren8n2U1XP4tWeYp1YyPBMke0BSlOFunJ0Jg=="; + byte[] s = Base64.getDecoder().decode(cert); + System.out.println(convertToPem(s)); + } + + public String convertToPem(byte[] derCert) throws Exception { + // 使用Base64编码器(兼容RFC 4648,每行64字符) + StringWriter writer = new StringWriter(); + writer.write("-----BEGIN CERTIFICATE-----\n"); + // 将DER转换为Base64并分割为每行64字符 + String base64Cert = Base64.getMimeEncoder(64, "\n".getBytes()).encodeToString(derCert); + writer.write(base64Cert); + // 如果Base64编码的字符串没有以换行结束,则添加换行 + if (!base64Cert.endsWith("\n")) { + writer.write("\n"); + } + writer.write("-----END CERTIFICATE-----\n"); + return writer.toString(); + } +