571 lines
31 KiB
Java
571 lines
31 KiB
Java
package sample;
|
||
|
||
import cn.hutool.core.date.StopWatch;
|
||
import com.google.gson.Gson;
|
||
import com.sunyard.RetWrap;
|
||
import com.sunyard.SydApi;
|
||
import com.sunyard.SydApiException;
|
||
import com.sunyard.entity.ImportResult;
|
||
import com.sunyard.proto.Util;
|
||
import com.sunyard.util.CertUtil;
|
||
import com.sunyard.util.IpLockUtils;
|
||
import org.junit.After;
|
||
import org.junit.Before;
|
||
import org.junit.Test;
|
||
import racal.sunyard.main.SydApi4j;
|
||
|
||
import java.io.StringWriter;
|
||
import java.security.cert.X509Certificate;
|
||
import java.util.*;
|
||
import java.util.concurrent.*;
|
||
|
||
import static com.sunyard.util.CertUtil.convertToX509Cert;
|
||
|
||
public class Test4NongxinCW {
|
||
|
||
private SydApi4j api;
|
||
|
||
final String SM2dn = "C=CN,ST=zz,L=zz,O=zzz,CN=zzzzz";
|
||
|
||
byte[] orgData = new byte[1024];
|
||
|
||
@Before
|
||
public void before() {
|
||
//主备调用接口
|
||
SydApi4j.SYD_Set_Parameter_HA("172.1.41.139", "172.1.41.96", 8889, 3000);
|
||
api = (SydApi4j) new SydApi4j();
|
||
}
|
||
|
||
@Test
|
||
public void connection() {
|
||
|
||
}
|
||
|
||
@After
|
||
public void after() {
|
||
try {
|
||
this.api.disconnect();
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
|
||
@Test
|
||
public void testHA() {
|
||
// byte[] nakedSign1 = api.SYD_NakedSignAll(4,orgData, SM2dn);
|
||
// System.out.println("SM2大数据裸签:"+ Util.bytes2HexString(nakedSign1));
|
||
// boolean nakedVerify1 = api.SYD_NakedVerifyAll(4,orgData, nakedSign1, SM2dn);
|
||
// System.out.println("SM2数据验签:"+nakedVerify1 );
|
||
for (int i = 0; i < 10000; i++) {
|
||
byte[] nakedSign = api.SYD_NakedSign(orgData,SM2dn);
|
||
// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign));
|
||
byte[] nakedSign1 = api.SYD_NakedSignAll(4,orgData, SM2dn);
|
||
// System.out.println("SM2大数据裸签:"+ Util.bytes2HexString(nakedSign1));
|
||
boolean nakedVerify1 = api.SYD_NakedVerifyAll(4,orgData, nakedSign1, SM2dn);
|
||
// System.out.println("SM2数据验签:"+nakedVerify1 );
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 长连接性能测试
|
||
* @throws InterruptedException
|
||
* @throws ExecutionException
|
||
*/
|
||
@Test
|
||
public void testPerformance() throws InterruptedException, ExecutionException {
|
||
// 创建200个线程并发操作API
|
||
ExecutorService executor = Executors.newFixedThreadPool(100);
|
||
List<Future<?>> futures = new ArrayList<>();
|
||
|
||
CountDownLatch startLatch = new CountDownLatch(1);
|
||
|
||
for (int i = 0; i < 100; i++) {
|
||
futures.add(executor.submit(() -> {
|
||
SydApi4j api2 = new SydApi4j();
|
||
|
||
for (int j = 0; j < 10000; j++) {
|
||
StopWatch stopWatch = new StopWatch();
|
||
stopWatch.start();
|
||
byte[] nakedSign = api2.SYD_NakedSign(orgData,SM2dn);
|
||
stopWatch.stop();
|
||
System.out.println("p1签名耗时---:" + stopWatch.getLastTaskTimeMillis() + "ms");
|
||
stopWatch.start();
|
||
String sign = "304502204ACEE7FA06644B6EAE62E5FBF824B6ED8D4432D5CE52580381ECF3570DE032F4022100F30DF2B902A3C34E183498C14565D03C9F28FD1BCCDFB557B52996539BCCF58F";
|
||
boolean ver = api2.SYD_NakedVerify(orgData,nakedSign, SM2dn);
|
||
stopWatch.stop();
|
||
System.out.println("p1验签耗时:" + stopWatch.getLastTaskTimeMillis() + "ms");
|
||
}
|
||
api2.disconnect();
|
||
}));
|
||
}
|
||
// 触发所有线程开始
|
||
startLatch.countDown();
|
||
Thread.sleep(500);
|
||
// 等待所有任务完成
|
||
for (Future<?> future : futures) {
|
||
future.get();
|
||
}
|
||
|
||
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(){
|
||
|
||
// String SM2dn1 = "C=CN,ST=3,L=3,O=3,OU=3,OU=3,CN=3";
|
||
// 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];
|
||
//裸签
|
||
// byte[] nakedSign = api.SYD_NakedSign(orgData,dn);
|
||
// System.out.println("SM2签名:"+ Util.bytes2HexString(nakedSign));
|
||
//裸签验签
|
||
String sign = "30450220400849D815EE6C73A6D7334D76EF6076452367E444BBF902B4278A0D7C9843C302210095086DDC9A42E53ABCD0B172BA6A9A9814AEA580C19CDD229ABD3277321984C1";
|
||
boolean ver = api.SYD_NakedVerify(orgData,Util.hexString2Bytes(sign), dn);
|
||
System.out.println("SM2验签:"+ ver);
|
||
}
|
||
|
||
@Test
|
||
public void rsaSign() {
|
||
String RSAdn = "C=CN,ST=3,L=3,O=3,OU=3,OU=3,CN=3";
|
||
byte[] nakedSign = api.SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
|
||
System.out.println("RSA签名:"+ Util.bytes2HexString(nakedSign));
|
||
//裸签验签
|
||
boolean ver = api.SYD_NakedVerify(1, RSAdn,nakedSign,orgData ,(byte[])null);
|
||
System.out.println("RSA验签:"+ ver);
|
||
|
||
|
||
}
|
||
|
||
@Test
|
||
public void detSign(){
|
||
orgData = new byte[1024];
|
||
|
||
for (int i = 0; i < 10000; i++) {
|
||
//detach签名
|
||
String detachedSign = api.detachedSign(orgData, SM2dn);
|
||
System.out.println("detach签名:"+ detachedSign);
|
||
|
||
//detach验签
|
||
boolean ver = api.detachedVerify(orgData, detachedSign);
|
||
// System.out.println("detach验签:"+ ver);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
@Test
|
||
public void folw(){
|
||
String detSign = "MIICpQYKKoEcz1UGAQQCAqCCApUwggKRAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIByTCCAcUwggFooAMCAQICCDyTAAAAAAAlMAwGCCqBHM9VAYN1BQAwJjELMAkGA1UEBhMCQ04xFzAVBgNVBAMMDlN1bnlhcmRTTTJSb290MB4XDTE3MDUxNzAyNTI0NFoXDTIyMDcyNTAyNTI0NFowPTELMAkGA1UEBhMCQ04xEDAOBgNVBAoMB1N1bnlhcmQxDTALBgNVBAsMBDgwMDExDTALBgNVBAMMBDgwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQ+2joQe3zDXMAFx/vwu05rQ6B+4U42BgPSLsoqYAstD6AwVdQA0SQDAPVGSLhJ0T9QszD/FDUbVkWxNoaCCmW7o2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFAMWZaY2AwaQTNiFLpsa0dyCzBZ6MAwGCCqBHM9VAYN1BQADSQAwRgIhAIl2ZHGfln5hedcousARzZ2yeUjUbxSFMmhMmr5t6Q6nAiEAvqYX/KpIcvnPyB/Yiil+oq6DFdVM6P3vDxBhU/8taXExgaAwgZ0CAQEwMjAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QCCDyTAAAAAAAlMAwGCCqBHM9VAYMRBQAwDQYJKoEcz1UBgi0BBQAERzBFAiEArdbDSpZUSvPTGjzPOhyJhR7BK8owUpQjcq8eKSH8Xa8CIFmGgCdsd5V8qzeOOB7QtKnjH9KoyoGe8bASpgquX2p6";
|
||
String netSignHex = "304402202EC53E985C09575A64A7B96C8A23713165FB0733C800145F07B9D5F990F546070220046F854CA62DF93AF8F0D541CA8B8697957423182EE70BB03B678A920985004F";
|
||
|
||
// //从detach签名中获取证书
|
||
// String certBySign = api.getCertBySign(detSign);
|
||
// //System.out.println("获取证书内容为:"+certBySign);
|
||
// System.out.println(certBySign);
|
||
|
||
String certBySign = "-----BEGIN CERTIFICATE-----\n" +
|
||
"MIIC2TCCAn2gAwIBAgIFIGhhlgkwDAYIKoEcz1UBg3UFADBdMQswCQYDVQQGEwJDTjEwMC4GA1UE\n" +
|
||
"CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRwwGgYDVQQDDBNDRkNB\n" +
|
||
"IFRFU1QgU00yIE9DQTExMB4XDTIzMTAzMDAyMzQzNVoXDTI1MDkyOTAyMzQzNVowgY4xCzAJBgNV\n" +
|
||
"BAYTAmNuMR8wHQYDVQQKDBZDRkNBIENTIFRFU1QgU00yIE9DQTExMQ0wCwYDVQQLDARHRklYMRkw\n" +
|
||
"FwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMTQwMgYDVQQDDCswNTFAWjQwMjM2MTAxODg4NkA0MDIz\n" +
|
||
"NjEwMTg4ODZHRklYQDAwMDAwMDAzMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAECyoVBYoJB4gA\n" +
|
||
"KsQJCOXv4mRpK6+9r3ygeuHfVlfM/Ry05TVEmTnYAx1EvPnpgzDsgufEQU7oCjLTeznV0Ytc9qOB\n" +
|
||
"9TCB8jAfBgNVHSMEGDAWgBS+pn5NPXyPoFXmwS8JLiwgQ7NCfzBIBgNVHSAEQTA/MD0GCGCBHIbv\n" +
|
||
"KgECMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTUuaHRtMDoG\n" +
|
||
"A1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly8yMTAuNzQuNDIuMy9PQ0ExMS9TTTIvY3JsMjkyMzYuY3Js\n" +
|
||
"MAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUEXk8fc+VwuPgF2uLzPJwLunm1mswHQYDVR0lBBYwFAYI\n" +
|
||
"KwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIhANBoYhm7RwzcWi0QJa4IeBW3\n" +
|
||
"jY4S64AdH/IWiO+aUyfPAiAu+9MrvCfd27KGZQKurf/djfbe5xBQg2CG6ae+Tax9lQ==\n" +
|
||
"-----END CERTIFICATE-----";
|
||
|
||
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-----";;
|
||
|
||
//将证书导入设备,获取证书主题
|
||
String dn = api.importCertAndGetDN(cert);
|
||
System.out.println("导入证书主题为:"+dn);
|
||
|
||
|
||
//裸签名格式转换
|
||
byte[] netSign = Util.hexString2Bytes(netSignHex);
|
||
//使用导入证书对裸签名验签
|
||
boolean verify = api.SYD_NakedVerify(orgData, netSign, dn);
|
||
System.out.println("验证裸签名:"+verify);
|
||
|
||
|
||
}
|
||
|
||
|
||
@Test
|
||
public void test(){
|
||
String cert = "-----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-----";
|
||
|
||
|
||
String pemCert;
|
||
if(cert.contains("-----BEGIN CERTIFICATE-----")){
|
||
pemCert =cert;
|
||
}else {
|
||
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
|
||
String end_cert = "\n-----END CERTIFICATE-----";
|
||
pemCert = cert_begin + cert + end_cert;
|
||
}
|
||
X509Certificate certificate = null;
|
||
try {
|
||
certificate = convertToX509Cert(pemCert);
|
||
} catch (Exception e) {
|
||
throw new SydApiException( 0xC101, e );
|
||
}
|
||
String dn = certificate.getSubjectDN().toString();
|
||
System.out.println(dn);
|
||
String name = certificate.getSubjectDN().getName();
|
||
System.out.println(name);
|
||
|
||
String hex = "6D32F5C0151C8E25686E5016A1A3EE2118063C2FB83F941F01ED8C418563FCB5248BE6C50E504D19AC0CFA4573564F11878CBA3E2F2E40D8DAFD6CBD2929570223964D7C479639999C4CA3A84AFA3F791E296A3058F704DEB9BE5B96EEF5904A72DF5EA7CB88C1176B52292D9629784576D33F11D4DD721A585BAE359130DD5F";
|
||
System.out.println(Util.encodeBase64(Util.hexString2Bytes(hex)));
|
||
|
||
|
||
}
|
||
|
||
@Test
|
||
public void test2(){
|
||
String index = "000000000000000000A00000000";
|
||
String data = "12345678";
|
||
String s = api.SYMEncrytByKeyIndex(index, data);
|
||
System.out.println(s);
|
||
}
|
||
@Test
|
||
public void testMutiImport() throws InterruptedException {
|
||
List<Thread> threads = new ArrayList<>();
|
||
|
||
// 创建100个线程
|
||
for (int i = 0; i < 20; i++) {
|
||
Thread thread = new Thread(() -> {
|
||
for (int j = 0; j < 1000; j++) {
|
||
api.SYD_NakedSign(orgData,SM2dn);
|
||
importAllCert();
|
||
}
|
||
});
|
||
thread.start();
|
||
threads.add(thread);
|
||
}
|
||
|
||
// 等待所有线程完成
|
||
for (Thread thread : threads) {
|
||
thread.join();
|
||
}
|
||
|
||
System.out.println(IpLockUtils.getLockStatus("172.1.41.139:8889"));
|
||
|
||
System.out.println("所有线程执行完毕");
|
||
}
|
||
|
||
@Test
|
||
public void importAllCert() {
|
||
StopWatch stopWatch = new StopWatch();
|
||
stopWatch.start();
|
||
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.16.18.99:8889");
|
||
// masterNodes.add("172.16.18.5:8889");
|
||
masterNodes.add("172.1.41.96:8889");
|
||
// masterNodes.add("172.1.41.196:8889");
|
||
// masterNodes.add("172.16.18.8:8889");
|
||
int timeout = 3000;
|
||
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.version", "1");
|
||
Gson gson = new Gson();
|
||
String snmpConfig = gson.toJson(map);
|
||
SydApi4j sydApi4j = new SydApi4j();
|
||
ImportResult result = sydApi4j.importCertToServers(masterNodes, timeout, cert, "12345678", snmpConfig);
|
||
System.out.println(gson.toJson(result));
|
||
System.out.println(result.getCode());
|
||
System.out.println(gson.toJson(result.getErrCnt()));
|
||
System.out.println(result.getCertDn());
|
||
stopWatch.stop();
|
||
System.out.println(stopWatch.getTotalTimeSeconds());
|
||
}
|
||
|
||
@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);
|
||
}
|
||
|
||
@Test
|
||
public void selectCert() throws Exception {
|
||
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");
|
||
System.out.println("GBK Encoded Bytes: " + Arrays.toString(gbkBytes));
|
||
|
||
// Decoding back to String
|
||
String decodedMessage = new String(gbkBytes, "GBK");
|
||
System.out.println("Decoded Message: " + decodedMessage);
|
||
|
||
}
|
||
|
||
@Test
|
||
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
|
||
public void testAll() {
|
||
//国密证书
|
||
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.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");
|
||
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.version", "1");
|
||
String snmpConfig = new Gson().toJson(map);
|
||
|
||
|
||
//导入证书并获取DN
|
||
SydApi4j sydApi4j = new SydApi4j();
|
||
|
||
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("172.1.41.139", "172.1.41.139", 8889, 1000);
|
||
SydApi4j api = (SydApi4j) new SydApi4j();
|
||
|
||
//签名原始数据
|
||
byte[] orgData = "12345678".getBytes();
|
||
//p1裸签名(国密证书)
|
||
byte[] nakedSign = api.SYD_NakedSign(orgData, SM2dn);
|
||
System.out.println("------------------------------------------------------------------------------------");
|
||
System.out.println("p1签名:"+ Util.bytes2HexString(nakedSign));
|
||
System.out.println("p1签名2:"+ Util.encodeBase64(nakedSign));
|
||
//p1裸签验签(国密证书)
|
||
String si = "MEUCIQCp26t1r3lAWrSSM6NmvqfJKlOFgdPyVKzK6FyImDnzYAIgXJV8GUztPGk0YxYGNU5OMoIqnFJRyLGh72hkUjfWDaM=";
|
||
boolean ver = api.SYD_NakedVerify(orgData, Util.decodeBase64(si), SM2dn);
|
||
System.out.println("------------------------------------------------------------------------------------");
|
||
System.out.println("p1验签:"+ ver);
|
||
|
||
//p7 detach签名(带公钥证书)
|
||
String detachedSign = api.detachedSign(orgData, SM2dn);
|
||
System.out.println("------------------------------------------------------------------------------------");
|
||
System.out.println("p7 detach签名:"+ detachedSign);
|
||
|
||
//p7 detach验签(带公钥证书)
|
||
boolean ver1 = api.detachedVerify(orgData, detachedSign);
|
||
System.out.println("------------------------------------------------------------------------------------");
|
||
System.out.println("p7 detach验签:"+ ver1);
|
||
|
||
//从p7签名数据中获取证书,签名数据为base64编码格式
|
||
String cert1 = api.getCertBySign(detachedSign);
|
||
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();
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|