.NET下寄宿于控制台的HTTPS监听

附上原文连接:https://blogs.msdn.microsoft.com/jpsanders/2009/09/29/how-to-walkthrough-using-httplistener-or-http-server-unmanaged-code-c-as-an-ssl-simple-server/windows

写这边彻底是怕原连接挂了,时间长了命令难以记住。服务器

 

服务器监听代码

服务器代码只需将监听地址前缀改成https,其余都同样。app

HttpListener  httpListen = new HttpListener();
httpListen .Prefixes.Add("https://192.168.3.22:10022/xxx/");
httpListen .Start();

 

服务器生成自签名证书

这是MakeCert.exe的文档:http//msdn.microsoft.com/en-us/library/bfsktky3.aspx可使用此程序为应用程序生成自签名服务器证书。工具

使用Visual Studio 2008-2010,您只需使用程序菜单中的Visual Studio 2008或2010命令提示符便可访问MakeCert.exe。  (注意:对于Vista及更高版本,请确保您做为管理命令提示符运行,以便您具备适当的权限)ui

//MakeCert命令:
makecert.exe -sr LocalMachine -ss MY -a sha1 -n“CN = jsan17708317”-sky exchange -pe -eku 1.3.6.1.5.5.7.3.1

该命令应该返回'Succeeded'。spa

如今,您须要确保Root Authority是可信的。要从上面使用的相同命令提示符执行此操做,请键入MMC。而后选择“文件”,“添加/删除管理单元...”.net

图片

而后点击“添加”按钮,选择“证书”。点击“添加”按钮......命令行

图片

选择“计算机账户”,而后单击“下一步>”,“完成”,“关闭”和“肯定”。线程

图片

您应该可以扩展左侧的树以显示我的证书并找到您刚添加的那个(个人惟一一个显示)...3d

图片

双击您的证书,您将看到相似于此的内容:

图片

您须要解决Red X问题(没法验证证书到受信任的根目录)。

单击此对话框中的“证书路径”选项卡,而后单击“查看证书”上的问题证书(根代理)。

图片

您将看到问题是此证书不在“受信任的根”存储中。 

  图片

要进入商店,请单击“详细信息”选项卡,而后单击“复制到文件...”按钮

图片

点击“下一步>”两次,而后点击“浏览”按钮,将文件保存到本地文档目录(将其命名为“RootCert”),而后完成向导,直到您成功导出证书。如今咱们将证书导入受信任的根存储区。

展开“受信任的根证书颁发机构”树,而后右键单击“证书”

图片 

从上下文菜单中选择“全部任务...”,而后选择“导入...”并导航到保存“RootCert”的位置,并经过完成向导导入证书。

如今,您应该能够返回到我的存储中的服务器证书,并查看证书没有问题(将此对话框保留为下一步):

图片

这里的最后一步是获取指纹哈希以供下一节使用。

单击“详细信息”选项卡,而后向下滚动到对话框中的“指纹”字段,而后单击它。而后用鼠标扫除下面的数字(不要错过任何)并使用Ctrl + C组合键复制这些数字。

图片

打开记事本并将这些数字粘贴到其中,以便在下一步中使用。

 

配置机器以使用证书

最后,您须要配置计算机以将刚刚建立的证书与HttpListener正在侦听https请求的端口和IP地址相关联。

更新:对于Vista及更高版本,您将使用此处列出的netsh http命令而不是httpcfg.exe:http//msdn.microsoft.com/en-us/library/cc307236( VS.85).aspx

您须要从命令行运行httpcfg并提供您在上一节中得到的哈希,但您须要删除这些数字之间的空格。在个人例子中,我删除了空格,哈希是:f4bb35424190e006e5476e97430c5b8136ee5da5

这是我运行的httpcfg命令,用于关联与个人机器和端口8081(/ i 0.0.0.0:8081)关联的全部IP地址的证书:

//httpcfg命令:
httpcfg set ssl / i 0.0.0.0:8081/h f4bb35424190e006e5476e97430c5b8136ee5da5

对于Vista及更高版本,您须要先生成一个guid。从上面用过的VS提示符生成能够输入的证书:guidgen.exe。而后点击复制按钮复制新建立的GUID。将其与您的哈希一块儿粘贴到记事本中。您将须要文本的第一部分(例如:{FCB0C645-E745-490F-9E7D-2171E03DC9B0})进行下一步。

//netsh命令
netsh http add sslcert ipport = 0.0.0.0:8081 certhash = f4bb35424190e006e5476e97430c5b8136ee5da5 appid = {FCB0C645-E745-490F-9E7D-2171E03DC9B0}

运行时,您将看到结果:HttpSetServiceConfiguration以0结束。

如今仔细检查此计算机的SSL绑定:

C:\ Program Files \支持工具> httpcfg查询ssl 
    IP:
    0.0.0.0:8081哈希:f4bb35424190e0 6e5476e9743 c5b8136ee5da5指导
    :{00000000-0000-0000-0000-000000000000} 
    CertStoreName:(null)
    CertCheckMode:0 
    RevocationFreshnessTime:0 
    UrlRetrievalTimeout: 0 
    SslCtlIdentifier:(null)
    SslCtlStoreName:(null)
    标志:0 
------------------------------------ ------------------------------------------

对于Vista及以上命令是:netsh http show sslcert

故障排除

若是应用程序不起做用,首先验证您是否正确执行了上述每一步(没有遗漏某些内容或某些步骤)。

验证您的证书是否显示IP和Hash字段与您正在侦听的内容相对应,而且Hash是您先前为证书获取的哈希。

检查httpcfg查询ssl并查看是否有其余侦听器可能与同一端口冲突。使用命令http delete ssl / i xxxx:8081删除冲突(将xxxx替换为您在同一端口上侦听的任何IP地址)。

对于Vista及更高版本,请确保您使用管理权限运行HttpListener代码,不然您将没法注册您的计算机名称(您将得到访问被拒绝或来自非托管代码的错误代码5)。

补充信息

这是一个简单的例子。您可能不但愿在处理一个请求后中止侦听。您须要提供一种方法来优雅地关闭侦听器并处理工做线程上的请求。

您能够在HttpCfg中指定特定的IP范围(在MSDN中搜索HttpCfg语法)。在个人示例中,您可使用此绑定到IP地址10.10.3.4:httpcfg 
set ssl / i 10.10.3.4:8081 / h f4bb35424190e006e5476e97430c5b8136ee5da5

您没法在同一端口上侦听http和https流量。

 

客户端代码

    public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
      return true;
    }

  if (serverUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  {
    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  }

  X509Certificate2 cert = new X509Certificate2(@"C:\Users\Administrator\Documents\RootCert.cer");
  objRequest.ClientCertificates.Add(cert);
相关文章
相关标签/搜索