Синхронизация Intellij/Gradle не работает за корпоративным прокси
Я за корпоративным брандмауэром (Zscaler), который переписывает трафик TLS с помощью своих собственных сертификатов.
Когда я пытаюсь создать проект Gradle в intellij, я получаю следующую ошибку, даже после импорта CA и промежуточных сертификатов в оба Intellij (через Server Certificates
страницу настроек) и в каждое хранилище доверенных Java-приложений.
Sync Failed
Download https://services.gradle.org/distributions/gradle-4.0-bin.zip 797ms
Cause: unable to find valid certification path to requested target
Я даже импортировал их в частную JRE Intellij, например
C:\Progra~1\Java\jdk1.8.0_131\bin\keytool.exe -importcert -alias zscaler_root_ca -keystore C:\Progra~1\Java\jdk1.8.0_131\jre\lib\security\cacerts -storepass changeit -file zscaler_root_ca.crt
C:\Progra~1\Java\jre1.8.0_151\bin\keytool.exe -importcert -alias zscaler_root_ca -keystore C:\Progra~1\Java\jre1.8.0_151\lib\security\cacerts -storepass changeit -file zscaler_root_ca.crt
"C:\Users\jonathan.bates\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.4301.25\jre64\bin\keytool.exe" -importcert -alias zscaler_root_ca -keystore "C:\Users\jonathan.bates\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\173.4301.25\jre64\lib\security\cacerts" -storepass changeit -file zscaler_root_ca.crt
Мне нужно делать что-то еще?
7 ответов
Сертификат, выпущенный корпорацией, должен быть включен в хранилище доверенных сертификатов, используемое Gradle. Устранение неполадок может быть затруднено, особенно если у вас установлено несколько версий Java и JRE. Первое, что нужно определить, - это то, что использует JRE Gradle. Есть ответ, указывающий на то, что проблема решена с помощью Gradle Wrapper. Gradle Упаковочный называют проект специфической среды Java, которая определена в gradle.properties. По умолчанию установлено значениеdistributionBase=GRADLE_USER_HOME
. Чтобы получить Gradle для сборки с ненадежными сертификатами, следуйте инструкциям в документации:
Сертификат SSL для серверной части кэша сборки HTTP может быть ненадежным, поскольку он предоставлен внутри компании или является самозаверяющим сертификатом.
В таком сценарии вы можете либо настроить среду сборки JVM для доверия сертификату, либо установить для этого свойства значение true, чтобы отключить проверку подлинности сервера.
Разрешение связи с ненадежными серверами сохраняет данные в зашифрованном виде во время передачи, но позволяет среднему человеку выдать себя за предполагаемый сервер и собирать данные.
Лучше импортировать сертификат в JVM, используемую Gradle, что похоже на то, что вы пытались сделать. Если вы хотите, чтобы IntelliJ знал о корпоративном сертификате, вы можете импортировать его через пользовательский интерфейс, перейдя в "Настройки"> "Инструменты"> "Сертификаты сервера". Импортируйте файл сертификата, выпущенный вашей организацией, и повторите сборку.
Для меня это сработало после того, как я удалил "принятые сертификаты" и установил флажок "Принимать недоверенные сертификаты автоматически"
Исправление: поместите корневой сертификат ZScaler в IJ
- Откройте Google Chrome
- Зайдите в настройки -> Безопасность -> Управление сертификатами
- Перейдите на вкладку «Доверенные корневые центры сертификации».
- Прокрутите вниз до пункта «ZScaler Root CA» - слово «Z», вероятно, будет рядом или внизу списка.
- Нажмите "Экспорт ..."
- Следуйте инструкциям мастера, чтобы экспортировать сертификат в виде файла .CER и сохранить его где-нибудь на вашем компьютере.
- Теперь откройте IntelliJ (IJ)
- Открыть настройки (ctrl + alt + s)
- Найдите «сертификат», чтобы отфильтровать настройки и перейдите в «Сертификаты сервера».
- Нажмите на маленький значок +
- Найдите файл, который вы только что сохранили, и снова нажмите OK и OK в настройках.
Это должно сработать.
Примечание: предполагается, что вы используете Google Chrome, корневой сертификат ZScaler уже хранится в хранилище доверенных сертификатов Chrome. Если это не ваш случай, надеюсь, вы найдете другой способ получить сертификат ZScaler Root. Худший сценарий: вы всегда можете спросить своего ИТ-отдела. Я уверен, что они управляют ZScaler и должны знать, как получить сертификат.
Более подробное обсуждение
Кажется, это общая проблема с IntelliJ (IJ) не только для задачи Gradle, но и когда IJ пытается подключиться к любому сайту HTTPS, как указано в комментарии Jon Bates:
intellij использует другое хранилище секретов для вашего терминала.
Расширяя этот комментарий, мы отмечаем из документации JetBrains:
IntelliJ IDEA предоставляет собственное хранилище для доверенных сертификатов.
Теперь, исходя из документа JetBrains и из этогоэтого ответа , один подход, который будет работать, - просто автоматически принять все недоверенные сертификаты. Чтобы понять, почему это нормальный подход, напомним, что вся проблема была создана в первую очередь из-за того, что мы стояли за ZScaler. Поскольку вы находитесь за ZScaler, вы можете быть уверены, что промежуточный сервер ZScaler, который перехватывает все ваши запросы, будет блокировать для вас любые ненадежные сайты, поэтому вам не нужно беспокоиться об этом в IJ. Другими словами, к тому времени, когда ZScaler отправит эти сертификаты в IJ, вы уже можете им доверять.
Однако проблема с этим подходом возникает, когда ваша организация разрешила вам отключить ZScaler. В этом случае, если вы отключите ZScaler, то вы больше не защищены от него. И когда вы это сделаете, вы не забудете вернуть свои настройки IJ? Возможно, но это было бы ужасной ручной нагрузкой. И, что более вероятно, вы, вероятно, не вспомните, и тогда есть вероятность, что ваш IJ может подключаться к ненадежным сайтам. Я не знаю всех деталей безопасности, поэтому, возможно, есть какие-то другие меры, принятые для предотвращения такой уязвимости, но на первый взгляд это кажется мне уязвимостью. Например, злоумышленник может создать поддельный сайт обновлений для обновления одного из ваших плагинов IntelliJ и вместо этого установить вредоносный плагин без вашего ведома. А теперь тыПо сути, на вашем компьютере есть вирус, потому что всякий раз, когда вы запускаете IJ, плагин тоже запускается и, вероятно, может делать самые разные плохие вещи.
Таким образом, более безопасный подход - буквально добраться до корня проблемы: найти корневой сертификат ZScaler и добавить его в хранилище доверенных сертификатов IJ. Тогда IJ сможет доверять этому сертификату и любым нижестоящим сертификатам, которые ZScaler выдает при перехвате вашего трафика.
Почему корневой сертификат?
Стоит отметить, что добавляемый вами корневой сертификат не совпадает с сертификатом, о котором IJ предупреждает вас при возникновении проблемы. Например, когда я попробовал «проверить наличие обновлений», сертификат, который вызывал проблему, был выдан на «* .google.com». Я считаю, что это просто сертификаты перехватчика, которые ZScaler создает, когда перехватывает ваш трафик. Настоящий сертификат для Google используется ZScaler для связи с Google. Сертификат «прокси» - это тот сертификат, который ZScaler генерирует для взаимодействия с вашей машиной. Поскольку ZScaler должен генерировать такой сертификат прокси для всех мыслимых сайтов, недостаточно просто добавить их в свое хранилище доверенных сертификатов в IJ. Не только это, но и эти прокси-сертификаты, похоже, имеют довольно короткий срок хранения - тот, который я видел, истек через две недели. Так что вам придется просто повторно добавлять их в хранилище доверенных сертификатов IJ.И тогда хранилище доверенных сертификатов IJ будет просто загромождено всеми этими временными сертификатами, созданными ZScaler. Вот почему вы хотите добавить корневой сертификат. Я считаю, что он действует как высший орган подписи для любых выдаваемых временных прокси-сертификатов. И тот, который я вижу, не истекает более 20 лет. Так что я не думаю, что мне придется еще какое-то время снова возиться с настройкой IJ.
Заметки
По сути, исправление, приведенное в этом ответе, фактически такое же, как и это , но я подробно рассказываю, как на самом деле получить сертификат ZScaler из настроек Google Chrome, и я немного обсуждаю, почему мы делаем то, что делаем. , и сравнение с альтернативами.
Для меня все настройки казались правильными, что упоминалось выше, чтобы проверить. Понятия не имею, почему, но сообщение об ошибке:
unable to find valid certification path to requested target
исчез и
gradle build
начал работать после обновления Gradle Wrapper проекта: https://docs.gradle.org/6.8.1/userguide/gradle_wrapper.html
Ключевым действием было запустить
gradlew.bat
во вкладке Терминал.
Я обновил настройку на Auto Import Certificate
и это сработало для меня
Settings -> Tools -> Server Certificates -> Check the box for auto import
Мне нужно что-то еще делать?
Да, возможно. JAVA_HOME
- это переменная, которую Gradle просматривает, чтобы выбрать Java для ее выполнения. Если у вас есть Java с хранилищем доверенных сертификатов, содержащим необходимые сертификаты, попробуйте установитьJAVA_HOME
в этот реж.
Я не уверен, в чем разница, но установка Gradle и запуск gradle wrapper
Кажется, я исправил свои проблемы (учитывая, что я уже установил сертификаты в хранилище доверенных сертификатов).