diff --git a/DProto/8017.xml b/DProto/8017.xml
index cb57ee7..8546be7 100644
--- a/DProto/8017.xml
+++ b/DProto/8017.xml
@@ -6,10 +6,23 @@
8017
-
- 用户编号
+
+ p标志
+
+
+ 仅当P存在时
+ 0: SN
+ 1: 机构号
+
+
+ 仅当P存在时,根据flag标志确定是什么的长度
+
+
+ 机构号不满16字节,后面补充0x00至16字节。
+ 如果是SN或其他,则其长度根据SN长度确定
+ 0x00签名证书,0x01加密证书
@@ -93,7 +106,19 @@
-
+
diff --git a/doc/java接口说明文档.docx b/doc/java接口说明文档.docx
index 9ed384b..c2d79c6 100644
Binary files a/doc/java接口说明文档.docx and b/doc/java接口说明文档.docx differ
diff --git a/src/main/java/com/sunyard/inf/SydCertApi.java b/src/main/java/com/sunyard/inf/SydCertApi.java
index 40d2546..70167c4 100644
--- a/src/main/java/com/sunyard/inf/SydCertApi.java
+++ b/src/main/java/com/sunyard/inf/SydCertApi.java
@@ -69,6 +69,13 @@ public interface SydCertApi {
String pCert
);
+ /**
+ * 通过SN获取 X509 证书信息
+ * @param sn sn,证书序号
+ * @param nCertType 证书类型,0:签名证书, 1:加密证书
+ * @return
+ */
+ String GetX509CertFileBySN(String sn, int nCertType);
/**
* 通过使用者 ID 获取的 X509 证书文件。
@@ -81,7 +88,6 @@ public interface SydCertApi {
int nCertType
);
-
/**
* 从签名中获取证书
* @param orgData 待签名的原始数据
diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java
index 22cbb11..329ed9b 100644
--- a/src/main/java/racal/sunyard/main/SydApi4j.java
+++ b/src/main/java/racal/sunyard/main/SydApi4j.java
@@ -3196,11 +3196,32 @@ public class SydApi4j implements SydApi {
return cinfo;
}
+ /**
+ * 通过SN获取证书信息
+ * @param sn sn
+ * @param nCertType 证书类型,0:签名证书, 1:加密证书
+ * @return
+ */
+ @Override
+ public String GetX509CertFileBySN(String sn, int nCertType) {
+ return GetX509CertFileC(0, sn, nCertType);
+ }
+
// 测试通过
@Override
public String GetX509CertFileC(String userId, int nCertType) {
+ return GetX509CertFileC(1, userId, nCertType);
+ }
+
+ /**
+ * 通过sn或机构号获取证书
+ * @param flag 0: SN,1: 机构号
+ * @param userId 根据flag确定传入的数据
+ * @param nCertType 证书类型,0:签名证书, 1:加密证书
+ * @return
+ */
+ private String GetX509CertFileC(int flag, String userId, int nCertType) {
- //ProtocolRender render = pset.getProtocolReqRender(new byte[]{(byte) 0x80, 0x17});
Proto8017 proto = new Proto8017();
HashMap packet = new HashMap();
HashMap data = new HashMap();
@@ -3208,12 +3229,20 @@ public class SydApi4j implements SydApi {
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
+ byte[] u;
- if (userId.length() > 16) {
- throw new SydApiException(-26);
+ if (flag == 1) {
+ if (userId.length() > 16) {
+ throw new SydApiException(-26);
+ }
+ u = new byte[16];
+ System.arraycopy(userId.getBytes(), 0, u, 0, userId.length());
+ } else {
+ u = userId.getBytes();
+ data.put("pFlag", "P");
+ data.put("flag", flag);
}
- byte[] u = new byte[16];
- System.arraycopy(userId.getBytes(), 0, u, 0, userId.length());
+
byte type = 0 == nCertType ? (byte) 0 : (byte) 1;
data.put("userId", u);
@@ -3245,7 +3274,6 @@ public class SydApi4j implements SydApi {
}
-
/**
* sm2私钥签名
* 用户id默认为1234567812345678
diff --git a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java
index 5030e01..13a60d4 100644
--- a/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java
+++ b/src/test/java/com/sunyard/sydapi/test/TestAllMethods.java
@@ -9,7 +9,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
-import racal.sunyard.main.SydApiBuilder;
import java.io.*;
import java.util.Base64;
@@ -32,10 +31,19 @@ public class TestAllMethods {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000);
// api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
+// api = (SydApi4j) new SydApi4j().connect("192.168.0.99", 8889, null, 1000);
// api = (SydApi4j) new SydApi4j().connect("172.16.17.162", 8889, null, 1000);
// api = (SydApi4j) new SydApi4j().connect("192.168.1.7", 8889, null, 5000);
}
+ // 测试通过
+ // Y8
+ @Test
+ public void testLink() {
+ String s = api.GenerateRandom(16);
+ System.out.println(s);
+ }
+
@After
public void after() {
try {
@@ -1407,20 +1415,23 @@ public class TestAllMethods {
"ODAMBggqgRzPVQGDdQUAA0gAMEUCIG0PqR+bbdNOb5Q4kfHq8cQZJ1wa/P+bqFfv\n" +
"6bbL9RZCAiEAiH1LKCjq9p7MS7qOK+su5I0kenCQ505ZuuAWDMph0xk=\n" +
"-----END CERTIFICATE-----";
- System.out.println(api.importCert(getSafeBytes(cert), null));
- }
+ String cert2 = "-----BEGIN CERTIFICATE-----\n" +
+ "MIIB4TCCAYSgAwIBAgIIPJMAAAAAACswDAYIKoEcz1UBg3UFADAmMQswCQYDVQQG\n" +
+ "EwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QwHhcNMTcxMTE3MDIzMDUxWhcN\n" +
+ "MjMwMTI1MDIzMDUxWjBZMQswCQYDVQQGEwJDTjELMAkGA1UECAwCWkoxCzAJBgNV\n" +
+ "BAcMAkhaMQ4wDAYDVQQKDAVISkpZUzERMA8GA1UECwwIMDAwMDAwMDAxDTALBgNV\n" +
+ "BAMMBDIyMjIwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATxqegqlmc/lduzBaKR\n" +
+ "EyeNuPf78RA3wfJuhAv8zymLwQ6doefs1Iul+kMOukhfwY9aEhVdqws34FZMm2vs\n" +
+ "1+wXo2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYD\n" +
+ "VR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFHfjFl72707A\n" +
+ "6s+YVuGvEuyvFWTMMAwGCCqBHM9VAYN1BQADSQAwRgIhALzg7+QW7RU4phv+4arE\n" +
+ "v0IOeaA6dtR8VT4Bwin9oHTWAiEA9kLESGiYm8L5Htf7GBXgH+pk7BJ68clml41B\n" +
+ "/ejZglI=\n" +
+ "-----END CERTIFICATE-----";
- public static byte[] getSafeBytes(String s) {
- if (null != s) {
- byte[] b1 = s.getBytes();
- byte[] b2 = new byte[b1.length + 1];
- b2[b1.length] = 0;
- System.arraycopy(b1, 0, b2, 0, b1.length);
- return b2;
- } else {
- return new byte[]{0};
- }
+ String jgh = "00000000";
+ System.out.println(api.importCert(Util.getSafeBytes(cert2), jgh.getBytes()));
}
@@ -1645,11 +1656,27 @@ public class TestAllMethods {
@Test
public void testGetX509CertFileC() {
String userId = "8012";
+ String userId2 = "8001";
- String s = api.GetX509CertFileC(userId, 0);
+ String s = api.GetX509CertFileC(userId2, 0);
System.out.println(s);
+ X509 x509 = api.GetX509CertInfo(s);
+ System.out.println("颁发者DN为: " + x509.getIssuer());
+ System.out.println("证书主题: " + x509.getSubject());
+ }
+ // 8017
+ @Test
+ public void testGetX509CertFileBySN() {
+ String sn = "1004282452";
+ String sn2 = "3C93000000000025";
+
+ String s = api.GetX509CertFileBySN(sn2, 0);
+ System.out.println(s);
+ X509 x509 = api.GetX509CertInfo(s);
+ System.out.println("证书序列号: " + x509.getSerialNumber());
+ System.out.println("证书主题DN: " + x509.getSubject());
}
// 测试通过
diff --git a/src/test/java/com/sunyard/sydapi/test/TestGSYH.java b/src/test/java/com/sunyard/sydapi/test/TestGSYH.java
index ce5d2e6..daaecca 100644
--- a/src/test/java/com/sunyard/sydapi/test/TestGSYH.java
+++ b/src/test/java/com/sunyard/sydapi/test/TestGSYH.java
@@ -8,6 +8,7 @@ import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
+import java.io.IOException;
import java.util.Base64;
/**
@@ -25,7 +26,7 @@ public class TestGSYH {
public void before() {
// 通过设置debug的属性开启debug,如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
- api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
+ api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000);
}
@@ -92,16 +93,16 @@ public class TestGSYH {
// 测试通过
// 8017
@Test
- public void testGetX509CertFileC() {
- String userId = "8001";
+ public void testGetX509CertFileBySN() {
+ String sn2 = "3C93000000000025";
/**
- * 通过使用者 ID 获取的 X509 证书文件。
- * @param userId 使用者的 ID,最大长度为 16 位数字(要与生成实体的机构号保持一致)。
+ * 通过证书序号 sn 获取的 X509 证书文件。
+ * @param sn sn,证书序号
* @param nCertType 证书类型,0:签名证书, 1:加密证书
* @return base64 编码的证书
*/
- String s = api.GetX509CertFileC(userId, 1);
+ String s = api.GetX509CertFileBySN(sn2, 0);
System.out.println(s);
/**
@@ -111,8 +112,36 @@ public class TestGSYH {
* 证书信息类,包含:颁发者DN、 证书序列号、 证书主题、证书有效期的起始时间、证书有效期的终止时间、DER编码的公钥。
*/
X509 x509 = api.GetX509CertInfo(s);
- byte[] pubKey = x509.getPubKey();
- System.out.println("publicKey: " + Util.bytes2HexString(pubKey));
+ System.out.println("证书主题DN: " + x509.getSubject());
+ }
+
+ @Test
+ public void testImportCert2() throws IOException {
+
+ String cert2 = "-----BEGIN CERTIFICATE-----\n" +
+ "MIIB4TCCAYSgAwIBAgIIPJMAAAAAACswDAYIKoEcz1UBg3UFADAmMQswCQYDVQQG\n" +
+ "EwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QwHhcNMTcxMTE3MDIzMDUxWhcN\n" +
+ "MjMwMTI1MDIzMDUxWjBZMQswCQYDVQQGEwJDTjELMAkGA1UECAwCWkoxCzAJBgNV\n" +
+ "BAcMAkhaMQ4wDAYDVQQKDAVISkpZUzERMA8GA1UECwwIMDAwMDAwMDAxDTALBgNV\n" +
+ "BAMMBDIyMjIwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATxqegqlmc/lduzBaKR\n" +
+ "EyeNuPf78RA3wfJuhAv8zymLwQ6doefs1Iul+kMOukhfwY9aEhVdqws34FZMm2vs\n" +
+ "1+wXo2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYD\n" +
+ "VR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFHfjFl72707A\n" +
+ "6s+YVuGvEuyvFWTMMAwGCCqBHM9VAYN1BQADSQAwRgIhALzg7+QW7RU4phv+4arE\n" +
+ "v0IOeaA6dtR8VT4Bwin9oHTWAiEA9kLESGiYm8L5Htf7GBXgH+pk7BJ68clml41B\n" +
+ "/ejZglI=\n" +
+ "-----END CERTIFICATE-----";
+
+ String organizationId = "00000000";
+
+ /**
+ * 上传指定证书到加密设备
+ * @param certData 证书的字节数组
+ * @param organizationId 机构号的字节数组
+ * @return
+ */
+ RetWrap retWrap = api.importCert(Util.getSafeBytes(cert2), organizationId.getBytes());
+ System.out.println(retWrap);
}
@Test