我如何使用ASP.NET Core和nginx来实施SSL

我创build了一个运行Ubuntu 16.04的新虚拟机,并运行该命令。 dotnet new -t web创build一个新的基本的MVC网页模板。 接下来我运行了应用程序,连接成功。

之后,我修改了nginx.conf来使用SSL

 server { listen 443 http2 ssl default; ssl_certificate /etc/ssl/certs/testCert.crt; ssl_certificate_key /etc/ssl/certs/testCert.key; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; location / { proxy_pass http://localhost:5000; proxy_cache_bypass $http_upgrade; proxy_redirect off; proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; 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; } } 

再次运行该应用程序,它运行在HTTPS下,没有错误。

然后,我在Startup.cs中configuration了MVC服务来执行HTTPS。

 services.AddMvc(config => { config.Filters.Add(new RequireHttpsAttribute()); }); 

最后我试着再次连接,但得到ERR_TOO_MANY_REDIRECTS 。 但是,如果我只运行在红隼和configuration一些选项,它会工作得很好。

 services.Configure<KestrelServerOptions>(options => { options.AddServerHeader = false; options.UseHttps("devcert.pfx", "password"); }); 

它似乎必须是nginx,但是它可能是MVC / ASP.NET核心的一个问题。 我如何进一步诊断或解决这个问题?

您的SSL连接终止为nginx,它与纯电子邮件中的Kestrel进行通信。 Kestrel将用户重定向到https,在nginx中再次终止,作为http传递给Kestrel,并一次又一次地传递给Kestrel。 这是无止境的循环。

配置nginx需要https(重定向http到https),不要触摸Kestrel。 您的网站本身将始终工作在没有SSL的情况下,nginx将使用SSL将其交付给用户(并返回)。