Я очень плохо знаком с SSL, сертификатами и ключами, поэтому я благодарен за любую помощь и понимаю, что, возможно, я совершил глупую ошибку.
Я использую Docker Swarm на трех внутренних серверах CentOS 7,Swarm частично развертывает собственный образ Docker для запуска Apache Airflow 1.10.0 (в ближайшее время планируется обновление до 1.10.1).Образ начинается с FROM python:3.5-slim
, основанного на Ubuntu.
Я следовал этому руководству , чтобы создать самозаверяющий CA, сертификаты и ключи.Я думаю, что это подходит для моего варианта использования, потому что серверы находятся во внутренней сети, и доступ к веб-серверу Airflow будут доступны только членам моей команды, пока они находятся на месте или используют VPN.
Частьdocker-compose.yml
выглядит следующим образом, чтобы предоставить контейнерам доступ к сертификату и ключу:
version: 3.5
services:
[...]
webserver:
[...]
volumes:
- type: bind
source: /root/ca/intermediate/certs
target: /usr/local/airflow/intermediate/certs
- type: bind
source: /root/ca/intermediate/private
target: /usr/local/airflow/intermediate/private
Я изменил владельца файлов из контейнеров на пользователя airflow
в контейнере, поэтомучто приложение может их прочитать.
Соответствующее airflow.cfg
выглядит следующим образом:
[webserver]
base_url = http://localhost:443
web_server_host = 0.0.0.0
web_server_port = 443
web_server_ssl_cert = /usr/local/airflow/intermediate/certs/my_server.cert.pem
web_server_ssl_key = /usr/local/airflow/intermediate/private/my_server.key.pem
Файлы .cert.pem
и .key.pem
одинаковы на всех трех серверах.Я сделал это, потому что подозреваю, что сетка маршрутизации Docker Swarm будет ожидать единообразия на всех серверах.(Является ли это уязвимостью или иным образом ошибкой?)
Dockerfile также EXPOSE
s port 443
.
Тем не менее, эта ошибка возникает, когда веб-сервер пытается запустить:
Traceback (most recent call last):
[2018-11-29 19:43:10 +0000] [36] [INFO] Starting gunicorn 19.9.0
File "/usr/local/bin/gunicorn", line 11, in <module>
sys.exit(run())
Traceback (most recent call last):
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 61, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
File "/usr/local/bin/gunicorn", line 11, in <module>
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/base.py", line 223, in run
sys.exit(run())
super(Application, self).run()
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/base.py", line 72, in run
Arbiter(self).run()
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 61, in run
File "/usr/local/lib/python3.5/site-packages/gunicorn/arbiter.py", line 199, in run
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
self.start()
File "/usr/local/lib/python3.5/site-packages/gunicorn/arbiter.py", line 157, in start
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/base.py", line 223, in run
self.LISTENERS = sock.create_sockets(self.cfg, self.log, fds)
File "/usr/local/lib/python3.5/site-packages/gunicorn/sock.py", line 162, in create_sockets
super(Application, self).run()
raise ValueError('keyfile "%s" does not exist' % conf.keyfile)
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/base.py", line 72, in run
Arbiter(self).run()
ValueError: keyfile "/usr/local/airflow/intermediate/private/my_server.key.pem" does not exist
File "/usr/local/lib/python3.5/site-packages/gunicorn/arbiter.py", line 199, in run
self.start()
File "/usr/local/lib/python3.5/site-packages/gunicorn/arbiter.py", line 157, in start
self.LISTENERS = sock.create_sockets(self.cfg, self.log, fds)
File "/usr/local/lib/python3.5/site-packages/gunicorn/sock.py", line 162, in create_sockets
raise ValueError('keyfile "%s" does not exist' % conf.keyfile)
ValueError: keyfile "/usr/local/airflow/intermediate/private/my_server.key.pem" does not exist
Итак, мой вопрос: как заставить Airflow правильно распознавать ключ и сертификат SSL?Документация Airflow по этому вопросу довольно краткая.
Я надеюсь, что предоставил достаточно контекста - рад предложить больше, если это поможет.Еще раз спасибо.