Я не могу заставить мой asp.net mvc использовать ssl при размещении в дроплете digitalocean

Я не могу правильно разместить свое приложение dotnet mvc через ssl (https). Работает только через http. Ниже приведены мои соответствующие файлы nginx (с использованием «example.org» вместо моего домена)

/etc/nginx/sites-enabled/по умолчанию

# Default server configuration
#
server {
    server_name   example.org *.example.org;
    location / {
            proxy_pass         http://127.0.0.1:5000;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
    }

    # SSL configuration

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    listen   80 default_server;
    # listen [::]:80 default_server deferred;
    return   444;
}

server {
    if ($host = example.org) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen        80;
    server_name   example.org *.example.org;
    return 404; # managed by Certbot

}

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

 application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

/etc/nginx/proxy.conf

proxy_redirect          off;
proxy_set_header        Host $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;
client_max_body_size    10m;
client_body_buffer_size 128k;
proxy_connect_timeout   90;
proxy_send_timeout      90;
proxy_read_timeout      90;
proxy_buffers           32 4k;

Это заставляет мой сайт работать с «http://example.org», но не с «https://example.org». Я не знаю, почему это не будет работать через https? Я попытался изменить свой файл /etc/nginx/nginx.conf, чтобы он соответствовал рекомендуемой документации для хостинга asp.net через Microsoft. Вот мой новый /etc/nginx/nginx.conf файл.

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    include        /etc/nginx/proxy.conf;
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    server_tokens  off;

    sendfile on;
    # Adjust keepalive_timeout to the lowest possible value that makes sense
    # for your use case.
    keepalive_timeout   29;
    client_body_timeout 10; client_header_timeout 10; send_timeout 10;

    upstream my-app{
        server 127.0.0.1:5000;
    }

    server {
        listen                    443 ssl http2;
        listen                    [::]:443 ssl http2;
        server_name               example.org *.example.org;
        ssl_certificate           /etc/letsencrypt/live/example.org/fullchain.pem;
        ssl_certificate_key       /etc/letsencrypt/live/example.org/privkey.pem;
        ssl_session_timeout       1d;
        ssl_protocols             TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers off;
        ssl_ciphers               ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_session_cache         shared:le_nginx_SSL:10m;
        ssl_session_tickets       off;
        ssl_stapling              off;

        add_header X-Frame-Options DENY;
        add_header X-Content-Type-Options nosniff;

        #Redirects all traffic
        location / {
            proxy_pass http://my-app;
            limit_req  zone=one burst=10 nodelay;
        }
    }
}        

Когда я изменяю свой файл /etc/nginx/nginx.conf на указанный выше, оба «http://example.org» и «https://example.com» не работают. Итак, как мне заставить это приложение работать через https?

вы уверены, что ваше приложение работает на порту 5000, а не на порту 80, остановите nginx и проверьте, можете ли вы связаться с приложением по http

IamK 06.10.2022 03:13

Если я остановлю nginx на дроплете, не будет ли невозможно зайти на сайт? Также я попытался запустить точно такую ​​​​же конфигурацию на своем локальном компьютере, и я ничего не получаю на порту 80.

ChristianOConnor 06.10.2022 06:01

это зависит от среды (разработка, производство), в производстве приложение mvc работает на порту 80, но вы можете попробовать это: P

IamK 06.10.2022 09:33

Я только что попробовал порт 80 для proxy_pass и получил тот же результат.

ChristianOConnor 06.10.2022 11:30

отключите nginx, запустите приложение dotnet и проверьте, доступен ли ваш сайт на порту 80

IamK 06.10.2022 11:32

Я не могу отключить nginx, потому что тогда веб-сайт будет недоступен, и я не смогу посетить веб-сайт через локальный хост, потому что у капель digitalocean ubuntu нет браузера. Но... Я запустил его локально с производственными настройками, и он был недоступен через порт 80, только через порт 5000 и 5001.

ChristianOConnor 06.10.2022 11:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
161
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте приведенную ниже конфигурацию (не забудьте отключить перенаправление https в своем приложении — удалите app.UseHttpsRedirection(); из вашего Program.cs (Startup.cs) и удалите ссылку https applicationUrl из launchSettings.json «https://localhost:5001»):

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;
    access_log /var/log/nginx/access.log  combined;
    error_log /var/log/nginx/error.log;
    upstream web-api {
        server 127.0.0.1:5000;
    }

    server {
        listen 80;
        server_name yourdomain.com;
        
        location / {
            return 301 https://$host$request_uri;
        }
    }

    server {
        listen 443 ssl;
        server_name yourdomain.com;

        ssl_certificate /etc/ssl/certs/yourdomain.com.crt;
        ssl_certificate_key /etc/ssl/private/yourdomain.com.key;

        location / {
            proxy_pass         http://web-api;
            proxy_redirect     off;
            proxy_http_version 1.1;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection keep-alive;
            proxy_set_header   Host $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;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
}

Спасибо за сообщение. Однако это все равно не сработало. Есть ли способ получить журналы о том, в чем проблема?

ChristianOConnor 06.10.2022 22:21

Я попробовал обновленный ответ, и он все еще не удался

ChristianOConnor 06.10.2022 23:38
Ответ принят как подходящий

Проблема была на самом деле в моем брандмауэре ufw. Когда я настраивал дроплет, я выполнял команды:

sudo ufw enable
sudo ufw allow OpenSSH
sudo ufw default deny incoming
sudo ufw allow 'Nginx HTTP'

Проблема выше в том, что должно было сделать sudo ufw allow 'Nginx Full', то sudo reboot. После этого моя исходная конфигурация nginx заработала!

Другие вопросы по теме