jmeter测试

This commit is contained in:
waner 2025-07-16 15:43:32 +08:00
parent 4372362086
commit d80e225158
5 changed files with 305 additions and 139 deletions

View File

@ -108,8 +108,8 @@
<!-- <dependency>-->
<!-- <groupId>org.codehaus.groovy</groupId>-->
<!-- <artifactId>groovy-all</artifactId>-->
<!-- <version>3.0.9</version>-->
<!-- <version>4.0.26</version>-->
<!-- <version>2.4.15</version>-->
<!--&lt;!&ndash; <version>4.0.26</version>&ndash;&gt;-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->

View File

@ -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<SydApi4j>() {
@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<String> masterNodes = new ArrayList<>();
masterNodes.add("172.1.41.139:8889");
int timeout = 1000;
private void testImportCert(){
List<String> masterNodes = Arrays.asList(StringUtils.split(nodes, ";"));
Map<String, String> 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();
}
/**

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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<Future<?>> 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<Future<?>> 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<String> 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<String, String> 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<String> 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<String, String> 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();
}