com.ibm.jsse2.util.h: доверенный сертификат не найден - PullRequest
0 голосов
/ 07 ноября 2019

В нашем приложении на базе IBM Domino мы собираемся интегрироваться с системой, использующей REST API.

Однако недавно мы столкнулись с проблемой, которая кажется очень сложной для решения.

При отправкезапрос, мы получаем следующее исключение

Error while executing JavaScript action expression
Script interpreter error, line=14, col=32: Error calling method 'initializeAuthProcess(string, string)' on java class 'ru.iteko.egrz.requestprocessors.EGRZAuthorization'
com.ibm.jsse2.util.h: No trusted certificate found
No trusted certificate found

Причина, по которой это так стыдно, заключается в отсутствии документации и каких-либо руководств, почему все это происходит.

Итак, есть щелчокдействие над кнопкой, например, так:

 <xp:eventHandler event="onclick" submit="true"
    refreshMode="complete">
    <xp:this.action><![CDATA[#{javascript:
    var redirectUrl = 'https://oursystem.ru';
    var errorRedirectUrl = 'https://oursystem.ru/errorPage';

    var EGRZAuthObject = new ru.iteko.egrz.requestprocessors.EGRZAuthorization();

    EGRZAuthObject.initializeAuthProcess(redirectUrl, errorRedirectUrl);

    }]]></xp:this.action>
 </xp:eventHandler>

В экземпляре класса EGRZAuthorization есть следующий метод с именем

public static void initializeAuthProcess(String redirectUrl, String apiRedirectUrl) throws ClientProtocolException, IOException 
{
    CloseableHttpClient httpclient = HttpClients.createDefault();
    String urlToGoTo = AuthURLs.ESIALoginURL(redirectUrl, apiRedirectUrl);
    System.out.println(urlToGoTo);
    HttpGet httpGet = new HttpGet(urlToGoTo);
    CloseableHttpResponse response1 = httpclient.execute(httpGet);
    System.out.println("resp code " + response1.getStatusLine());
    response1.close();
}

Исключение возникает при выполнении запроса.

Stacktrace:

com.ibm.jsse2.util.h: No trusted certificate found
    com.ibm.jsse2.util.g.a(g.java:183)
    com.ibm.jsse2.util.g.b(g.java:43)
    com.ibm.jsse2.util.e.a(e.java:4)
    com.ibm.jsse2.aB.a(aB.java:211)
    com.ibm.jsse2.aB.a(aB.java:5)
    com.ibm.jsse2.aB.checkServerTrusted(aB.java:49)
    com.ibm.jsse2.E.a(E.java:166)
    com.ibm.jsse2.E.a(E.java:121)
    com.ibm.jsse2.D.r(D.java:223)
    com.ibm.jsse2.D.a(D.java:198)
    com.ibm.jsse2.at.a(at.java:649)
    com.ibm.jsse2.at.i(at.java:627)
    com.ibm.jsse2.at.a(at.java:689)
    com.ibm.jsse2.at.startHandshake(at.java:432)
    org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)
    org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)
    org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
    org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:374)
    org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
    org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
    org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    ru.iteko.egrz.requestprocessors.EGRZAuthorization.initializeAuthProcess(EGRZAuthorization.java:32)

Вот умный бит. Переменная urlToGoTo равна http://lk.egrz-test.i-teco.ru/fws/api/esia/login?errorRedirectUrl=https://oursystem.ru/errorPage&redirectUrl=https://oursystem.ru

И она перенаправляет пользователя на внешний ресурс для авторизации.

Подводя итог, как все это выглядит:

  1. Мы отправляем запрос GET на urlToGoTo
  2. Затем эта служба перенаправляет нас на ресурс, который использует HTTPS (если это имеет значение)

Но мы можемдаже не вижу, потому что получить исключение выше. Запрос вообще не выполняется.

Мы уже установили требуемый сертификат (внешний источник, аутентификация, HTTPS, куда мы перенаправлены в конце) и перекрестно сертифицировали его. Но все же безуспешно.

Я надеюсь, что есть какое-то решение, пожалуйста, помогите. Лично я понятия не имею, почему это происходит.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Ну, способ исправить это следующим образом:

sudo /*path to ikeycmd*/ -cert -add -db /*path to cacerts*/ -file /*path to ssl certificate*/ -format binary -trust enable -type jks

Может потребоваться ввести пароль. По умолчанию changeit

Лучше импортировать всю цепочку

Затем выполнить команду res ser в Domino Administrator.

Теперь это должно работать

2 голосов
/ 08 ноября 2019

Вы можете получить доступ к сайту с отключенной проверкой сертификатов. Я настоятельно советую против этого. Это была бы дыра безопасности размером с дверь сарая. Но если вам нужно, вы можете использовать easyTrustManager, как описано здесь: https://wissel.net/blog/2007/08/ssl-in-domino-agents.html

    public class HttpsCommonFetcher { 

        /** Log object for this class. */ 
        private static final Log LOG = LogFactory. getLog(HttpsCommonFetcher. class); 

        public String getContentFromHTTP(String xRequest, String targetURL; String method) { 
                String result = null; 
                HttpMethod httpMethod = null; 

                // This implementation uses the HTTP Common client from the 
                // Apache jakarta Project. See: http://jakarta.apache.org/httpcomponents/index.html 
                // and http://jakarta.apache.org/commons/httpclient/sslguide.html 
                // We use the EasySSL Implementation to avoid SSL configuration stress 

                String hostwithoutSSL = this.targetURL.substring(8); 
                LOG.info(hostwithoutSSL); 

                // We use the simple SSL methods that doesn't compare with the keystore remove the 2 lines if you intend to config SSL 
                        Protocol myhttps = new Protocol("https", 
                                        new EasySSLProtocolSocketFactory(), 443); 
                        Protocol. registerProtocol("https", myhttps); 

                HttpClient httpclient = new HttpClient(); 

                // Here would be the optional Proxy code                 
                // httpclient.getHostConfiguration().setProxy(pHost, pPort); 
           if (method.qualsIgnoreCase( "POST" )) { 
                        // We only support get and post and if it is not POST it is GET 
                        PostMethod pm = new PostMethod( this . targetURL ); 
                        // Populate the body of the request 
                        RequestEntity entity = new StringRequestEntity(xRequest); 
                        pm.setRequestEntity(entity); 
                        httpMethod = (HttpMethod) pm; 
                } else { 
                        httpMethod = new GetMethod( this . targetURL ); 
                } 
                // Make sure we follow eventual redirects 
                httpMethod.setFollowRedirects( true); 

                // Now we retrieve the stuff 
                try { 
                        int statusCode = httpclient.executeMethod(httpMethod); 
                        // Here we have the result already 
                        LOG.info(httpMethod.getStatusLine()); 
                        
                        if (statusCode == HttpStatus. SC_OK ) { 
                                // Directly read it into a String ... creates a warning in 
                                // HTTPClient but is what we would do anyway. 
                                result = httpMethod.getResponseBodyAsString(); 
                        } else { 
                                result = "<error>" + httpMethod.getStatusLine() + "</error>" ; 
                        } 

                } catch (HttpException e) { 
                        LOG.error(e); 
                } catch (IOException e) { 
                        LOG.error(e); 
                } finally { 
                        httpMethod.releaseConnection(); 
                } 
                return result; 
        } 
}

...