Я поражен, что это не обман, но я не смог найти хорошего.
Несмотря на то, что Bouncy в порядке и имеет много функций, если вы хотите его использовать, ядро Java может обрабатывать сертификаты X.509 с тех пор и навсегда. Для сертификата в файле (или в любом другом месте, к которому можно получить доступ в виде потока) в или формате PEM или DER (хотя javadoc не совсем понятен) все, что вам нужно, это CertificateFactory :
CertificateFactory fact = CertificateFactory.getInstance("X.509");
// from a real file
InputStream is = new FileInputStream ("filename");
Certificate cert = fact.generateCertificate(is);
is.close(); // or use try-resources to do automatically
// from an alternate/custom filesystem, such as a ZIP
Path p = Paths.get("somespecification"); // or any other creation of a Path
InputStream is = Files.newInputStream(p); // add open options if needed
// same as before
// from the classpath (usually a JAR)
InputStream is = ClassLoader /*or any Class<?> object*/ .getResourceAsStream("name");
// same as before
// from a byte[] in memory
InputStream is = new ByteArrayInputStream (bytearray);
// same as before, except don't really need to close
// you get the idea
Хотя API-интерфейсы JCA, подобные этому, определены для расширения, чтение сертификата X.509 фактически даст вам не просто Certificate
, а подкласс X509Certificate
, из которого .getNotAfter()
дает дату и время истечения срока действия напрямую. Адрес электронной почты, если он присутствует (который не требуется сертификатами X.509 в целом, но всегда должен иметь место в сертификате, используемом для S / MIME), обычно будет атрибутом имени субъекта, которое на самом деле имеет внутреннюю структуру, котораяJava не позволяет вам напрямую, поэтому вам нужно:
String x500name = ((X509Certificate)cert).getSubjectX500Principal()) .toString();
// simple case: no multivalue RDN, no reserved chars ,+="<>\;# or extra spaces
for( String attr : x500name.split(", ") )
if( attr.startsWith("EMAILADDRESS=") )
... use attr.substring(13) ...
// other cases require slightly more complicated parsing
Обратите внимание, что в X.509 вообще нет шифрования и, следовательно, нет фактического дешифрования, хотя многие люди используют для расшифровки «расшифровывать»ничего незнакомого, а не настоящий шифр.