Я не могу ничего скачать с HTTPS в Java в моей новой установке Debian!

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

Я не могу ничего скачать через HTTPS в Java-приложении на моем новом сервере Debian, хотя на старом сервере все работает нормально. Оба работают под управлением bullseye с версией Java

openjdk 17.0.14 2025-01-21
OpenJDK Runtime Environment (build 17.0.14+7-Debian-1deb11u1)
OpenJDK 64-Bit Server VM (build 17.0.14+7-Debian-1deb11u1, mixed mode, sharing)

Выполнение команды sudo update-ca-certificates на новом сервере приводит к:

Обновление сертификатов в /etc/ssl/certs...
0 добавлено, 0 удалено; выполнено.
Запуск хуков в /etc/ca-certificates/update.d...

Исключение в потоке "main" java.security.cert.CertificateException: X.509 не найден
        на java.base/java.security.cert.CertificateFactory.getInstance(CertificateFactory.java:198)
        на org.debian.security.KeyStoreHandler.<init>(KeyStoreHandler.java:50)
        на org.debian.security.UpdateCertificates.<init>(UpdateCertificates.java:65)
        на org.debian.security.UpdateCertificates.main(UpdateCertificates.java:51)
Причина: java.security.NoSuchAlgorithmException: X.509 CertificateFactory не доступен
        на java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
        на java.base/java.security.cert.CertificateFactory.getInstance(CertificateFactory.java:193)
        ... 3 больше
E: /etc/ca-certificates/update.d/jks-keystore завершился с кодом 1.
выполнено.

чего не происходит на старом сервере.

Затем я запускаю следующий Java-скрипт

public class Main {
    public static void main(String[] args) {
        for (var i : java.security.Security.getProviders()) {
            System.out.println(i.getName());
        }
    }
}

На старом сервере он выводит

SUN
SunRsaSign
SunEC
SunJSSE
SunJCE
SunJGSS
SunSASL
XMLDSig
SunPCSC
JdkLDAP
JdkSASL
SunPKCS11

но на новом сервере он не выводит ничего! Это указывает на то, что модули даже не существуют на новом сервере!

Чего не хватает на новом сервере? Что мне нужно установить?

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

Ваша проблема связана с тем, что на новом сервере Debian отсутствуют провайдеры безопасности Java, что препятствует выполнению загрузок через HTTPS. Давайте подробно разберем, почему это происходит и как это исправить.

Теория

Java использует набор провайдеров безопасности для различных операций, таких как шифрование, аутентификация и обработка сертификатов X.509. Эти провайдеры входят в стандартную библиотеку Java, и их отсутствие означает, что ваша установка Java не полностью функциональна. На старом сервере, как вы заметили, все провайдеры безопасности присутствуют, что позволяет корректно работать с HTTPS.

Пример

На вашей новой установке Debian, при выполнении команды update-ca-certificates, возникают ошибки, связанные с отсутствием поддержки X.509 в Java. Эта проблема, вероятно, вызвана тем, что провайдеры не загружены правильно. Отсутствие провайдеров на новом сервере отличает его от старого, где эти компоненты присутствуют и работают.

Применение

Для решения проблемы, следует предпринять следующие шаги:

  1. Проверка установки Java: Убедитесь, что Java установлена корректно и все необходимые пакеты присутствуют. Выполните команду для проверки версии Java и ее пакетов:

    java -version

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

  2. Переустановка Java: Переустановите Java, чтобы убедиться, что все компоненты установлены корректно. Можно использовать следующие команды:

    sudo apt-get remove --purge openjdk-17-jdk
    sudo apt-get install openjdk-17-jdk
  3. Проверка наличия пакетов, отвечающих за поддержку сертификатов: Убедитесь, что все пакеты, связанные с работой сертификатов, установлены. Запустите:

    sudo apt-get install ca-certificates-java
  4. Рассмотрение альтернативных пакетов Java: В некоторых случаях, проблема может быть вызвана конкретными пакетами Java OpenJDK. Попробуйте установить альтернативные пакеты Java, например Oracle JDK, если это возможно:

    sudo add-apt-repository ppa:linuxuprising/java
    sudo apt-get update
    sudo apt-get install oracle-java17-installer
  5. Проверка провайдеров безопасности: После переустановки, выполните проверку провайдеров безопасности:

    public class Main {
       public static void main(String[] args) {
           for (var i : java.security.Security.getProviders()) {
               System.out.println(i.getName());
           }
       }
    }

    Сравните выходные данные с таковыми на старом сервере.

  6. Обновление сертификатов: После установки всех необходимых компонентов, выполните обновление сертификатов:

    sudo update-ca-certificates -f
  7. Логи и диагностика: Проверьте системные логи на наличие дополнительных ошибок, которые могут указать на причину проблем:

    journalctl -xe

Заключение

Каждая установка может иметь свои нюансы, поэтому важно следовать рекомендациям и проверять состояние системы после каждого шага. Если у вас все еще возникают проблемы, возможно, стоит рассмотреть возможность использования другого дистрибутива Java или обращаться за помощью к сообществу Debian или Java. Убедитесь, что серверы имеют доступ к сети для загрузки обновлений и пакетов. Этот процесс должен восстановить корректное функционирование Java на вашем новом сервере Debian.

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

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