Доверие просроченному самозаверяющему сертификату при вызове веб-службы

Есть веб-сервис, защищенный сертификатом. В клиентском коде, который его вызывает, CA сертификата должен присутствовать в хранилище доверенных сертификатов (JRE_path\lib\security\cacerts) - если нет, вы получаете исключение PKIX на стороне клиента.

Что произойдет, если срок действия сертификата истек - код клиента не работает.

Однако это можно обойти, добавив сертификат непосредственно в хранилище доверенных сертификатов — Доверие сертификату с истекшим сроком действия

т.е. если в доверенном хранилище присутствует сам сертификат, а не УЦ, то все работает, даже если срок действия сертификата истек.

В моем сценарии сертификат веб-сервиса является самоподписанным, поэтому мне все равно пришлось добавить его в хранилище доверенных сертификатов, и клиент продолжает нормально работать, даже когда срок действия сертификата истек.

Теперь мой вопрос: будет ли это работать во всех сценариях - моя программа - это просто программа командной строки, работающая на локальной JRE.

Если есть приложение, вызывающее веб-службу, и приложение работает в Websphere, JBoss, WebLogic, Tomcat, Glassfish и т. д., а самозаверяющий сертификат добавлен в хранилище доверенных сертификатов этой среды, могу ли я предположить, что оно будет продолжать работать (не дать просроченные ошибки)?

Я предполагаю, что это сработает, потому что эти серверы приложений также будут использовать JRE, как и любая программа, или я что-то упустил?


person user93353    schedule 02.07.2015    source источник
comment
Если вы не хотите, чтобы это было безопасно, не используйте HTTPS. Если вы хотите, чтобы он был безопасным, не пытайтесь выбирать собственные функции безопасности.   -  person user207421    schedule 02.07.2015
comment
как сказал @EJP: обычно не рекомендуется ослаблять безопасность. Но часто нам, как программистам, тоже приходится предотвращать тихий сбой приложений. Таким образом, вы должны либо убедиться, что в случае сбоя программы причина станет ясной для любого администратора, занимающегося этой проблемой, либо вы можете попытаться перехватить исключения, возникающие из-за просроченных сертификатов, или принудительно внутри вашего кода, какие сертификаты принимаются: stackoverflow.com/questions/6659360/   -  person Marged    schedule 03.07.2015
comment
Если в вашей среде есть команда openssl (установите ее). вы можете использовать его в качестве фонового приложения cmd с проверить дату и прочитать результат   -  person Ali Helmy    schedule 12.07.2015
comment
@AliHelmy Как это поможет?   -  person user93353    schedule 12.07.2015


Ответы (2)


Вы можете обойти все сертификаты с помощью кода ниже

try {
            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
                }
            } };
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());

            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HostnameVerifier allHostsValid = new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            };
            SSLContext.setDefault(sc);
            HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
            LOGGER.debug("All Certificates Have Been Trusted Successfully.");
        } catch (KeyManagementException ex) {
            LOGGER.error("Error:",ex);
        } catch (NoSuchAlgorithmException ex) {
            LOGGER.error("Error:",ex);
        } 
person Ali Helmy    schedule 10.07.2015
comment
Я знаю это. Однако это не то, что я ищу. - person user93353; 10.07.2015
comment
Можете ли вы уточнить, что вы хотите - person Ali Helmy; 10.07.2015
comment
Я хочу знать, всегда ли игнорируется истечение срока действия самозаверяющих сертификатов, если самозаверяющий сертификат присутствует в хранилище доверенных сертификатов. - person user93353; 10.07.2015
comment
Это не «обходит все сертификаты». Он просто доверяет всем сертификатам. OP необходимо удалить проверки истечения срока действия, которые происходят до того, как это может быть вызвано. И это небезопасно. @user93353 user93353 Нет, срок действия и действительность всегда проверяются. - person user207421; 12.07.2015
comment
@EJP - мне не нужен код, который удаляет проверки истечения срока действия. Мне просто нужно знать, игнорируются ли проверки истечения срока действия, если в хранилище доверенных сертификатов присутствует самоподписанный сертификат. Я проверил с помощью программы командной строки и хранилища доверия java, и оно было проигнорировано. Я хочу знать, игнорируется ли он Websphere, Weblogic и другими популярными серверами приложений. - person user93353; 12.07.2015
comment
Можете ли вы прочитать [эту статью]( javacodegeeks.com/ 2011/12/) внимательно - person Ali Helmy; 12.07.2015
comment
@AliHelmy - я прочитал это, но не уверен, как это решает мою проблему. Я не ищу код. Я ищу ответ на следующий вопрос: если я добавлю самозаверяющий сертификат в хранилище доверенных сертификатов, будет ли сертификат по-прежнему доверять после истечения срока его действия - или он вызовет исключение. Я не ищу, как игнорировать чек. Я ищу ответ (если он есть) о том, будет ли проверка истечения срока действия выполняться в weblogic, websphere и других популярных серверах приложений. Я не пытаюсь обойти проверку. Я знаю, что проверка не выполняется для хранилища доверия Java по умолчанию. - person user93353; 12.07.2015

Чтобы ответить на ваш вопрос: «Если я добавлю самозаверяющий сертификат в хранилище доверенных сертификатов, будет ли сертификат по-прежнему доверять после истечения срока его действия — или он вызовет исключение?»

Ему по-прежнему будут доверять (по крайней мере, в хранилище доверенных сертификатов java cacerts). См. https://softwareengineering.stackexchange.com/a/308538.

person Brice Roncace    schedule 07.06.2018