Squid SSL Bump TAG_NONE / HEIR_NONE

Вопрос или проблема

У меня есть прозрачный прокси, Squid, версия 3.5.20 (последняя стабильная на данный момент). Мне нужно сделать белый список доменов. Squid настроен для выполнения SSLBumping (см. конфигурацию squid ниже).

Я пытаюсь установить Sumologic на сервер, расположенный за прозрачным NAT Squid.

Проблема в том, что Sumologic не может подключиться через прозрачный NAT. Почему он не может подключиться через приложение, а я могу использовать curl?

При установке Sumologic я получаю следующую ошибку:

javax.net.ssl.SSLHandshakeException: Удаленный хост закрыл соединение во время рукопожатия
    at sun.security.ssl.SSLSocketImpl.readRecord(Неизвестный источник)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Неизвестный источник)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Неизвестный источник)
    at sun.security.ssl.SSLSocketImpl.startHandshake(Неизвестный источник)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:141)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
    at com.sumologic.scala.collector.rest.RestClient$class.getResponse(RestClient.scala:83)
    at com.sumologic.scala.collector.rest.RestClient$class.makeGetRequest(RestClient.scala:68)
    at com.sumologic.scala.collector.auth.CollectorRegistrationManager.makeGetRequest(CollectorRegistrationManager.scala:49)
    at com.sumologic.scala.collector.rest.RestClient$class.makeRequest(RestClient.scala:119)
    at com.sumologic.scala.collector.auth.CollectorRegistrationManager.com$sumologic$scala$collector$rest$RestClientRetries$$super$makeRequest(CollectorRegistrationManager.scala:49)
    at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$makeRequest$1.apply(RestClientRetries.scala:42)
    at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$makeRequest$1.apply(RestClientRetries.scala:35)
    at com.sumologic.util.retry.Retry$.whileExceptionsAreThrown(Retry.scala:143)
    at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$withRetries$1.apply(RestClientRetries.scala:23)
    at com.sumologic.scala.collector.rest.RestClientRetries$$anonfun$withRetries$1.apply(RestClientRetries.scala:23)
    at com.sumologic.scala.collector.rest.RestClientRetries$class.makeRequest(RestClientRetries.scala:35)
    at com.sumologic.scala.collector.auth.CollectorRegistrationManager.com$sumologic$scala$collector$rest$RestClientDeploymentRedirection$$super$makeRequest(CollectorRegistrationManager.scala:49)
    at com.sumologic.scala.collector.rest.RestClientDeploymentRedirection$class.makeRequest(RestClientDeploymentRedirection.java:74)
    at com.sumologic.scala.collector.auth.CollectorRegistrationManager.makeRequest(CollectorRegistrationManager.scala:49)
    at com.sumologic.scala.collector.auth.CollectorRegistrationManager.ping(CollectorRegistrationManager.scala:361)
    at com.sumologic.scala.collector.Collector.init(Collector.scala:546)
    at com.sumologic.scala.collector.Collector$.main(Collector.scala:831)
    at com.sumologic.scala.collector.Collector.main(Collector.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Метод нативного кода)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Неизвестный источник)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Неизвестный источник)
    at java.lang.reflect.Method.invoke(Неизвестный источник)
    at org.tanukisoftware.wrapper.WrapperSimpleApp.run(WrapperSimpleApp.java:290)
    at java.lang.Thread.run(Неизвестный источник)
Причиной является: java.io.EOFException: SSL-партнер закрыл соединение неправильно
    at sun.security.ssl.InputRecord.read(Неизвестный источник)
    ... 40 больше

Если я открою PowerShell и выполню curl на ‘service.au.sumologic.com’, это работает…

PS > curl https://service.au.sumologic.com


StatusCode        : 200
StatusDescription : OK
Content           : <html>
                    <body>
                    <h2>Tweep</h2>
                    </body>
                    </html>
RawContent        : HTTP/1.1 200 OK
                    Strict-Transport-Security: max-age=15552000
                    X-Content-Type-Options: nosniff
                    X-Frame-Options: SAMEORIGIN
                    X-XSS-Protection: 1; mode=block
                    Connection: keep-alive
                    Accept-Ranges: byte...
Forms             : {}
Headers           : {[Strict-Transport-Security, max-age=15552000], [X-Content-Type-Options, nosniff],
                    [X-Frame-Options, SAMEORIGIN], [X-XSS-Protection, 1; mode=block]...}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : System.__ComObject
RawContentLength  : 44

В моем журнале доступа squid я вижу:

1470638115.212    164 172.26.192.122 TAG_NONE/200 0 CONNECT 54.252.91.36:443 - HIER_NONE/- -

что соответствует service.au.sumologic.com….

Не упустил ли я что-то в настройках squid?

Конфигурация Squid

visible_hostname squid

http_port 3129 intercept
acl allowed_http_sites dstdomain .amazonaws.com
acl allowed_http_sites dstdomain .newrelic.com
acl allowed_http_sites dstdomain .windowsupdate.com
acl allowed_http_sites dstdomain .microsoft.com
acl allowed_http_sites dstdomain ocsp.comodoca.com
acl allowed_http_sites dstdomain crl.usertrust.com
acl allowed_http_sites dstdomain ocsp.globalsign.com
acl allowed_http_sites dstdomain crl.globalsign.net


http_access allow allowed_http_sites

https_port 3130 ssl-bump intercept connection-auth=off generate-host-certificates=on dynamic_cert_mem_cache_size=8MB cert=/etc/squid/ssl/squid.pem key=/etc/squid/ssl/squid.key 
acl SSL_port port 443
http_access allow SSL_port
acl allowed_https_sites ssl::server_name .amazonaws.com
acl allowed_https_sites ssl::server_name .newrelic.com
acl allowed_https_sites ssl::server_name .microsoft.com
acl allowed_https_sites ssl::server_name .windowsupdate.com
acl allowed_https_sites ssl::server_name .sumologic.com
acl allowed_https_sites ssl::server_name .datadoghq.com

sslproxy_cert_error allow all

acl NoSSLIntercept ssl::server_name_regex -i "/etc/squid/url.nobump"
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
ssl_bump peek step1 all
ssl_bump peek step2 allowed_https_sites
ssl_bump peek step2 NoSSLIntercept
ssl_bump splice step1 NoSSLIntercept
ssl_bump splice step3 allowed_https_sites
ssl_bump terminate step2 all

http_access deny all

Строка access.log – это TCP-соединение, которое приходит и принимается для начала процесса бампинга.

Ваши правила ssl_bump говорят “подсмотреть” на шаге 1, а затем закончить на шаге 2, если клиент не отправил значение TLS SNI, содержащее одно из немногих разрешенных имен серверов в одном из acl allowed_https_sites или NoSSLIntercept.

Кажется, что Java-приложение либо не отправляет SNI, либо отправляет значение, которое не входит в белый список. Оно также сбой при неудачном TLS (завершено другим узлом).

Проверьте статус selinux

Попробуйте следующую команду

getenforce

Измените на “Permissive”

Ответ или решение

Проблемы с подключением через прокси Squid: TAG_NONE / HEIR_NONE в SSL Bump

Когда вы используете прокси-сервер Squid версии 3.5.20 с включенной функцией SSL Bump, может возникнуть ряд проблем с пропуском трафика, особенно при настройках цискас, как это произошло в вашем случае с Sumologic. Ошибка javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake, которую вы наблюдаете, указывает на то, что SSL-соединение не удалось установить. Давайте подробнее рассмотрим причины этой проблемы и возможные пути её решения.

Контекст проблемы

Вы успешно используете curl в PowerShell для доступа к https://service.au.sumologic.com, что подтверждает, что выход в интернет напрямую работает. Однако, когда вы пытаетесь это сделать из приложения Sumologic, оно не может установить соединение, что в первую очередь указывает на различия в том, как отправляются запросы между curl и вашим Java-приложением.

Важные моменты в настройках Squid

  1. Разрешения SNI: В Squid у вас определены ACL (Access Control List) для SSL Bump, включая allowed_https_sites. Убедитесь, что домен, к которому вы пытаетесь подключиться (в данном случае, sumologic.com), действительно присутствует в этой ACL.

  2. SNI и закрытие соединения: Ошибка SSLHandshakeException может произойти, если приложение не отправляет SNI (Server Name Indication) или отправляет его значение, которое не совпадает с тем, что указано в ‘allowed_https_sites’. Убедитесь, что ваше Java-приложение поддерживает и корректно отправляет SNI.

  3. Логи Squid: Лог access.log, в котором вы видите TAG_NONE/200, указывает на то, что Squid принял соединение, но не смог его обработать должным образом. Частое значение HIER_NONE также может свидетельствовать о том, что Squid не знает, как обработать трафик.

Рекомендации по устранению проблемы

  1. Проверка приложений: Убедитесь, что Java-приложение Sumologic использует правильные настройки SSL. Возможно, стоит обновить библиотеку Java или использовать другой клиент, который корректно обрабатывает SNI.

  2. Настройки SELinux: Проверьте, включен ли SELinux. Иногда он может блокировать соединения, даже если конфигурация Squid корректна. Используйте команду getenforce, чтобы проверить статус. Если он включён, попробуйте временно перевести его в режим "Permissive".

    setenforce 0
  3. Оптимизация конфигурации Squid: Сравните логи и убедитесь, что на других устройствах, которые работают в аналогичных условиях, проблем не возникает. Возможно, имеет смысл оптимизировать правила ssl_bump, добавив дополнительные условия или изменяя приоритеты.

  4. Тестирование СНП: Используйте инструменты, такие как openssl, для тестирования SNI вручную, чтобы увидеть, как сервер реагирует на запрос с определённым доменным именем. Например, вы можете выполнить следующую команду:

    echo | openssl s_client -connect service.au.sumologic.com:443 -servername service.au.sumologic.com

Заключение

Проблема с ошибкой SSLHandshakeException в вашем случае может быть связана с тем, как SSL Bump настроен на вашем Squid прокси, а также с тем, как Java-приложение обрабатывает TLS соединения. Проверьте, какие заголовки и параметры передаются вашим приложением в процессе соединения и убедитесь, что протоколы и сертификаты настроены правильно. Систематический подход к диагностике и тестированию поможет вам устранить проблему и обеспечить бесперебойную работу подключения.

Оцените материал
Добавить комментарий

Капча загружается...