您当前的位置: 首页 >  .net

寒冰屋

暂无认证

  • 1浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

如何在局域网上托管ASP.NET Web应用程序

寒冰屋 发布时间:2021-07-21 10:26:11 ,浏览量:1

目录

介绍

问题

一个简单的解决方案

设置网络证书颁发机构

1. 证书颁发机构的证书

2. 证书颁发机构的根证书

3. 服务器的证书

存储证书

配置Web应用程序

启动服务器

示例应用程序

调试

得到教训

结论

  • 下载源代码 - 3.2 KB
介绍

允许专用网络(LAN)客户端连接到本地Windows ASP.NET Web应用程序并不像看起来那么容易。简单地将浏览器指向服务器ipaddress和端口号是行不通的。

问题

默认情况下,应用程序将使用地址http://localhost:5000或https://localhost:5001运行。Localhost是一个内部网络地址,旨在连接到与Web应用程序在同一台机器上运行的客户端,它有效地阻止了来自外部源的连接。可以通过使用http并用localhost替换服务器的网络地址来进行连接,但是客户端浏览器的地址栏会显示可怕的打开锁图标,并发出可怕的警告,告诉您如果您敢继续,将会访问您的内容。另一种方法是使用Https。但是这种类型的请求很少会比最初的“hello”握手更进一步。客户端一看到服务器的传输层安全证书 将服务器识别为本地主机,它会觉得不对劲,拒绝联系。

一个简单的解决方案

这只是配置ASP.NET Web应用程序的问题,以便它在初始“hello”握手期间向客户端显示有效的TLS 证书,并使客户端能够验证该证书。您需要将自己设置为您自己网络的证书颁发机构 (CA),以便生成客户可接受的证书,但这没什么大不了的。出色的NuGet证书管理包 Concerto使这项任务变得容易。

设置网络证书颁发机构

设置CA涉及使用公钥/私钥非对称加密。理解密钥对的关键在于,由私钥加密的数据只能由相应的公钥解密,反之亦然。网络证书颁发机构颁发证书来验证网络上运行的服务器的身份。客户端在连接到服务器之前需要查看并验证两个证书。第一个证书是服务器的证书。该证书通过使用CA的私钥对其进行签名来引用已验证该证书的可信证书颁发机构。客户端在客户端的可信CA存储中查找CA的根证书。如果找到,它会从证书中提取CA公钥并使用它来验证服务器的签名证书。最后,客户端从服务器的证书中提取服务器的公钥,并使用该密钥对发送到服务器的数据包进行加密。该数据包及其后的其他数据包使客户端和服务器能够通过使用会话密钥对两台机器之间的对话进行加密来有效地交换消息。需要创建三个证书。

1. 证书颁发机构的证书

创建包含公钥和私钥的CA机构证书。如果需要,可以将证书保存在受密码保护的pfx文件中。 

CertificateChainWithPrivateKey caCert = CertificateCreator.CreateCACertificate(Constants.CAname);
CertificateFileStore.SaveCertificate(caCert, cAcertPath, false, Constants.Password);

2. 证书颁发机构的根证书

将CA的根证书保存在“cer”文件中。它只包含CA的公钥。需要将此证书添加到每个客户端的受信任根证书存储中。

CertificateFileStore.SaveCertificate(caCert, cArootPath);

3. 服务器的证书

使用CA的私钥向服务器(主机)颁发签名证书

var hostCert = CertificateCreator.CreateCertificate(new[] { Constants.HostIpAddress },caCert); 
CertificateFileStore.SaveCertificate(hostCert, hostCertPath, false, Constants.Password);

存储证书

最好的方法是将证书存储在Windows证书存储区之一中,并让Windows在该位置管理证书。有一篇有趣的博客文章详细介绍了证书管理不正确可能引起的问题。要管理当前用户证书存储,请按Windows键,然后搜索并选择“管理用户证书”。将显示当前用户的证书存储中的文件夹。在客户端计算机上,将CA的根证书存储在Trusted Root Certificate Authorities Certificates子文件夹中。右键单击该文件夹并选择“所有任务/导入”。浏览到CAroot.cer的位置文件,选择它并按照提示操作。在服务器上做同样的事情,但选择Personal/Certificates文件夹作为位置并从HostCert.pfx和CAcert.pfx导入。您需要在文件资源管理器中更改扩展名过滤器,以便它引用pfx。而不是cer,否则您将不会在列表中看到它们。Pfx和cer是规定保存证书结构的格式参考。

配置Web应用程序

ASP.NET使用Kestrel作为其服务器。Kestrel配置起来很有趣,只需将以下内容添加到Web应用程序的appsettings.json文件中——记住更改Urls和主题名称以引用您自己的服务器地址。

"Kestrel": {
  "Endpoints": {
    "Http": { //reference the sever's network ipaddress here
      "Url": "http://192.168.1.14:5000"
    },
    "HttpsInlineCertStore": {
      "Url": "https://192.168.1.14:5001",
      "Certificate": {
        "Subject": "192.168.1.14",
        "Store": "My",
        "Location": "CurrentUser", //default
        "AllowInvalid": false //default
      }
    }
  }
}

启动服务器

最好使用命令提示符启动Web应用程序。为此,只需在Visual Studio的启动框中选择项目名称。Kestrel不需要使用IIS,因此我会避免选择该选项。现在所需要做的就是将客户端的浏览器指向服务器ipaddress和服务器侦听的Https端口。类似于https://192.168.1.10:5001。

示例应用程序

示例应用程序生成所需的三个TLS证书。配置是通过常量类的方式,它需要更改以满足您的要求。您还需要知道服务器的网络Ipaddress。执行此操作的简单方法是在命令提示符下输入“ipconfig”并在输出中搜索IPv4 地址。还有一点是,生成.cer文件的方法也将CA的私钥作为.key文件输出。在Constants类中设置isDeletePrivateKey bool将导致密钥被删除。它已经存储在CA的证书中,因此不需要它。该项目非常简单。这是主要的源代码:

 static public void CreatNetworkCertificates()
 {
     var cAcertPath = AddFileNameToPath(Constants.CAcertFile);
     var cArootPath = AddFileNameToPath(Constants.CArootFile);
     var hostCertPath = AddFileNameToPath(Constants.HostCertFile);
     var keyFilePath = Path.ChangeExtension(cArootPath, ".key");
     List filepaths = new() { cAcertPath, cArootPath, hostCertPath, keyFilePath };
     var existingFiles = filepaths.Where(p => File.Exists(p));
     if (existingFiles.Any())
     {
      Console.WriteLine("The following files already exist. Please remove them and try again");
      Console.WriteLine(string.Join(", ", existingFiles.ToArray()));
      return;
     }
     Console.WriteLine("Creating CA certificate...");
     var caCert = CertificateCreator.CreateCACertificate(Constants.CAname);

     Console.WriteLine($"Saved CA certificate in {cAcertPath}");
     CertificateFileStore.SaveCertificate(caCert, cAcertPath, false, Constants.Password);

     CertificateFileStore.SaveCertificate(caCert, cArootPath);
     Console.WriteLine($"Saved CA root certificate in {cArootPath}");

     //The CA's private key is also exported in a separate .key file. So need to delete 
     //that file as the CA's private key has already been saved in a pfx file
     if (Constants.IsDeletePrivateKey)
     {
      File.Delete(keyFilePath);
     }

     var hostCert = CertificateCreator.CreateCertificate(new[] { Constants.HostIpAddress },
                                                                 caCert);
     CertificateFileStore.SaveCertificate(hostCert, hostCertPath, false, Constants.Password);
     Console.WriteLine($"Saved host's certificate in {hostCertPath}");
 }
 static string AddFileNameToPath(string fileName) => Path.Combine(Constants.FilePath, 
                                                                     fileName);
}

调试

如果您的浏览器出现错误消息,请使用浏览器的开发人员工具/安全部分来获得对问题的更好描述,而不是通过单击打开的锁图标来获得。如果错误消息不是很有帮助,请不要感到惊讶,出于安全原因,它们故意含糊不清。告诉黑客他们需要修复什么并不是什么好政策。

该Wireshark的应用是极好的检查网络数据包。使用过滤器仅筛选出服务器和客户端之间的对话是个好主意。下图显示了Wireshark跟踪的一部分。有一个简单的过滤器( tcp.port==5001)来限制对Web应用程序侦听端口上的事务的选择。它显示了初始握手和应用程序数据交换的详细信息。显示的最后一个数据包确认服务器即将使用商定的会话密钥发送加密数据。

得到教训

更换证书后务必清除SSL证书缓存,否则您的浏览器可能会继续使用旧证书。为此,请按Windows键,然后在搜索面板中搜索并选择“互联网选项”。接下来,选择内容选项卡并单击“清除 SSl 状态”按钮。我认为证书缓存是浏览器的责任,但显然,Windows现在已经承担了这项任务。

结论

在本地网络上暂存Web应用程序可能是开发中的一个有用步骤,因为它可以在与构建应用程序的环境不同的环境中运行的机器上评估性能。使用Kestrel意味着配置很简单,而且不需要弄乱IIS,根据我的经验,这个活动几乎总是以流泪结束。

https://www.codeproject.com/Articles/5301035/How-to-Host-an-ASP-NET-Web-Application-on-a-Local

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0570s