
ОБНОВЛЕНИЕ НИЖЕ
________________Я решил использовать HAProxy в качестве обратного прокси для сайтов SharePoint, и без SSL все работает нормально, но с SSL я не могу запустить haproxy.service. Я пробовал много конфигураций, но так и не смог разобраться...
Попытка запустить службу:
$ sudo systemctl start haproxy.service
Job for haproxy.service failed because the control process exited with error code.
See "systemctl status haproxy.service" and "journalctl -xe" for details.
Статус haproxy.service:
$ sudo systemctl status haproxy.service
haproxy.service - HAProxy Load Balancer
Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since date CEST;
Docs: man:haproxy(1)
file:/usr/share/doc/haproxy/configuration.txt.gz
Process: ExecStart=/usr/sbin/haproxy-systemd-wrapper -f $CONFIG -p $PIDFILE $EXTRAOPTS (code=exited, status=0/SUCCESS)
Process: ExecStartPre=/usr/sbin/haproxy -f $CONFIG -c -q $EXTRAOPTS (code=exited, status=1/FAILURE)
Main PID: (code=exited, status=0/SUCCESS)
systemd[1]: haproxy.service: Failed with result 'exit-code'.
systemd[1]: haproxy.service: Service hold-off time over, scheduling restart.
systemd[1]: Stopped HAProxy Load Balancer.
systemd[1]: haproxy.service: Start request repeated too quickly.
systemd[1]: Failed to start HAProxy Load Balancer.
systemd[1]: haproxy.service: Unit entered failed state.
systemd[1]: haproxy.service: Failed with result 'exit-code'.
systemd[1]: haproxy.service: Start request repeated too quickly.
systemd[1]: Failed to start HAProxy Load Balancer.
systemd[1]: haproxy.service: Failed with result 'exit-code'.
Проверка проблем с файлом конфигурации:
$ sudo haproxy -c -f haproxy.cfg
Enter PEM pass phrase:
[ALERT]: parsing [haproxy.cfg:31] : 'bind *:443' : unable to load SSL private key from PEM file './cert.pem'.
[ALERT]: Error(s) found in configuration file : haproxy.cfg
[ALERT]: Proxy 'http_id': no SSL certificate specified for bind '*:443' at [haproxy.cfg:31] (use 'crt').
[ALERT]: Fatal errors found in configuration.
HAProxy -vv:
$ sudo haproxy -vv
HA-Proxy version 1.7.5-2
Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.8
Running on zlib version : 1.2.8
Compression algorithms supported : identity("identity"), deflate("deflate"), raw-deflate("deflate"), gzip("gzip")
Built with OpenSSL version : OpenSSL 1.1.0e
Running on OpenSSL version : OpenSSL 1.1.0f
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 8.39
Running on PCRE version : 8.39
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with Lua version : Lua 5.3.3
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND
Built with network namespace support
Available polling systems :
epoll : pref=300, test result OK
poll : pref=200, test result OK
select : pref=150, test result OK
Total: 3 (3 usable), will use epoll.
Available filters :
[COMP] compression
[TRACE] trace
[SPOE] spoe
Журналы:
haproxy: [ALERT]: parsing [/etc/haproxy/haproxy.cfg:31] : 'bind *:443' : unable to load SSL certificate file './cert.pem' file does not exist.
haproxy: [ALERT]: Error(s) found in configuration file : /etc/haproxy/.cfg
haproxy: [ALERT]: Proxy 'http_id': no SSL certificate specified for bind '*:443' at [/etc/haproxy/haproxy.cfg:31] (use 'crt').
haproxy: [ALERT]: Fatal errors found in configuration.
Я использую тот же сертификат (но разделенный: сертификат, ключ, цепочка) для nginx на другом сервере, и он работает. Я создал его для HAProxy с помощью cat cert.crt priv.key certchain.crt > cert.pem
команды и пробовал в разных порядках, но ошибка та же. Также с командой haproxy -c -f haproxy.cfg
сервер спрашивает о парольной фразе, поэтому я думаю, что сертификат в порядке (может я ошибаюсь), и что-то не так с файлом конфигурации. Спасибо за ваше время и помощь.
Мой haproxy.cfg:
global
tune.ssl.default-dh-param 2048
maxconn 4096
user haproxy
group haproxy
daemon
#ssl-server-verify none
defaults
mode http
option forwardfor
log 127.0.0.1 local0 notice
maxconn 2000
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
backend sharepoint
mode http
#balance roundrobin
option redispatch
cookie SERVERID insert nocache
server spsrv xxx.xxx.xxx.xxx:80
frontend http_id
#bind *:80
bind *:443 ssl crt ./cert.pem
mode http
reqadd X-Forwarded-Proto:\ https
acl hosts_sharepoint hdr_end(host) -i intranet.sharepoint.com:443
use_backend sharepoint if hosts_sharepoint
default_backend sharepoint
ПЕРВОЕ ОБНОВЛЕНИЕ
Я попробовал с pass-through, и теперь SharePoint запрашивает учетные данные (после отключения роли IIS) на порту 80, а затем SharePoint перенаправляет на https с ошибкой "504 Gateway Time-out". Вот мой текущий haproxy.cfg:
global
maxconn 4096
user haproxy
group haproxy
daemon
defaults
mode tcp
log 127.0.0.1 local0 notice
maxconn 2000
option tcplog
option dontlognull
timeout connect 20s
timeout client 10m
timeout server 10m
frontend httpid
mode tcp
bind *:443
acl hosts_sharepoint hdr_end(host) -i intranet.sharepoint.com
use_backend sharepoint if hosts_sharepoint
default_backend sharepoint
backend sharepoint
mode tcp
balance roundrobin
option redispatch
cookie SERVERID insert indirect nocache
server st1 xxx.xxx.xxx.xxx:443
option ssl-hello-chk
Также команда:
$ curl xxx.xxx.xxx.xxx:**80** --header 'Host: sharepoint.intranet.com' -vv
возвращает 401, так что соединение работает, но команда с портом 443 $ url xxx.xxx.xxx.xxx:**443** --header 'Host: sharepoint.intranet.com' -vv
возвращает curl: (56) Recv failure: Connection reset by peer
. Правильный ли у меня файл конфигурации? Или, может быть, мне нужно настроить IIS?
ВТОРОЕ ОБНОВЛЕНИЕ
После перезапуска сервера SharePoint эта конфигурация будет работать.пройти через:
global
maxconn 4096
user haproxy
group haproxy
daemon
defaults
mode tcp
log 127.0.0.1 local0 notice
maxconn 2000
option tcplog
option dontlognull
timeout connect 20s
timeout client 10m
timeout server 10m
frontend httpid
mode tcp
bind *:443
acl hosts_sharepoint hdr_end(host) -i intranet.sharepoint.com
use_backend sharepoint if hosts_sharepoint
default_backend sharepoint
backend sharepoint
mode tcp
balance roundrobin
option redispatch
cookie SERVERID insert indirect nocache
server st1 xxx.xxx.xxx.xxx:443
option ssl-hello-chk
решение1
Вам следует избегать использования относительных путей в файлах конфигурации, например ./cert.pem
. Пожалуйста, измените на абсолютный путь, например /etc/ssl/cert.pem
(подгоните под текущий путь).
Также проверьте cert.pem
сам файл. Он должен содержать только печатный текст (не двоичный) с как минимум двумя блоками -----BEGIN CERTIFICATE-----
, -----END CERTIFICATE-----
(ваш сертификат и CA из цепочки) и блоком -----BEGIN PRIVATE KEY-----
, -----END PRIVATE KEY-----
(или может быть -----BEGIN RSA PRIVATE KEY-----
, -----END RSA PRIVATE KEY-----
).
Если внутри файла были какие-либо двоичные файлы cert.pem
, вам следует преобразовать исходные файлы ( cert.crt
, priv.key
) в формат PEM и cert.pem
заново создать файл. Правильный порядок конкатенации должен быть следующим: окончательный сертификат, ключ, непосредственный издатель, следующий издатель и т. д. Вы можете не включать корневой CA, так как считается хорошей практикой не включать его (нет реальной необходимости, меньше обмениваемых байтов).
Вы можете преобразовать двоичный формат (DER) в текстовый формат (PEM) с помощью openssl:
Для сертификатов ( input.crt
будет файл DER и output.crt
будет новый файл в формате PEM):
openssl x509 -inform DER -in input.crt -out output.crt
Для ключа (я предполагаю, что это ключ RSA, который является наиболее распространенным) ПРИМЕЧАНИЕ: он запросит (новый) пароль для output.key
, см. мои комментарии по этому поводу позже.
openssl rsa -inform DER -in входной.ключ -out выходной.ключ
ПРИМЕЧАНИЕ: Большинство серверов предполагают, что ключ не зашифрован (то есть следующая строка содержит -----BEGIN PRIVATE KEY-----
) ENCRYPTED
. Если это так и ваш сервер все равно не запускается, попробуйте преобразовать ключ в незашифрованный формат (ПРИМЕЧАНИЕ: в этой команде я предполагаю, что файл inputcipher.key
уже в формате PEM):
openssl rsa -in inputcipher.key -nodes -out outputclear.key
Что касается прохода с 504
ошибкой, в более поздней конфигурации, на которую вы указываете server st1 xxx.xxx.xxx.xxx:443
, тогда как в конфигурации перехвата, на которую вы указываете, вы указали server spsrv xxx.xxx.xxx.xxx:80
. Пожалуйста, проверьте еще раз, прослушивает ли ваш бэкенд порт 80 или порт 443, но, похоже, бэкенд не прослушивает порт 443.
решение2
Может быть, это будет кому-то полезно. В моем случае я настроил два сетевых адаптера на Linux - локальную сеть и публичную сеть. На Windows у меня только локальная сеть - Windows подключается к Linux в локальной сети и затем через HAProxy я могу открыть сайт SharePoint из интернета.
Это правильная конфигурация, которая в моем случае работает (для SSL я использовал сквозной протокол — перенаправление и сертификат находятся на Windows IIS):
global
maxconn 4096
user haproxy
group haproxy
daemon
defaults
mode tcp
log 127.0.0.1 local0 notice
maxconn 2000
option tcplog
option dontlognull
timeout connect 20s
timeout client 10m
timeout server 10m
frontend httpid
mode tcp
bind *:443
acl hosts_sharepoint hdr_end(host) -i intranet.sharepoint.com
use_backend sharepoint if hosts_sharepoint
default_backend sharepoint
backend sharepoint
mode tcp
balance roundrobin
option redispatch
server st1 xxx.xxx.xxx.xxx:443 #local address of the Windows server
option ssl-hello-chk