Сервер Chef API за обратным HTTP-прокси Apache возвращает http вместо ссылок https - PullRequest
1 голос
/ 31 января 2012

У меня есть сервер chef, работающий на машине (прослушивающий порт 4000), и я хотел бы получить к нему доступ через SSL. Для этого я настроил обратный прокси-сервер Apache (прослушивание порта 4001). Настройка Apache выглядит так (имя моего компьютера заменено на www.example.com)

Listen 4001

<VirtualHost *:4001>

   SSLEngine on
   SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
   SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

   ProxyRequests     Off
   ProxyPreserveHost On

   <Proxy http://localhost:4000*>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass         /  http://localhost:4000/
   ProxyPassReverse  /  http://localhost:4000/
   ProxyPassReverse  /  http://www.example.com:4000/
   ProxyPassReverse  /  http://www.example.com:4001/

   CustomLog ${APACHE_LOG_DIR}/chef.access.log common
   ErrorLog ${APACHE_LOG_DIR}/chef.error.log

</VirtualHost> 

Проблема в том, что URL-адреса в JSON, возвращаемые вызовами chef API, имеют http вместо https. Например, они выглядят так:

http://www.example.com:4001/sandboxes/a25fa2615d3d4dbd91e91a5e3a76c0ea

Вместо:

https://www.example.com:4001/sandboxes/a25fa2615d3d4dbd91e91a5e3a76c0ea

Один из примеров - это выполнение POST для /sandboxes, чтобы создать новую песочницу, которая создала ссылку выше. Это ломает такие вещи, как попытка использовать нож для загрузки кулинарных книг.

Из того, что я могу сказать, шеф-сервер создает метод , который вызывается /sandboxes POST вызывает вспомогательный метод Merb absolute_url для генерации URL.

На данный момент, я поставлен в тупик о том, как решить эту проблему. Нужно ли как-то изменить конфигурацию обратного прокси-сервера Apache? Это опция конфигурации на сервере chef? Или что-то еще?

1 Ответ

1 голос
/ 31 января 2012

Я думаю, вам просто нужно добавить:

RequestHeader set X-Forwarded-Proto "https"

в вашу конфигурацию Apache.

Это заставляет Apache добавить заголовок X-Forwarder-Proto: https ко всем запросам к серверу Chef / Merb. Merb проверяет этот заголовок при принятии решения, следует ли рассматривать запрос как безопасный (вы можете следить за запросами от options[:protocol] ||= request.protocol в absolute_url до request#protocol до request#ssl?) .

Директива ProxyPassReverse только изменяет заголовки из бэкэнда, она не меняет никакого содержимого (для этого потребуется анализ и распознавание URL-адресов в содержимом). Передача этого заголовка позволяет Merb знать, что он должен действовать так, как если бы запрос использовал SSL, и создавать соответствующие ссылки.

...