Рейтинг:0

Как диагностировать/исправить ошибки CloudFormation/autoscaling SSL при загрузке файла

флаг cv

У меня есть группа автомасштабирования, созданная AWS CloudFormation. Он работает на Amazon Linux 2. На прошлой неделе он работал нормально. Теперь новые экземпляры выдают ошибку «Срок действия сертификата истек» при попытке загрузить phpMyAdmin. Кажется cfn-инициализация это работает ням отлично, и захват файлов с S3 в порядке, но не работает, когда он переходит к захвату удаленных файлов (что, похоже, он делает с Python).

РЕДАКТИРОВАТЬ: см. ниже, но я сначала подумал, что это какая-то проблема со скриптами Python. Я больше не уверен, что это правда, потому что он отлично работает в другой группе автомасштабирования, захватывая разные файлы. Итак... теперь я думаю, что это действительно какая-то проблема с сертификатом на phpMyAdmin, но... я не уверен. И я до сих пор не знаю, как дальше диагностировать.

/var/log/cfn-init.log:

2021-10-06 10:08:24,895 [INFO] -----------------------Начало сборки------------
-----------
2021-10-06 10:08:24,896 [ОТЛАДКА] Не устанавливать триггер перезагрузки в качестве поддержки планирования
рт недоступен
2021-10-06 10:08:24,898 [INFO] Запуск configSets: по умолчанию
2021-10-06 10:08:24,899 [INFO] Запуск configSet по умолчанию
2021-10-06 10:08:24,906 [INFO] Запуск конфигурации config
2021-10-06 10:08:34,173 [ОТЛАДКА] Установка/обновление ['mod_ssl', 'ksh', 'httpd'] 
через ням
2021-10-06 10:08:37,523 [INFO] Yum установлен ['mod_ssl', 'ksh', 'httpd']
2021-10-06 10:08:37,523 [DEBUG] Группы не указаны
2021-10-06 10:08:37,523 [DEBUG] Пользователи не указаны
2021-10-06 10:08:37,523 [ОТЛАДКА] Источники не указаны
 ... [успешно устанавливает некоторые файлы с S3 ... ]

2021-10-06 10:08:37,621 [ОТЛАДКА] Запись содержимого в /tmp/phpmyadmin.tgz
2021-10-06 10:08:37,621 [ОТЛАДКА] Получение содержимого с https://www.phpmyadmin.
сеть/загрузки/phpMyAdmin-последние-все-языки.tar.gz
2021-10-06 10:08:37,640 [ОШИБКА] SSLError
Traceback (последний последний вызов):
  Файл "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connectionpool.py", строка 544, в urlopen
    тело=тело, заголовки=заголовки)
  Файл "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connectionpool.py", строка 341, в _make_request
    self._validate_conn (подключение)
  Файл "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connectionpool.py", строка 762, в _validate_conn
    конн.подключить()
  Файл "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connection.py", строка 238, в соединении
    ssl_version=разрешенная_ssl_версия)
  Файл "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages/urllib3/util/ssl_.py", строка 265, в ssl_wrap_socket
    вернуть context.wrap_socket(sock, server_hostname=server_hostname)
  Файл "/usr/lib64/python3.7/ssl.py", строка 423, в wrap_socket
    сессия = сессия
  Файл "/usr/lib64/python3.7/ssl.py", строка 870, в _create
    self.do_рукопожатие ()
  Файл "/usr/lib64/python3.7/ssl.py", строка 1139, в do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась: срок действия сертификата истек (_ssl.c:1091)
...

но, если я войду в машину, загрузка с wget работает просто отлично, РЕДАКТИРОВАТЬ больше не верно: так что я не думаю, что это проблема на удаленном сайте, я думаю, что это что-то с cfn-инициализация или связанные скрипты Python.

РЕДАКТИРОВАТЬ: Из другой группы автомасштабирования, также созданной CloudFormation, работают удаленные загрузки:

...
2021-10-07 04:21:10,855 [ОТЛАДКА] Запись содержимого в /tmp/mysql80.rpm
2021-10-07 04:21:10,855 [DEBUG] Получение содержимого с https://dev.mysql.com/g
et/mysql80-community-release-el7-2.noarch.rpm
2021-10-07 04:21:11,425 [DEBUG] Установка режима для /tmp/mysql80.rpm на 000600
2021-10-07 04:21:11,425 [ОТЛАДКА] Установка владельца 0 и группы 0 для /tmp/mysql80.rpm
...

Итак, он успешно скачивается с https://dev.mysql.com/, но сбой с "просроченным сертификатом" от https://www.phpmyadmin.net, даже не смотря на wget и переход прямо туда через браузер не показывает никаких ошибок.

конец РЕДАКТИРОВАТЬ

Любая идея о том, как отладить это?

Рейтинг:1
флаг cv

Короткий ответ:

Используйте openssl, чтобы найти сертификат с истекшим сроком действия:

openssl s_client -showcerts -connect <falingwebsite.com>:443 | grep "срок действия сертификата истек"

Получите новый сертификат с неистекшим сроком действия и прикрепите его к пакету AWS ca_bundle:

cat <newcert>.pem >> /path/to/your/python/env/lib/python3.9/site-packages/cfnbootstrap/packages/requests/cacert.pem

Длинный ответ:

В итоге я написал несколько скриптов на Python, чтобы попытаться загрузить сертификат на стороне сервера, чтобы посмотреть, не пошло ли что-то не так с загрузкой. Я никогда не загружал сертификаты напрямую с помощью urllib3, но пока в погоне за этим на StackOverflow, @clockwatcher обнаружил настоящую проблему, и, похоже, она затронет других, а не только phpMyAdmin.

Это связано с Срок действия корневого сертификата DST X3, что произошло 30 сентября. AWS не включает новый сертификат в свои утвержденные сертификаты в комплекте, поэтому вам нужно добавить новый сертификат вручную.

Вы можете получить самозаверяющий pem-файл ISRG Root X1 из LetsEncrypt, а затем добавить его в cfnbootstrapх ca_cert.pem файл, как указано выше.

Теперь это решает проблему в случае, если у вас есть работающая машина; тем не менее, это все еще проблема для групп автомасштабирования, так как нет простого способа использовать

  AWS::CloudFormation::Init:
    конфигурация:
    файлы:
        /путь/к/файлу:
          источник: https://somewhere.using.letsencrypt.com/file   

поведение. Таким образом, в любом месте ваших шаблонов CloudFormation, использующих эту парадигму, необходимо будет переписать так, чтобы и файл, который вы действительно хотите, и сертификат LetsEncrypt загружались с wget как часть команды: раздел. Например,

        01_get_phpmyadmin:
          команда: !Присоединиться ["",
                       ["wget ​​-O phpmyadmin.tgz",
                        "https://www.phpmyadmin.net/downloads/",
                        "phpMyAdmin-последние-все-языки.tar.gz"]]
          Команда: /tmp

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.