У меня есть группа автоматического масштабирования, созданная 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
Есть идеи, как это отлаживать?
Краткий ответ:
Используйте 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