LINUX.ORG.RU
ФорумAdmin

Nginx SSL termination

 


1

3

Добрый день! Тестовый стенд из Nginx(просто балансировка) за ним Nginx Web сервер. Балансировщик настроен просто.

stream {
    upstream stream_backend {
         server backend1.example.com:80;
         server backend2.example.com:80;
         server backend3.example.com:80;
    }
 
    server {
        listen                443 ssl;
        proxy_pass            stream_backend;
 
        ssl_certificate       /etc/ssl/certs/server.crt;
        ssl_certificate_key   /etc/ssl/certs/server.key;
        ssl_protocols         SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers           HIGH:!aNULL:!MD5;
        ssl_session_cache     shared:SSL:20m;
        ssl_session_timeout   4h;
        ssl_handshake_timeout 30s;
   
     }
}
Проблема в том что если я включаю SSL на балансировщике и хожу на сайт через него, то сайт частично отдается по https, а частично по http Если ходить выключаем https и ходим по http, то все работает.

Перемещено leave из general



Последнее исправление: regsterr (всего исправлений: 1)

У вас там точно нигде http не захардкожено? Посмотрите свой код.

В качетстве «костыля» добавте блок

server {
        listen 80;
        return 301 https://$host$request_uri;
}

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Я думаю не совсем в этом дело, хотя хардкоды надо проверить тоже.

Многие CMS опираются на $_SERVER['HTTPS'] = 'on' для того чтобы формировать URL, в данном случае этот заголовок не передается в рамках proxy_pass и сайты за балансировщиком думают что они работают по HTTP.

Надо или воткнуть промежуточные сертификаты и проксировать https://backend* или через fastcgi_param HTTPS on или еще как, вплоть до $_SERVER['HTTPS'] = 'on' в index.php или config.php

BaBL ★★★★★
()
Ответ на: комментарий от BaBL

Многие CMS

думают что они работают по HTTP

Они ничего думать не должны, а должны отдавать «//...» URL. Если нет, то это баг и если найдешь - подумай чтобы отправить патч

vertexua ★★★★★
()
Ответ на: комментарий от regsterr

«С костылем» оно просто не будет ничего отдавать по http, кроме редиректа. Что именно «частично отдается по http»?

leave ★★★★★
()
Ответ на: комментарий от BaBL

Как минимум в случае с fastcgi есть ещё REQUEST_SCHEME, который тоже надо передать через цепочку nginx-ов.

У меня сейчас работает сетап с nginx за nginx (так надо), первом nginx приходится кастомными заголовками передавать на второй nginx переменные $remote_addr, $scheme и $https

MrClon ★★★★★
()
Ответ на: комментарий от regsterr

Самое интересное что эта CMS работает в связке pound+apache, на pound сертификаты ставим. А между pound и apache трафик не шифрованный.

regsterr
() автор топика

частично отдается по https, а частично по http

Один из бекендов редиректит на http ? Пробовали отключать/включать бекенды по одному и смотреть ?

zaz ★★★★
()
Ответ на: комментарий от zaz

Давайте выложу те конфиги которые в данный момент на стенде, просто уже долго ковыряюсь, пробуя различные варианты. Может еще дело в сертификате? Он самоподписанный на домен test.com

Если смотреть в отладке страницы то видно что картинки, css,js ссылаются на http. Заранее спасибо за коментарии.

Фронтэнд

upstream backendphp7  {
     ip_hash;
    server 192.168.72.1:80;

}


# SSL forward from 80 to 443 port
#server {
#    listen 80;
#    server_name  system.net;
#    location / {
#	rewrite ^/(.*)$ https://$host/$1 permanent;
#        }
#}


server {
listen 443 ssl;
server_name system.net;
ssl on;
ssl_certificate /etc/nginx/cert/server.crt;
ssl_certificate_key /etc/nginx/cert/server.nopass.key;
ssl_client_certificate /etc/nginx/cert/ca.crt;
ssl_verify_client optional;


ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers       on;
ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;



location / {
         proxy_pass http://backendphp7/;
#         proxy_set_header X-Real-IP $remote_addr;
#        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
#	proxy_set_header X-Forwarded-Proto https;
#        proxy_redirect http://system.net https://system.net;
}



#location ~* \.(ico|gif|jpeg|jpg|png|eot|ttf|swf|woff)$ {
#    root /var/www/crm-system;
#    expires 30d;
#    access_log off;
#            }
#location ~* \.(css|js)$ {
#    root /var/www/crm-system;
#    expires 1d;
#    access_log off;
#    }        
        
}

Бекэнд

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}


resolver 127.0.0.1 valid=5s;

proxy_buffers 16 16k;
proxy_buffer_size 32k;

fastcgi_buffers 16 16k; 
fastcgi_buffer_size 32k;
#fastcgi_ignore_client_abort on;  
fastcgi_read_timeout 90s;
fastcgi_connect_timeout 90s;

client_max_body_size 0;

upstream dynamic {
    ip_hash;
    keepalive 32;
    server localhost:9000;
#    server 192.168.70.2:9000;
}

upstream static {
    ip_hash;
    keepalive 32;
    server 192.168.72.1:8081;
    server 192.168.72.1:8082;
}





root /var/www/system;

server {
    listen 192.168.72.1:80;
    server_name system.net;

    fastcgi_ignore_client_abort on;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection; 
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    access_log  /var/log/nginx/system.com.access.log;
    error_log  /var/log/nginx/system.com.error.log;


    location ~* /(images|css|js)/ {
        proxy_pass http://static;
        expires max;
    }

    location ~* \.(pdf)$ {
        access_log      off;
        expires           max;
    }

    location = /favicon.ico {
        try_files $uri =204;
        proxy_pass http://static;
    }

    location / {
        include fastcgi_params;
        fastcgi_param PATH_INFO $uri;
        fastcgi_param SCRIPT_NAME /wm.php;
        fastcgi_param SCRIPT_FILENAME $document_root/wm.php;
        fastcgi_pass dynamic;
    }


    location ~ ^/(tasks|tests|sso|webservice-0.3.1|rest|frame)/.+?\.php$ {
        try_files $uri /;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass dynamic;
    }

    location ~ ^/(status|ping)$ {
        include fastcgi_params;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass dynamic;
    }
}

# loadbalance servers for static content

server {
    listen 192.168.72.1:8081;
    server_name system.net;
}

server {
    listen 192.168.72.1:8082;
    server_name system.net;
}

server {
    listen 192.168.72.1:80 default_server;
    server_name _;
    return 444;
#    root /usr/share/nginx/html;
}

regsterr
() автор топика
Ответ на: комментарий от regsterr

Если сама страница грузится по HTTPS а ресурсы по HTTP то это проблемы скрипта который эту страницу генерирует. Посмотрите HTML текс там явно будет указан полный путь к ресурсам с указанием протокола. Тут скорее BaBL прав - проблема в настройке апликейшена а не серверов.

zaz ★★★★
()
Ответ на: комментарий от zaz

В отладке браузера.... Если жмем кнопку показать незашифрованное содержание то страница корректно отображается

home:9 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure stylesheet 'http://system.net/css/main.css'. This request has been blocked; the content must be served over HTTPS.
home:10 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure stylesheet 'http://system.net/css/start.css'. This request has been blocked; the content must be served over HTTPS.
home:1 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure script 'http://system.net/js/jquery.min.js'. This request has been blocked; the content must be served over HTTPS.
home:1 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure script 'http://system.net/js/jquery.cycle.all.js'. This request has been blocked; the content must be served over HTTPS.
home:19 Uncaught ReferenceError: $ is not definedat home:19
home:91 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/lang/RU.gif'. This content should also be served over HTTPS.
home:106 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/slogan-RU.png'. This content should also be served over HTTPS.
home:110 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/promo-slides/service1.jpg'. This content should also be served over HTTPS.
home:111 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/promo-slides/service2.jpg'. This content should also be served over HTTPS.
home:112 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/promo-slides/service3.jpg'. This content should also be served over HTTPS.
home:113 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/promo-slides/service4.jpg'. This content should also be served over HTTPS.
home:115 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/promo-slider-bg.png'. This content should also be served over HTTPS.
home:136 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/description-arrow.png'. This content should also be served over HTTPS.
home:150 Mixed Content: The page at 'https://system.net/home' was loaded over a secure connection, but contains a form which targets an insecure endpoint 'http://system.net/login'. This endpoint should be made available over a secure connection.
home:194 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/travel-image.jpg'. This content should also be served over HTTPS.
home:203 Mixed Content: The page at 'https://system.net/home' was loaded over HTTPS, but requested an insecure image 'http://system.net/images/startpage/content-shadow-bottom.png'. This content should also be served over HTTPS.

regsterr
() автор топика

1. Забекапь директорию с сайтом.
2.Сделай sed -i '' -e 's/http:\/\//\/\//g' $(find /var/www/site-dir/ -type f)
3. Проверь работу после того как отчистишь кэш.

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

2.Сделай sed -i " -e 's/http:\/\//\/\//g' $(find /var/www/site-dir/ -type f)

Хреновый совет. Потом будешь в почте ссылки тыкать на gmail.com/restore/password/

Надо смотреть на чем сайт, а не тупым топором лезть крошить все.

BaBL ★★★★★
()
Последнее исправление: BaBL (всего исправлений: 1)
Ответ на: комментарий от regsterr

Но возникала другая проблема, при установке этого костыля сайт по http не отдает статику. Т.е получаем обратную ситуацию. Можно это применить не в глобале, а только к виртуальному хосту.

regsterr
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.