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

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

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

/var/log/cfn-init.log:

2021-10-06 10:08:24,895 [INFO] -----------------------Starting build------------
-----------
2021-10-06 10:08:24,896 [DEBUG] Not setting a reboot trigger as scheduling suppo
rt is not available
2021-10-06 10:08:24,898 [INFO] Running configSets: default
2021-10-06 10:08:24,899 [INFO] Running configSet default
2021-10-06 10:08:24,906 [INFO] Running config config
2021-10-06 10:08:34,173 [DEBUG] Installing/updating ['mod_ssl', 'ksh', 'httpd'] 
via yum
2021-10-06 10:08:37,523 [INFO] Yum installed ['mod_ssl', 'ksh', 'httpd']
2021-10-06 10:08:37,523 [DEBUG] No groups specified
2021-10-06 10:08:37,523 [DEBUG] No users specified
2021-10-06 10:08:37,523 [DEBUG] No sources specified
 ... [successfully installs some files from S3 ... ]

2021-10-06 10:08:37,621 [DEBUG] Writing content to /tmp/phpmyadmin.tgz
2021-10-06 10:08:37,621 [DEBUG] Retrieving contents from https://www.phpmyadmin.
net/downloads/phpMyAdmin-latest-all-languages.tar.gz
2021-10-06 10:08:37,640 [ERROR] SSLError
Traceback (most recent call last):
  File "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connectionpool.py", line 544, in urlopen
    body=body, headers=headers)
  File "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connectionpool.py", line 341, in _make_request
    self._validate_conn(conn)
  File "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connectionpool.py", line 762, in _validate_conn
    conn.connect()
  File "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages
/urllib3/connection.py", line 238, in connect
    ssl_version=resolved_ssl_version)
  File "/usr/lib/python3.7/site-packages/cfnbootstrap/packages/requests/packages/urllib3/util/ssl_.py", line 265, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/usr/lib64/python3.7/ssl.py", line 423, in wrap_socket
    session=session
  File "/usr/lib64/python3.7/ssl.py", line 870, in _create
    self.do_handshake()
  File "/usr/lib64/python3.7/ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1091)
...

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

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

...
2021-10-07 04:21:10,855 [DEBUG] Writing content to /tmp/mysql80.rpm
2021-10-07 04:21:10,855 [DEBUG] Retrieving contents from https://dev.mysql.com/g
et/mysql80-community-release-el7-2.noarch.rpm
2021-10-07 04:21:11,425 [DEBUG] Setting mode for /tmp/mysql80.rpm to 000600
2021-10-07 04:21:11,425 [DEBUG] Setting owner 0 and group 0 for /tmp/mysql80.rpm
...

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

end EDIT

Есть идеи, как это отлаживать?

0
задан 6 October 2021 в 12:18
1 ответ

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

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

openssl s_client -showcerts -connect <falingwebsite.com>:443 | grep "certificate has expired"

Получите новый сертификат с неистекшим сроком действия и прикрепите его к пакету 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 Root CA X3 , которое произошло 30 сентября.AWS не включает новый сертификат в свои утвержденные сертификаты в комплекте, поэтому вам нужно добавить новый сертификат вручную.

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

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

  AWS::CloudFormation::Init:
    config:
    files:
        /path/to/file:
          source: https://somewhere.using.letsencrypt.com/file   

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

        01_get_phpmyadmin:
          command: !Join ["",
                       ["wget -O  phpmyadmin.tgz ",
                        "https://www.phpmyadmin.net/downloads/",
                        "phpMyAdmin-latest-all-languages.tar.gz"]]
          cwd: /tmp
1
ответ дан 10 October 2021 в 10:32

Теги

Похожие вопросы