NancyFX + SSL - 如何让 "this.RequireHttps()" 在 Linux 上工作?
NancyFX + SSL - how to make "this.RequireHttps()" work on Linux?
我的自托管* NancyFX 应用程序使用 SSL,我使用“this.RequiresHttps()”来标记某些模块 "SSL only"。在 Windows 我遵循了这个教程:
https://github.com/NancyFx/Nancy/wiki/Accessing-the-client-certificate-when-using-SSL
之后:
netsh http add sslcert ipport=0.0.0.0:1234 certhash=303b4adb5aeb17eeac00d8576693a908c01e0b71 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable
我使用了以下代码:
public static void Main(string[] args)
{
List<Uri> uri2 = new List<Uri>();
uri2.Add(new Uri("http://localhost:80"));
uri2.Add(new Uri("https://localhost:1234"));
HostConfiguration hc = new HostConfiguration()
{
EnableClientCertificates = true
};
using (var host = new NancyHost(hc,uri2.ToArray()))
{
host.Start();
string runningOn = "\n\n";
foreach(var item in uri2)
{
runningOn += item+"\n";
}
Console.WriteLine("Your application is running on " + runningOn/*uri2.First()*/);
Console.WriteLine("Press any [Enter] to close the host.");
Console.ReadLine();
}
}
它工作得很好——未加密的数据可以在端口 80 上访问,SSL 在端口 1234 上工作。
问题是 - 我想在我的 Linux 主机上做同样的事情,但我似乎找不到等同于 Windows "netsh[=57 的命令=]".
现在我按照本教程最终使用 nginx 提供 SSL:
https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Nginx-on-Ubuntu
然后将nginx配置修改为如下(不要介意路径,这只是我的开发虚拟机):
server {
listen 80;
listen 443 ssl;
ssl_certificate /home/james/sslCert2/server.crt;
ssl_certificate_key /home/james/sslCert2/server.key;
server_name localhost;
root /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/;
location /Content/ {
alias /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/Content/;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ {
expires 365d;
}
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
然后修改 Nancy 代码以仅侦听端口 8080。
虽然上面的工作正常(nginx 正在管理 SSL 连接并将请求重定向到端口 8080 的 Nancy),但它使“this.RequiresHttps()”变得毫无价值 - 当我像这样使用它:
this.RequiresHttps(true, 443)
Chrome 报告 ERR_TOO_MANY_REDIRECTS.
所以我的问题是 - 如何 to/is 在 Linux 上配置 Nancy 以生成“this.RequiresHttps()”?
南希团队的人也可以解释一下“EnableClientCertificates”主机配置选项的作用吗?是否需要启用 SSL?文档比较少...
提前致谢。
*虽然我以 自托管 的方式开始项目,但如有必要,可以将其修改为使用 nginx 或任何其他托管形式。
结合:南希团队的帮助,其他一些资源和我空虚的头脑我终于设法解决了这个问题。
首先 - 错误 ERR_TOO_MANY_REDIRECTS 实际上是我第一次 post 时 nginx 配置的逻辑结果 - 当用户试图访问受 SSL 保护的资源时,Nancy将他重定向到 443 端口,这是正确的行为,然后 nginx 在该端口上收到请求,建立 SSL 连接...并在端口 8080 将其发送回 Nancy。Since nginx 总是在不安全的连接上与 Nancy 交谈(http://127.0.0.1:8080) Nancy had no way of knowing that SSL was being used, so it again redirected the request to port 443, nginx again picked it up, established SSL and send it to http://127.0.0.1:8080 - 这是我们的无限循环。在 Windows 上它有效,因为应用程序可以直接访问 http 和 https 个端点,并且正在管理它们。
修复相当简单(虽然我花了一些时间才找到它)并且涉及两个步骤:
将以下行添加到 Nancy 引导程序中的 RequestStartup 方法:
SSLProxy.RewriteSchemeUsingForwardedHeaders(管道);
这将使 Nancy 监听 X-Forwarded-Proto header - 当它存在时 - 此方法 将覆盖请求 url 方案到 https - 所以现在:
this.RequireHttps()
将在启用 SSL 时检测到请求。
用这样的东西配置 nginx(仍然 - 不要介意路径 - 这只是开发机器):
服务器{
听 80;
server_name localhost;
root /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/;
location /Content/ {
alias /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/Content/;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ {
expires 365d;
}
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
服务器{
听 443 SSL;
ssl_certificate /home/james/sslCert2/server.crt;
ssl_certificate_key /home/james/sslCert2/server.key;
server_name localhost;
root /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/;
location /Content/ {
alias /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/Content/;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ {
expires 365d;
}
}
location / {
proxy_pass http://127.0.0.1:8080;
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;
}
}
注意:我对 nginx 没有经验 - 虽然以上似乎有效,但可能存在错误 (如果有人看到任何 - 请指出他们out) 或更好的方法 - 您已被警告 :)
那么这里发生了什么? "Normal" 请求将到达端口 80 并且将简单地重定向到 Nancy 标准路径,当 nginx 在端口 443 上收到一些请求时,它将包括 X-Forwarded-For header,Nancy 会检测到它并且 它不会再重定向 - 它应该是。
我希望这对某人有所帮助。
此致。
我的自托管* NancyFX 应用程序使用 SSL,我使用“this.RequiresHttps()”来标记某些模块 "SSL only"。在 Windows 我遵循了这个教程:
https://github.com/NancyFx/Nancy/wiki/Accessing-the-client-certificate-when-using-SSL
之后:
netsh http add sslcert ipport=0.0.0.0:1234 certhash=303b4adb5aeb17eeac00d8576693a908c01e0b71 appid={00112233-4455-6677-8899-AABBCCDDEEFF} clientcertnegotiation=enable
我使用了以下代码:
public static void Main(string[] args)
{
List<Uri> uri2 = new List<Uri>();
uri2.Add(new Uri("http://localhost:80"));
uri2.Add(new Uri("https://localhost:1234"));
HostConfiguration hc = new HostConfiguration()
{
EnableClientCertificates = true
};
using (var host = new NancyHost(hc,uri2.ToArray()))
{
host.Start();
string runningOn = "\n\n";
foreach(var item in uri2)
{
runningOn += item+"\n";
}
Console.WriteLine("Your application is running on " + runningOn/*uri2.First()*/);
Console.WriteLine("Press any [Enter] to close the host.");
Console.ReadLine();
}
}
它工作得很好——未加密的数据可以在端口 80 上访问,SSL 在端口 1234 上工作。
问题是 - 我想在我的 Linux 主机上做同样的事情,但我似乎找不到等同于 Windows "netsh[=57 的命令=]".
现在我按照本教程最终使用 nginx 提供 SSL:
https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Nginx-on-Ubuntu
然后将nginx配置修改为如下(不要介意路径,这只是我的开发虚拟机):
server {
listen 80;
listen 443 ssl;
ssl_certificate /home/james/sslCert2/server.crt;
ssl_certificate_key /home/james/sslCert2/server.key;
server_name localhost;
root /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/;
location /Content/ {
alias /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/Content/;
location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ {
expires 365d;
}
}
location / {
proxy_pass http://127.0.0.1:8080;
}
}
然后修改 Nancy 代码以仅侦听端口 8080。
虽然上面的工作正常(nginx 正在管理 SSL 连接并将请求重定向到端口 8080 的 Nancy),但它使“this.RequiresHttps()”变得毫无价值 - 当我像这样使用它:
this.RequiresHttps(true, 443)
Chrome 报告 ERR_TOO_MANY_REDIRECTS.
所以我的问题是 - 如何 to/is 在 Linux 上配置 Nancy 以生成“this.RequiresHttps()”?
南希团队的人也可以解释一下“EnableClientCertificates”主机配置选项的作用吗?是否需要启用 SSL?文档比较少...
提前致谢。
*虽然我以 自托管 的方式开始项目,但如有必要,可以将其修改为使用 nginx 或任何其他托管形式。
结合:南希团队的帮助,其他一些资源和我空虚的头脑我终于设法解决了这个问题。
首先 - 错误 ERR_TOO_MANY_REDIRECTS 实际上是我第一次 post 时 nginx 配置的逻辑结果 - 当用户试图访问受 SSL 保护的资源时,Nancy将他重定向到 443 端口,这是正确的行为,然后 nginx 在该端口上收到请求,建立 SSL 连接...并在端口 8080 将其发送回 Nancy。Since nginx 总是在不安全的连接上与 Nancy 交谈(http://127.0.0.1:8080) Nancy had no way of knowing that SSL was being used, so it again redirected the request to port 443, nginx again picked it up, established SSL and send it to http://127.0.0.1:8080 - 这是我们的无限循环。在 Windows 上它有效,因为应用程序可以直接访问 http 和 https 个端点,并且正在管理它们。
修复相当简单(虽然我花了一些时间才找到它)并且涉及两个步骤:
将以下行添加到 Nancy 引导程序中的 RequestStartup 方法:
SSLProxy.RewriteSchemeUsingForwardedHeaders(管道);
这将使 Nancy 监听 X-Forwarded-Proto header - 当它存在时 - 此方法 将覆盖请求 url 方案到 https - 所以现在:
this.RequireHttps()
将在启用 SSL 时检测到请求。
用这样的东西配置 nginx(仍然 - 不要介意路径 - 这只是开发机器):
服务器{ 听 80;
server_name localhost; root /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/; location /Content/ { alias /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/Content/; location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ { expires 365d; } } location / { proxy_pass http://127.0.0.1:8080; }
}
服务器{ 听 443 SSL; ssl_certificate /home/james/sslCert2/server.crt; ssl_certificate_key /home/james/sslCert2/server.key;
server_name localhost; root /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/; location /Content/ { alias /home/james/nancywebpageroot/NancyWebPage.DPL.Services/bin/Debug/Content/; location ~* \.(jpg|jpeg|png|gif|ico|css|js|ttf)$ { expires 365d; } } location / { proxy_pass http://127.0.0.1:8080; 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; }
}
注意:我对 nginx 没有经验 - 虽然以上似乎有效,但可能存在错误 (如果有人看到任何 - 请指出他们out) 或更好的方法 - 您已被警告 :)
那么这里发生了什么? "Normal" 请求将到达端口 80 并且将简单地重定向到 Nancy 标准路径,当 nginx 在端口 443 上收到一些请求时,它将包括 X-Forwarded-For header,Nancy 会检测到它并且 它不会再重定向 - 它应该是。
我希望这对某人有所帮助。
此致。