мне нужно игнорировать здание за исключением PKIX PathРеализация X509TrustManager - проходя по части проверки на существующей проверяющего
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderExc
ption: unable to find valid certification path to requested target
Я знаю, как сделать это, написав свой собственный класс реализации X509TrustManager
, где я всегда return true
от isServerTrusted
,
Однако я не хочу доверять всем серверам & всем клиентам.
- Я хочу, чтобы все проверки по умолчанию выполнялись для клиентов, как это делается в настоящее время.
- Для серверов я хочу игнорировать проверку сертификата сервера только для одного конкретного сертификата, но хочу продолжить и проверить его, как это делается в настоящее время (например, с использованием хранилища cacerts).
Как я могу достичь чего-то подобного, то есть передать часть проверки тому, что было объектом X509TrustFactory, прежде чем я его заменил.
т.е. это то, что я хочу сделать
public boolean isServerTrusted(X509Certificate[] chain)
{
if(chain[0].getIssuerDN().getName().equals("MyTrustedServer") && chain[0].getSubjectDN().getName().equals("MyTrustedServer"))
return true;
// else I want to do whatever verification is normally done
}
Кроме того, я не хочу нарушать существующий isClientTrusted
проверки.
Как это сделать?
+1 большое спасибо за комментарий _ "// Использование null здесь инициализирует TMF с хранилищем доверия по умолчанию." _. Было бы неплохо, если бы это было в api docs;) – Dori
Не могли бы вы объяснить и показать мне пример этой части: ** Вместо этого вы можете загрузить экземпляр X509Certificate из известной ссылки и сравнить фактическое значение в цепочке. * * – OnePunchMan
@kaze, если вы хотите сравнить * точные * сертификаты, вы можете загрузить сертификат X.509 из любого источника, который вы хотите (например, хранилище файлов PEM через CertificateFactory), тогда вы можете сравнить то, что представлено в цепочке (элемент 0) с эталонным экземпляром.Не уверен, что сравнивать «equals», но вы можете, конечно, сравнивать результаты с 'getEncoded()' на обоих экземплярах X509Certificate' (сравнение байтовых массивов, конечно, не ссылок). – Bruno