Поведение Java trustmanager для просроченных сертификатов

Игнорирует ли реализация TrustManager Java, если срок действия сертификата истек?
Я пробовал следующее:
- Используя keytool и параметр -startdate "1970/01/01 00:00:00" , я создал хранилище ключей P12 с просроченным сертификатом.
- Я экспортировал сертификат:

Keystore type: PKCS12
Keystore provider: SunJSSE

Your keystore contains 1 entry

Alias name: fake
Creation date: 5 ╠ά± 2011
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
Serial number: -1c20
Valid from: Thu Jan 01 00:00:00 EET 1970 until: Fri Jan 02 00:00:00 EET 1970
Certificate fingerprints:
         MD5:  A9:BE:3A:3D:45:24:1B:4F:3C:9B:2E:02:E3:57:86:11
         SHA1: 21:9D:E1:04:09:CF:10:58:73:C4:62:3C:46:4C:76:A3:81:56:88:4D
         Signature algorithm name: SHA1withRSA
         Version: 3


*******************************************

Я использовал этот сертификат как сертификат сервера для Tomcat.
Затем, используя apache httpClient, я подключился к tomcat, но сначала я добавил просроченный сертификат в доверительное хранилище клиента (используя TrustManager

TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

и загрузив просроченный сертификат).
Я ожидал, что соединение прервется.
Вместо этого соединение установлено.
Используя System.setProperty ("javax.net.debug", "ssl");
Я вижу:

***
Found trusted certificate:
[
[
  Version: V3
  Subject: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun RSA public key, 1024 bits
  modulus: 10350555024148635338735220482157687267055139906998169922552357357346372886164908067983097037540922519808845662295379579697361784480052371935565129553860304254832565723373586277732296157572040989796830623403187557540749531267846797324326299709274902019299
  public exponent: 65537
  Validity: [From: Thu Jan 01 00:00:00 EET 1970,
               To: Fri Jan 02 00:00:00 EET 1970]
  Issuer: CN=Malicious, OU=Mal, O=Mal, L=Fake, ST=GR, C=GR
  SerialNumber: [   -1c20]

]

Я вижу, что в рукопожатии TLS истекший сертификат отправляется соединителем Tomcat.
Но клиент (то есть TrustManager) не отклоняет соединение.
Это поведение по умолчанию?
Могу ли я как-то настроить Trustmanager для проверки истечения срока действия?

ОБНОВЛЕНИЕ:
Я обнаружил, что на самом деле используется TrustManager X509TrustManagerImpl. Здесь X509TrustManagerImpl говорит, что этот класс имеет минимальную логику. Может быть, я использую неправильный TrustManager?

ОБНОВЛЕНИЕ 2: Из javadoc X509TrustManager неясно, проверяет ли он истечение срока действия сертификата

void checkServerTrusted(X509Certificate[] chain,String authType)
                                throws CertificateException  

Учитывая частичное или полное цепочка сертификатов, предоставленная одноранговый узел, создайте путь сертификата к доверенный корень и вернуть, если это возможно проверено и доверено для сервера SSL-аутентификация на основе тип аутентификации. тип - алгоритм обмена ключами часть набора шифров представлен как строка, например «RSA», «DHE_DSS». Примечание: для некоторых экспортируемые наборы шифров, ключ алгоритм обмена определен на время работы во время рукопожатия. За например, для TLS_RSA_EXPORT_WITH_RC4_40_MD5, authType должен быть RSA_EXPORT, когда эфемерный ключ RSA используется для ключа обмен, и RSA, когда ключ от сертификат сервера используется. При проверке учитывается регистр.

Спасибо

13
задан Cratylus 5 March 2011 в 22:21
поделиться