Тип PEM 'TRUSTED CERTIFICATE' является нестандартным форматом , специфичным для OpenSSL, который Java не может обработать из коробки.На самом деле он содержит стандартный сертификат X.509 в виде одного блока DER плюс другого блока данных доверия, определенного в OpenSSL DER.
Если у вас есть OpenSSL, самый простой способ - преобразовать его в стандартныйФормат «СЕРТИФИКАТ» с openssl x509 <in >out
.Вы можете добавить -outform DER
, как Мисанторп, но это не нужно;CertificateFactory
может читать стандартный формат в DER или PEM, так как OpenSSL неточно их вызывает.
Если у вас есть или вы можете получить и использовать bcpkix и bcprov из https://www.BouncyCastle.org, они включают процедуры для обработки этогоФормат OpenSSL PEM (и многие другие):
// assumes filename in args[0], adjust as needed
Object both = new PEMParser(new FileReader(args[0])).readObject();
// should close the FileReader, maybe using try-resources
byte[] cert = ((X509TrustedCertificateBlock)both).getCertificateHolder().getEncoded();
X509Certificate good = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(new ByteArrayInputStream(cert));
System.out.println (good.getSubjectX500Principal().getName());
В противном случае можно разложить DER вручную, но неуклюже и ненадежно:
String in1 = new String(Files.readAllBytes(new File(args[0]).toPath()));
byte[] both = Base64.getMimeDecoder().decode(in1.replaceAll("-----[A-Z ]*-----\\r?\\n",""));
if( both[0]!=0x30 || both[1]!=(byte)0x82 ) throw new Exception("wrong!"); // or other handling
byte[] cert = Arrays.copyOf(both, (both[2]<<8 | both[3]&0xFF) + 4);
X509Certificate good = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(new ByteArrayInputStream(cert));
System.out.println (good.getSubjectX500Principal().getName());