需引入bcprov-jdk15on-1.68包
package com.reach.platform.commons.core.utils;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.Extensions;
import sun.misc.BASE64Decoder;
import java.io.ByteArrayInputStream;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
public class CertParseUtil {
public static org.bouncycastle.asn1.x509.Certificate getCert(String base64cert) {
try {
byte[] buffer = new BASE64Decoder().decodeBuffer(base64cert);
ByteArrayInputStream bIn = new ByteArrayInputStream(buffer);
ASN1InputStream dIn = new ASN1InputStream(bIn);
ASN1Sequence seq = (ASN1Sequence) dIn.readObject();
org.bouncycastle.asn1.x509.Certificate cert = org.bouncycastle.asn1.x509.Certificate.getInstance(seq);
return cert;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getVersion(org.bouncycastle.asn1.x509.Certificate cert) {
return String.valueOf(cert.getVersion());
}
public static String getSerialNumber(org.bouncycastle.asn1.x509.Certificate cert) {
return cert.getSerialNumber().getValue().toString(16);
}
public static String getSignatureAlgorithm(org.bouncycastle.asn1.x509.Certificate cert) {
return cert.getSignatureAlgorithm().getAlgorithm().getId();
}
public static String getIssuer(org.bouncycastle.asn1.x509.Certificate cert) {
return cert.getIssuer().toString();
}
public static String getStartDate(org.bouncycastle.asn1.x509.Certificate cert) {
String num = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cert.getStartDate().getDate());
return num;
}
public static String getEndDate(org.bouncycastle.asn1.x509.Certificate cert) {
String num = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cert.getEndDate().getDate());
return num;
}
public static String getSubject(org.bouncycastle.asn1.x509.Certificate cert) {
return cert.getSubject().toString();
}
public static String getPK(org.bouncycastle.asn1.x509.Certificate cert) {
try {
String pk = cert.getSubjectPublicKeyInfo().getPublicKeyData().toString();
if (getSignatureAlgorithm(cert).equals("1.2.156.10197.1.501")) {
pk = pk.substring(7, pk.length());
} else {
pk = pk.substring(9, pk.length());
}
return pk;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static byte[] getExtensionBytes(String oid, Extensions exts) {
if (exts != null) {
Extension ext = exts.getExtension(new ASN1ObjectIdentifier(oid));
if (ext != null) {
return ext.getExtnValue().getOctets();
}
}
return new byte[0];
}
public static String getOnlyCode(org.bouncycastle.asn1.x509.Certificate cert) {
String id = cert.getSignatureAlgorithm().getAlgorithm().getId();
return new String(getExtensionBytes("1.2.156.10197.1.501", cert.getTBSCertificate().getExtensions()));
}
public static String getDN(String subject, String item) {
String str = "";
String[] sdn = subject.split(",");
for (int ii = 0; ii < sdn.length; ii++) {
String[] stmp = sdn[ii].split("=");
if (stmp[0].trim().equalsIgnoreCase(item)) {
str = stmp[1].trim();
return str;
}
}
return str;
}
public static X509Certificate getRSACert(String base64cert) {
try {
base64cert = "-----BEGIN CERTIFICATE-----\n" + base64cert;
base64cert = base64cert + "\n-----END CERTIFICATE-----";
ByteArrayInputStream stream = new ByteArrayInputStream(base64cert.getBytes());
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate c1 = cf.generateCertificate(stream);
X509Certificate cert = (X509Certificate) c1;
return cert;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getVersion(X509Certificate cert) {
return String.valueOf(cert.getVersion());
}
public static String getSerialNumber(X509Certificate cert) {
return cert.getSerialNumber().toString(16);
}
public static String getSignatureAlgorithm(X509Certificate cert) {
return cert.getSigAlgOID();
}
public static String getIssuer(X509Certificate cert) {
return cert.getIssuerDN().toString();
}
public static String getStartDate(X509Certificate cert) {
String num = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cert.getNotBefore());
return num;
}
public static String getEndDate(X509Certificate cert) {
String num = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cert.getNotAfter());
return num;
}
public static String getSubject(X509Certificate cert) {
return cert.getSubjectDN().toString();
}
public static String getOnlyCode(X509Certificate cert) {
return cert.getExtensionValue("1.2.156.112578.1").toString();
}
public static void main(String[] args) {
//sm2公钥base64
// String base64Code = "MIIC0zCCAnegAwIBAgIMYGcAAAEygQbJTT0ZMAwGCCqBHM9VAYN1BQAwYTELMAkGA1UEBhMCQ04xDzANBgNVBAgMBmZ1amlhbjEtMCsGA1UECgwkRnVqaWFuIERpZ2l0YWwgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MRIwEAYDVQQDDAlGSkNBRkNTTTIwHhcNMjEwNDA3MTYwMDAwWhcNMjEwNDA5MTU1OTU5WjAjMQswCQYDVQQGEwJDTjEUMBIGA1UEAwwL6buE5pONLTA4XzEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQra2omRFYO3d09/w3Lao3EAUXn0GmzqVOlqInkHJx0yojFEJzrZO9FY9jA55nVjY6mFpxGSNOcYC/zWC3iomNMo4IBTzCCAUswDAYDVR0TBAUwAwEBADATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMCAMAwEQYJYIZIAYb4QgEBBAQDAgCAMCYGCCqBHNAUBAEBBBozNTA3ODExOTkwMTEyMDAwMTRzaXQtMDhfMTAfBgNVHSMEGDAWgBSQOydnpjCYvWgkB3AklcH7MmogITBOBgNVHR8ERzBFMEOgQaA/hj1odHRwOi8vMjAyLjEwOS4xOTQuMjMwOjg4ODAvZG93bmxvYWQvRkpDQUZDU00ycGFydDRncm91cDguY3JsME4GCCsGAQUFBwEBBEIwQDA+BggrBgEFBQcwAoYyaHR0cDovLzIwMi4xMDkuMTk0LjIzMDo4ODgwL2Rvd25sb2FkL0ZKQ0FGQ1NNMi5jZXIwHQYDVR0OBBYEFLMSG2TplEpiEChhnMyMxHLX72cyMAwGCCqBHM9VAYN1BQADSAAwRQIgc0dszjYko7v4yYvThMp/yUZ8O2J0NngzqPrbdsvMeZICIQCkUvTrUZOPtIhA5t/ZJISlv1ylWIQR7wA66Clj7IEcvg==";
// String base64Code = "MIIENTCCA9mgAwIBAgIQaeIAAAEIWbXgRIngs6+C0zAMBggqgRzPVQGDdQUAMGIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAnnpo/lu7rnnIExLTArBgNVBAoMJEZ1amlhbiBEaWdpdGFsIENlcnRpZmljYXRlIEF1dGhvcml0eTEQMA4GA1UEAwwHRkpDQVNNMjAeFw0yMTAxMTIxNjAwMDBaFw0yMjAxMTMxNTU5NTlaMF4xCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAnnpo/lu7rnnIExEjAQBgNVBAcMCeemj+W3nuW4gjEnMCUGA1UEAwwe5qyn6Ziz56uL77yI5rWL6K+V5LiT55So5LiJ77yJMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAER55SlRkM5Xb0u0fjSL//nG/XDNxVChT1NLtqZN/hEVDQJDaj7tGUlIdQchXgliX/Z/W+kvfqD6hIqirwcznmpaOCAnEwggJtMAwGA1UdEwQFMAMBAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMAsGA1UdDwQEAwIAwDAiBgcqgRyG70IBBBc2MDE2QDIwOTRAMDAwMDAxMjMzNDY2MzAeBggqgRzQFAQBAQQSMzUwMTAyMTk4NzAyMjYyODFYMB8GA1UdIwQYMBaAFNOyMO38peg+Oq5so8pPvMgN4yZ1MIHSBgNVHR8EgcowgccwgcSggcGggb6GgY5sZGFwOi8vMjAyLjEwOS4xOTQuMjI5OjM4OS9DTj1GSkNBU00yLENOPUZKQ0FTTTIsIE9VPUNSTERpc3RyaWJ1dGVQb2ludHMsIGM9Y24/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVjdGNsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50hitodHRwOi8vMjAyLjEwOS4xOTQuMjI5L2Rvd25sb2FkL0ZKQ0FTTTIuY3JsMIHXBggrBgEFBQcBAQSByjCBxzCBiwYIKwYBBQUHMAKGf2xkYXA6Ly8yMDIuMTA5LjE5NC4yMjk6Mzg5L0NOPUZKQ0FTTTIsQ049RkpDQVNNMiwgT1U9Y0FDZXJ0aWZpY2F0ZXMsIGM9Y24/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRpZmljYXRpb25BdXRob3JpdHkwNwYIKwYBBQUHMAKGK2h0dHA6Ly8yMDIuMTA5LjE5NC4yMjkvZG93bmxvYWQvRkpDQVNNMi5jZXIwHQYDVR0OBBYEFGXFp+wmBkDulfWncILAJ0xxV1o3MAwGCCqBHM9VAYN1BQADSAAwRQIgfByWDh5cHODlx50S+OsQ32JWZdXhu6X5H38sBH+kXRkCIQDj9IfdLP4GXN5Cvl7FZj/UZjOMQS4/D2G4SFx3VvLOAA==";
//rsa公钥base64
String base64Code = "MIIFODCCBCCgAwIBAgIQA/8AAAAiUQeb5I8J2sXIITANBgkqhkiG9w0BAQUFADBcMQswCQYDVQQGEwJDTjEPMA0GA1UECAwGZnVqaWFuMS0wKwYDVQQKDCRGdWppYW4gRGlnaXRhbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDTALBgNVBAMMBEZKQ0EwHhcNMTgwNzAyMTYwMDAwWhcNMTkwNzAzMTU1OTU5WjB/MQswCQYDVQQGEwJDTjESMBAGA1UECAwJ56aP5bu655yBMRIwEAYDVQQHDAnnpo/lt57luIIxSDBGBgNVBAMMP+emj+W7uueRnuacr+S/oeaBr+enkeaKgOaciemZkOWFrOWPuO+8iOS4muWKoeS4k+eUqOS6jOWNgeWFq++8iTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1jc4lO0jGQSU8OQAHOZZmZCum0H0hOqop8HJkDmbmPLYD3ZItbgaDZyeyHAj9FGuwRCzTpDA3iP4DULTMpfOwMJH9QKQvjxYFluQEpOIq9Bxkc7cIddjScVYb01cSV/XOT9kBKhkNGCMvXKoMdtLat6oyv9OAiPBT9sq9W3YS4MCAwEAAaOCAlUwggJRMAwGA1UdEwQFMAMBAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgDoMCIGByqBHIbvQgEEFzYwMTZAMTA1OUAwMDAwMDEwNDI4NDI0MB4GCCqBHNAUBAEDBBI5MTM1MDEwMjA1MjMwNzE1MUQwHwYDVR0jBBgwFoAU+zBVFXwtgR+F1qdDcLDTGLR0qKowgckGA1UdHwSBwTCBvjCBu6CBuKCBtYaBiGxkYXA6Ly8yMDIuMTA5LjE5NC4yMjk6Mzg5L0NOPUZKQ0EsQ049RkpDQSwgT1U9Q1JMRGlzdHJpYnV0ZVBvaW50cywgYz1jbj9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0Y2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnSGKGh0dHA6Ly8yMDIuMTA5LjE5NC4yMjkvZG93bmxvYWQvRkpDQS5jcmwwgc4GCCsGAQUFBwEBBIHBMIG+MIGFBggrBgEFBQcwAoZ5bGRhcDovLzIwMi4xMDkuMTk0LjIyOTozODkvQ049RkpDQSxDTj1GSkNBLCBPVT1jQUNlcnRpZmljYXRlcywgYz1jbj9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlmaWNhdGlvbkF1dGhvcml0eTA0BggrBgEFBQcwAoYoaHR0cDovLzIwMi4xMDkuMTk0LjIyOS9kb3dubG9hZC9GSkNBLmNlcjAdBgNVHQ4EFgQUqJHG6K43u3PtSmB/uhkmIQ92hVYwDQYJKoZIhvcNAQEFBQADggEBANGQ4+Yk/o2W7wIt7LxMBls/zAdS3k4rVQ1945pijuroPK+isjnfRxRdFGsSSGA2QFYaaxqy2VPFVUbDKHBA0FqJza4XqN9oEnEM/fL8sxb4oBy5XgqDEb6rlkJQzqzfcTCMz7W3WJWMUYorNgX92DSSQNHbx3m5YUAXNtzEZdAEhh6Ki0JV3+x/pbrfnFdibqyCfshLc7y4neaRbMR32tDo5Hq5MtJwHUNwhCr4MKV+BIBWFryXCS9LYu0wOM8NyX3qBzbz32gxiB/gmIexdQnGDYQ4up3DAli5TYmH8iZfztJvCtsPpCjgzrbG7uQftwUBXs8svBKtoY8mnM7Oh30=";
//String base64Code="MIIFXDCCBESgAwIBAgIQA/8AAAAevQzBkQiYiKosbzANBgkqhkiG9w0BAQUFADBcMQswCQYDVQQGEwJDTjEPMA0GA1UECAwGZnVqaWFuMS0wKwYDVQQKDCRGdWppYW4gRGlnaXRhbCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDTALBgNVBAMMBEZKQ0EwHhcNMTcxMjE3MTYwMDAwWhcNMjAxMDA1MDIwMzI3WjCBwjELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCeemj W7uuecgTESMBAGA1UEBwwJ56aP5bee5biCMRswGQYDVQQLDBI5MTM1MDEwMjA1MjMwNzE1MUQxJDAiBgNVBAsMG atpOivgeS5puS7heS9v eUqOS6jua1i ivlTFIMEYGA1UEAww/56aP5bu655Ge5pyv5L h5oGv56eR5oqA5pyJ6ZmQ5YWs5Y 477yI5rWL6K V5LiT55So5LqU5Y2B5LiD77yJMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDsjb08MO 1sxAfzs 85o0wLqEoLjr7vAZ/wRWpXkjA0gO/mUOhbmlJMxTuvlR633wjsm JnLcQ76MaXPdcv3mPYc6xNOw8nY8sqFx02C3X2t0HLqR0D W JxH5 su/yP8H2iOVx87ow4dnEc332PNe45fFywTSFBJ5EpzlQff7FwIDAQABo4ICNTCCAjEwDAYDVR0TBAUwAwEBADATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMCAOgwIgYHKoEchu9CAQQXNjAxNkAxMDU5QDAwMDAwMDk5OTIxNzYwHwYDVR0jBBgwFoAU zBVFXwtgR F1qdDcLDTGLR0qKowgckGA1UdHwSBwTCBvjCBu6CBuKCBtYaBiGxkYXA6Ly8yMDIuMTA5LjE5NC4yMjk6Mzg5L0NOPUZKQ0EsQ049RkpDQSwgT1U9Q1JMRGlzdHJpYnV0ZVBvaW50cywgYz1jbj9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0Y2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnSGKGh0dHA6Ly8yMDIuMTA5LjE5NC4yMjkvZG93bmxvYWQvRkpDQS5jcmwwgc4GCCsGAQUFBwEBBIHBMIG MIGFBggrBgEFBQcwAoZ5bGRhcDovLzIwMi4xMDkuMTk0LjIyOTozODkvQ049RkpDQSxDTj1GSkNBLCBPVT1jQUNlcnRpZmljYXRlcywgYz1jbj9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlmaWNhdGlvbkF1dGhvcml0eTA0BggrBgEFBQcwAoYoaHR0cDovLzIwMi4xMDkuMTk0LjIyOS9kb3dubG9hZC9GSkNBLmNlcjAdBgNVHQ4EFgQUV wNTZJd 1KNtnZUOVHEBi2UJhYwDQYJKoZIhvcNAQEFBQADggEBAMUWcW6QKjjM86WNYrIpgwsj1mhSgkDMiSAq1OnowOkHKxv/yWFLgq7x3LSoeH p5YWQfutVQmKCfu17PSaclwE8htLqOeg9XumtPoc87h4Lfrvn66SLwYf/RZh7XMLPycIaku7iF9kNRT83dzFKWdaA5l82iTccvG Tfdd7bXBpO3f/iM/neoQFgzBZlLvRPwzJhaeoffRqHOS2pVjbCC7Q1ljXAKL3vrYmebYdZ0kGlk1Vtd4FdGYkTSIjdVoLYiygGgLxiz0J3aL92b3uvMdb7qBSrX alDPHEJIHanlksfonmFD0OyLsr9sqj4BUi1 EaJkuEi8O3Bq8jkW dyc=";
//String base64Code="MIIEHTCCA8GgAwIBAgIQA/cAAAAA1kDzVTR84pIUpTAMBggqgRzPVQGDdQUAMDQxCzAJBgNVBAYTAkNOMQ8wDQYDVQQIDAZmdWppYW4xFDASBgNVBAMMC3Rlc3RmamNhc20yMB4XDTE5MDgyMzA2MDUwOVoXDTIwMDgyMjE1NTk1OVowSTELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCeemj+W7uuecgTESMBAGA1UEBwwJ56aP5bee5biCMRIwEAYDVQQDDAnnvZflsJE1XzEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATPL7DmeuHnm8NOypzWA4UqEAKX5yjn6G5QEraK29vVHSBKENeK056pc+W0ZvrAPeqCCECAMDRXay3hea3dQE3Jo4ICnDCCApgwDAYDVR0TBAUwAwEBADATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMCAMAwIgYHKoEchu9CAQQXNjAxNkAxMTYwQDAwMDAwMDAwMTUwNTUwIAYIKoEc0BQEAQMEFDM2MjUzMTE5OTExMjAxMDMzMV8xMCAGCCqBHNAUBAEEBBQzNjI1MzExOTkxMTIwMTAzMzFfMTAfBgNVHSMEGDAWgBTBAuEZk26ZbFA/IleDOEmRaVIWBDCB2gYDVR0fBIHSMIHPMIHMoIHJoIHGhoGUbGRhcDovLzE5Mi4xNjguMTMuODA6Mzg5L0NOPXRlc3RmamNhc20yLENOPXRlc3RmamNhc20yLCBPVT1DUkxEaXN0cmlidXRlUG9pbnRzLCBjPWNuP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RjbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludIYtaHR0cDovLzE5Mi4xNjguMTMuODAvZG93bmxvYWQvdGVzdGZqY2FzbTIuY3JsMIHgBggrBgEFBQcBAQSB0zCB0DCBkgYIKwYBBQUHMAKGgYVsZGFwOi8vMTkyLjE2OC4xMy44MDozODkvQ049dGVzdGZqY2FzbTIsQ049dGVzdGZqY2FzbTIsIE9VPWNBQ2VydGlmaWNhdGVzLCBjPWNuP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MDkGCCsGAQUFBzAChi1odHRwOi8vMTkyLjE2OC4xMy44MC9kb3dubG9hZC90ZXN0ZmpjYXNtMi5jZXIwHQYDVR0OBBYEFE+/fu/meKbt9J5o2N2PCafwaNmgMAwGCCqBHM9VAYN1BQADSAAwRQIgeyqmB5idIcUUWVOu+6CyDpGmHxMkwagh+uyUOqJMkRYCIQCaWLAXjwSryVl/qtOG2WnbFV3qRRNNxkdSDxNj1ieX1Q==";
org.bouncycastle.asn1.x509.Certificate cert1 = CertParseUtil.getCert(base64Code);
// 证书的基本信息
System.out.println("<<=============证书的基本信息===============>>");
System.out.println("证书版本:" + CertParseUtil.getVersion(cert1));
System.out.println("序列号:" + CertParseUtil.getSerialNumber(cert1));
System.out.println("算法标识:" + CertParseUtil.getSignatureAlgorithm(cert1));
System.out.println("颁发者:" + CertParseUtil.getDN(CertParseUtil.getIssuer(cert1), "CN"));
System.out.println("开始时间:" + CertParseUtil.getStartDate(cert1));
System.out.println("结束时间:" + CertParseUtil.getEndDate(cert1));
System.out.println("主体名:" + CertParseUtil.getSubject(cert1));
System.out.println("主体名2:" + CertParseUtil.getIssuer(cert1));
String certname = CertParseUtil.getDN(CertParseUtil.getSubject(cert1), "CN");
System.out.println("证书名称:" + certname);
System.out.println("证书算法版本:" + CertParseUtil.getOnlyCode(cert1));
// System.out.println("企业/个人名称:"+certname.substring(0, certname.lastIndexOf("(")));
// System.out.println("唯一码:"+c1.getOnlyCode(cert1));
System.out.println("PK:" + CertParseUtil.getPK(cert1));
System.out.println("<<=============证书的基本信息===============>>");
Extensions extensions = cert1.getTBSCertificate().getExtensions();
byte[] extensionBytes = CertParseUtil.getExtensionBytes("1.2.156.10260.4.1.1", extensions);
if (extensionBytes.length == 0) {
extensionBytes = CertParseUtil.getExtensionBytes("1.2.156.10260.4.1.4", extensions);
extensionBytes = CertParseUtil.getExtensionBytes("1.2.156.10260.4.1.5", extensions);
}
String s = new String(extensionBytes);
System.out.println(s);
}
}