Игнорирует ли реализация 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, когда ключ от сертификат сервера используется. При проверке учитывается регистр.
Спасибо