Есть ли способ расшифровать данные открытого ключа S / MIME? - PullRequest
0 голосов
/ 19 октября 2019

Я хотел бы получить адрес электронной почты и дату истечения срока действия сертификата S / MIME на основе его открытого ключа. Возможен ли этот подход? Или я совершенно не прав? Могу ли я расшифровать открытый ключ, чтобы получить такие данные через Java?

Я искал в Google, прочитал вики-страницы и прочитал о проекте oracle s / mime. Но это не похоже на то, как это возможно. Эти данные доступны только в csr ??

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 19 октября 2019

Я поражен, что это не обман, но я не смог найти хорошего.

Несмотря на то, что 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 вообще нет шифрования и, следовательно, нет фактического дешифрования, хотя многие люди используют для расшифровки «расшифровывать»ничего незнакомого, а не настоящий шифр.

0 голосов
/ 19 октября 2019
    File file = new File(fileName);
    FileReader fileReader = new FileReader(file);
    PEMParser pemParser = new PEMParser(fileReader);
    X509CertificateHolder caCertificate = (X509CertificateHolder) pemParser.readObject();
...