Как я могу динамически создавать новые SSL-сертификаты LetsEncrypt / Certbot для доменов, указывающих на мой сервер? - PullRequest
0 голосов
/ 28 марта 2019

Я создаю веб-приложение (пример: www.mywebapp.example), которое позволяет пользователям указывать свой домен - www.xyz.example - на www.mywebapp.example. Когда пользователи переходят на www.xyz.example, их контент будет обрабатываться с www.mywebapp.example. Пользователям сообщат, как обновить свои @ и www A records в настройках DNS своих провайдеров домена для подключения www.xyz.example к www.mywebapp.example.

Я могу вручную создавать новые сертификаты SSL, используя ./certbot-auto -d <domain-name> для каждого домена. Я также установил задание cron для проверки на обновление.

Однако я хочу автоматизировать этот процесс, запуская скрипт PHP, запускаемый из функции JavaScript, каждый раз, когда пользователь подключает свой домен к www.mywebapp.example. Мои вопросы:

  1. Должен ли я выполнить команду ./certbot-auto из PHP с помощью команды exec()/shell_exec()? Должен ли я написать отдельный скрипт bash и вместо этого запустить скрипт bash?

  2. Должен ли я использовать PHP-библиотеку ACME, рекомендованную LetsEncrypt - https://letsencrypt.org/docs/client-options/

  3. Я вручную создал новый сертификат SSL для домена www.xyz2.example, который успешно указывал на www.mywebapp.example. Однако это нарушило поддержку SSL для всех существующих доменов - *.mywebapp.example, mywebapp.example, www.xyz.example. Нужно ли создавать виртуальные хосты для каждого домена, указывающего на www.mywebapp.example?

  4. Нужно ли редактировать /etc/httpd/conf.d/ssl.conf, чтобы добавить новые виртуальные хосты? Могут ли несколько доменов использовать один и тот же DocumentRoot путь?

Я прочитал все следующие ссылки, но все еще в замешательстве:

Любая помощь очень ценится. Если требуется дополнительная информация, пожалуйста, дайте мне знать.

Настройка моего сервера:

  • ЛАМПА
  • AWS EC2

1 Ответ

1 голос
/ 28 марта 2019

У вас много вопросов в одном.

Должен ли я выполнять команду ./certbot-auto из PHP с помощью команды exec () / shell_exec ()? Должен ли я написать отдельный скрипт bash и вместо этого запустить скрипт bash?

В общем случае: нет.

PHP выполняется после того, как веб-страница достигнута, следовательно, он живет в текущем HTTP-сеансе, и браузер на другом конце будет ждать какого-то ответа в какое-то ограниченное время (и пользователи злятся, если они не видят чего-то «быстрого»).

Если вы исполняете вещи, у вас есть два варианта:

  1. вы ждете завершения внешней программы: проблема, это может быть после "неопределенного" времени, поэтому, если это не будет принято во внимание, пользователь никогда не увидит ничего в своем браузере
  2. вы запускаете его в фоновом режиме и не ждете его завершения: проблема, вам не нужно, если это удастся или нет, так что даже если вы тогда сможете ответить «что-то» в браузер, как вы будете обрабатывать сбои?

Общее решение для таких случаев:

  1. Действие, вызванное посещением HTTP, просто записывает запрос, как в БД или что-то в этом роде
  2. Отдельно процесс опрашивает БД на предмет выполнения задач и выполняет их; это совершенно отдельно от любого веб-сервера; после завершения задания (успех или сбой) БД будет обновляться таким же образом
  3. Процесс в пункте 1) может регулярно опрашивать БД, чтобы увидеть состояние (ожидающий, завершенный или неуспешный) и показать пользователю сообщение, например, во время его посещения, с каким-либо автоматическим обновлением и / или предоставить определенное отдельное страница, на которой пользователь сможет отслеживать статус своей операции

Должен ли я использовать PHP-библиотеку ACME, рекомендованную LetsEncrypt - https://letsencrypt.org/docs/client-options/

Вы можете использовать любую библиотеку на любом языке, которая правильно реализует протокол ACME.

Let's Encrypt рекомендует только одно программное обеспечение: certbot. Все остальные, перечисленные на этой странице, являются примерами клиентских библиотек / программ, которые, как ожидается, будут работать.

Нужно ли создавать виртуальные хосты для каждого домена, указывающего на www.mywebapp.example?

Да, особенно если они используют каждый из них по определенному сертификату, в противном случае веб-сервер не сможет определить правильный сертификат для возврата в начале рукопожатия TLS, основываясь на том, какое имя хоста дал браузер (внутри расширения SNI). используется в начале рукопожатия TLS)

Или вы можете использовать некоторые функции Apache массового виртуального хостинга, такие как https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html Однако, как это может быть, это может означать один сертификат со всеми добавленными в него именами, который технически может работать до определенного количества имен, но может создавать нетехнические проблемы (например, видеть все имена и т. Д.)

Конечно, другое программное обеспечение, такое как Nging / HAProxy, может предоставить более продвинутые функции, когда вам не нужно настраивать виртуальный хост для каждого виртуального хоста, даже с разными сертификатами, вы просто создаете вещи с определенным именованием, и веб-сервер будет сопоставляйте вещи по мере необходимости.

Нужно ли мне редактировать /etc/httpd/conf.d/ssl.conf для добавления новых виртуальных хостов?

Да, или любой другой файл, если вы используете Include или аналогичный.

Если вы управляете многими различными и отдельными веб-сайтами, может быть проще иметь один файл конфигурации для каждого веб-сайта, включая пути к сертификатам и т. Д., Во многих дистрибутивах Linux Apache устанавливается таким образом, что у вас есть /etc/httpd/sites-enabled/ для этой функции. , Если нет, то вы можете сделать то же самое самостоятельно.

Могут ли несколько доменов использовать один и тот же путь DocumentRoot?

Конечно, да.

PS: пожалуйста, перестаньте говорить SSL, протокол называется TLS, изобретенный 20 лет назад.Протокол SSL давно утрачен, в настоящее время рекомендуется использовать TLS 1.2, за исключением случаев, когда есть веские основания разрешать использовать версии 1.1 и 1.0, которые имеют уязвимости.Не существует «SSL-сертификата» ни по этой причине, ни потому, что они неправильные.TLS может работать без сертификатов, и эти сертификаты могут использоваться вне TLS, как в S / MIME.Это сертификаты X.509.

...