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