SharePoint - обратный прокси-сервер HAProxy (проблема с SSL)

ОБНОВЛЕНИЕ НИЖЕ


Я решил использовать 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

ПЕРВОЕ ОБНОВЛЕНИЕ

Я попытался выполнить сквозную передачу, и теперь SharePoint запрашивает учетные данные (после отключения роли IIS) на порту 80, а затем SahrePoint перенаправляет на https с ошибкой "504 Время ожидания шлюза". Это мой текущий 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

2 ответа

Вы должны избегать использования относительных путей в конфигурационных файлах, таких как ./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 подать снова. Правильный порядок для объединения должен быть окончательным сертификатом, ключом, непосредственным эмитентом, следующим эмитентом и т. Д. Вы можете исключить корневой ЦС, так как считается хорошей практикой не включать его (без реальной необходимости, обменивается меньше байтов).

Вы можете конвертировать из двоичного формата (он же DER) в текстовый формат (он же PEM), используя openssl:

Для сертификатов (input.crt будет файл DER и output.crt будет новый файл в формате PEM):

openssl x509 -информировать DER -в input.crt -out output.crt

Для ключа (я предполагаю, что это ключ RSA, который является наиболее обычным) ПРИМЕЧАНИЕ: он запросит (новый) пароль для output.keyсм. мои комментарии по этому вопросу позже.

openssl rsa -inform DER -in input.key -out output.key

ПРИМЕЧАНИЕ. Большинство серверов предполагают, что ключ не зашифрован (то есть следующая строка -----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 бэкэнд не прослушивается.

Может быть, это будет полезно для кого-то. В моем случае я настроил два сетевых адаптера в 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
Другие вопросы по тегам