Как получить даты истечения срока действия SSL-сертификата из SSLContext? - PullRequest
0 голосов
/ 04 февраля 2020

В настоящее время я читаю сертификаты и ключи из файла pem в моей программе Java и использую его для создания объекта SSLContext следующим образом -

final SslContext _sslContext = SslContextBuilder.forClient().ciphers(ciphers)
      .sslProvider(sslProvider).trustManager(_trustedCerts).keyManager(_cert, _key, pwd).build();

Где _cert, _key - файлы.

Можно ли каким-либо образом использовать этот объект SSLContext, чтобы получить даты истечения срока действия сертификата и DN?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Мне удалось напрямую получить информацию о сертификате из файла pem. Вот как я это сделал программно в Java -

CertificateFactory fact = null;
try {
    fact = CertificateFactory.getInstance("X.509");
} catch (CertificateException e) {
    e.printStackTrace();
}
FileInputStream is = null;
try {
    is = new FileInputStream(_cert);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
X509Certificate cer = null;
try {
    cer = (X509Certificate) fact.generateCertificate(is);
    log.info("Cer Not Before - {} ", cer.getNotBefore());
    log.info("Cer Not After - {} ", cer.getNotAfter());
    log.info("Cer Issuer DN - {} ",cer.getIssuerDN());
} catch (CertificateException e) {
    e.printStackTrace();
}

Этот ответ на стеке помог мне решить эту проблему: Как загрузить сертификат c publi из файла pem? .

0 голосов
/ 04 февраля 2020

Вы можете найти даты истечения срока действия сертификатов SSL ( X509Certificate ), которые были отправлены одноранговому узлу во время рукопожатия следующим образом:

public Map<BigInteger, CertificateInfo> getCertificatesExpiryDatesAndDistinguishedNames(SslContext context) {
  SSLSessionContext sessionContext = context.sessionContext();
  return Collections.list(sessionContext.getIds()).stream()
          .map(sessionContext::getSession)
          .map(SSLSession::getLocalCertificates) // certificate(s) that were sent to the peer during handshaking
          .map(Stream::of)
          .map(streamOfCertificates -> streamOfCertificates.map(X509Certificate.class::cast))
          .flatMap(Function.identity())
          .collect(toMap(X509Certificate::getSerialNumber, this::convertToCertificateInfo));
}

private CertificateInfo convertToCertificateInfo(final X509Certificate certificate) {
  return new CertificateInfo(certificate.getIssuerX500Principal(), certificate.getNotAfter());
}

Возвращает карту серийных номеров сертификатов и информация о сертификате (отличительное имя эмитента и дата окончания срока действия):

public class CertificateInfo {

  private final X500Principal x500Principal;
  private final Date endDateOfValidityPeriod;

  public CertificateInfo(X500Principal x500Principal, Date endDateOfValidityPeriod) {
    this.x500Principal = x500Principal;
    this.endDateOfValidityPeriod = endDateOfValidityPeriod;
  }

  public X500Principal getX500Principal() {
    return x500Principal;
  }

  public Date getEndDateOfValidityPeriod() {
    return endDateOfValidityPeriod;
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...