HTTPS-клиент Java внезапно потерял способность взаимодействовать с сервером с помощью Let’s EncryptJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 HTTPS-клиент Java внезапно потерял способность взаимодействовать с сервером с помощью Let’s Encrypt

Сообщение Anonymous »

У меня есть сервер и клиент, написанные на Java, которые используют Let's Encrypt для сертификатов TLS/SSL.
Все работало отлично до 7 июля 2024 года, когда это произошло. перестал работать после того, как Let's Encrypt выпустил новые сертификаты. Клиент получит следующее сообщение об ошибке:

Ошибка построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенного target

Я предполагаю, что проблема вызвана тем, что Let's Encrypt обновляет свою цепочку доверия, поскольку даты идеально совпадают. В качестве теста я вернулся к более старому сертификату Let's Encrypt до внесения изменений, и он все еще работает, по крайней мере, до истечения срока его действия в недалеком будущем.
На основе других сообщений в Stack Overflow , наиболее вероятная причина в том, что у меня нет самых последних промежуточных центров сертификации. Однако, следуя предложениям других, нам не удалось заставить его работать.
  • Обновите Java 17 до Java 22
  • Загрузите промежуточные сертификаты отсюда: X1, R10 в виде pem-файлов.

    Добавьте их в JRE вручную.
  • Загрузите вручную. их в клиенте
[*]Получен сертификат с соответствующего URL

Загрузка веб-сайта, который использует те же сертификаты Let's Encrypt, с Chrome работает нормально. Я убедился, что Java 22 имеет последние сертификаты, соответствующие тем, что были на веб-сайте Let’s Encrypt.
Вот как я убедился, что у JRE есть правильные сертификаты. С помощью Chrome я проверил нужные мне отпечатки пальцев:
9D7C3F1AA6AD2B2EC0D5CF1E246F8D9AE6CBC9FD0755AD37BB974B1F2FB603F3
34C44664C5257A38FFAFAC3A2130138FFE22CE972F3660C78 8FDA87FA0B670F3
96BCEC06264976F37460779ACF28C5A7CFE8A3C0AAE11A8FFCEE05C0BDDF08C6
Соответствующие сертификаты внутри хранилище ключей:
$JAVA_HOME/bin/keytool -list -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit:

letsencrypt_r10, Jul 25, 2024, trustedCertEntry,
Certificate fingerprint (SHA-256): 9D:7C:3F:1A:A6:AD:2B:2E:C0:D5:CF:1E:24:6F:8D:9A:E6:CB:C9:FD:07:55:AD:37:BB:97:4B:1F:2F:B6:03:F3

letsencryptisrgx1 [jdk], Jul 25, 2024, trustedCertEntry,
Certificate fingerprint (SHA-256): 96:BC:EC:06:26:49:76:F3:74:60:77:9A:CF:28:C5:A7:CF:E8:A3:C0:AA:E1:1A:8F:FC:EE:05:C0:BD:DF:08:C6

webpage-cert, Jul 25, 2024, trustedCertEntry,
Certificate fingerprint (SHA-256): 34:C4:46:64:C5:25:7A:38:FF:AF:AC:3A:21:30:13:8F:FE:22:CE:97:2F:36:60:C7:88:FD:A8:7F:A0:B6:70:F3

Другие соответствующие ссылки: Я также провел тест здесь: https://check-your-website .server-daten.de
При этом я вижу, что сертификаты в хорошем состоянии, но цепочка неполная. Снова смотрю на Chrome, хотя мы получаем ошибку 404, похоже, что мы также можем подключиться и просмотреть сертификаты. Я также попытался подключиться с помощью простого скрипта Python, и у него возникла та же проблема, что и у нашего Java-клиента.
Решение найдено:
Мне удалось решить эта проблема после дампа содержимого PKCS12 и преобразованного (из PKCS12) ключа JKS. По какой-то причине JKS исключил корневой сертификат во время преобразования, поэтому его пришлось добавить в JKS вручную.
Процесс:
  • Создайте файл PKCS12 на основе Let's Encrypt Fullchain и Privkey:
openssl pkcs12 -export -in /etc/letsencrypt/live/$DOMAIN/fullchain.pem -inkey /etc/letsencrypt/live/$DOMAIN/privkey.pem -out combined_keys.p12 -name $DOMAIN -passout pass:changeit
  • Преобразуйте файл PKCS12 в файл JKS:
keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore $DOMAIN.jks -srckeystore combined_keys.p12 -srcstoretype PKCS12 -srcstorepass changeit -alias $DOMAIN
  • Проверьте с помощью keytool -list -v -keystore $DOMAIN.jks -storepasschangeit, чтобы узнать, сертификат отсутствовал.
  • Прочитайте полную цепочку и разделите файл на более мелкие файлы, содержащие каждый отдельный сертификат:
    < /li>
sudo cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem | awk 'split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "/tmp/cert" n ".pem"}'
  • Выведите список разделенных файлов: ls /tmp/cert*.pem
  • Определите, что есть что, перечислив содержимое: openssl x509 -in /tmp/ИМЯ_ФАЙЛА.pem -text -noout
  • Импортируйте отсутствующий сертификат:
sudo keytool -import -trustcacerts -alias root -file /tmp/FILE_NAME.pem -keystore $DOMAIN.jks -storepass changeit


Подробнее здесь: https://stackoverflow.com/questions/787 ... ng-let-s-e
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»