我目前正在尝试建立一个客户端界面与服务器交互的API,我决定使用ASP.NET Core作为API,Nginx作为托管平台。我决定使用ASP.NET Core作为API,Nginx作为托管平台(在Ubuntu 18.04上)。由于ASP.NET使用的是Kestrel,所以我们设置了一个反向代理,将Nginx的请求转发到Kestrel--也就是API的托管平台。我们在NGINX服务器上设置了SSL,但是在Kestrel服务器上没有设置。
简单地说,我不知道如何在Kestrel服务器上设置SSL,并在NGINX端设置另一层SSL。我怎么才能做到这一点呢?
模型:客户端 --> GET请求通过HTTPS --> NGINX与SSL --> HTTP Kestrel服务器,反之亦然。
輸出:SSL_PROTOCOL_ERROR SSL_PROTOCOL_ERROR
临时解决方案。在链接中使用HTTP 5000端口 -- 没有错误,但是,数据不安全。
最佳的解决方案:使用HTTPS,链接中不含5000端口。使用HTTPS,链接中不含5000端口。数据是安全的。
NGINX配置。
if ($host = api.OURSITENAME.co) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name api.OURSITENAME.co;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
include /etc/nginx/proxy_params;
server_name api.OURSITENAME.co;
access_log /var/log/nginx/api.access.log;
error_log /var/log/nginx/api.error.log error;
# SSL Configuration
ssl_certificate /etc/letsencrypt/live/api.OURSITENAME.co/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/api.OURSITENAME.co/privkey.pem; # managed by Certbot
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_set_header Upgrade $http_upgrade;
location / {
proxy_pass http://172.18.0.2:5000; <-- Docker Container. Can easily be switched out with localhost if we want to run on dotnet directly.
}
}
根据我的理解,当你使用HTTP直接在5000端口访问你的应用程序时,你会得到一个SSL错误。即使你不使用HTTPS。
如果您有 app.UseHsts();
或 app.UseHttpsRedirection();
中的代码,那么它将使用HTTPS。
如果你让nginx来处理SSL,那么你可以从你的应用程序Startup.cs中删除以下代码
典型的启动代码。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else // Production
{
app.UseExceptionHandler("/Error");
// Remove to use HTTP only
app.UseHsts(); // HTTPS Strict mode
}
// Remove to use HTTP only
app.UseHttpsRedirection(); // Redirects HTTP to HTTPS
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc();
}