• C# 实现基于exe内嵌HTTPS监听服务、从HTTP升级到HTTPS 后端windows服务


            

    将HTTP后端服务升级为HTTPS服务的详细步骤

            随着网络安全要求的提高,越来越多的服务需要支持HTTPS,以确保数据传输的安全性。对于基于Windows服务内嵌HTTP监听服务的应用,直接支持HTTPS可能不像在IIS中部署的WebAPI服务那样简单,需要进行一定的修改和配置。本文将详细介绍如何将基于Windows服务的HTTP后端服务升级为HTTPS服务,并在服务器环境上进行HTTPS端口绑定设置。

    前提条件

    在开始之前,确保你已经具备了HTTPS证书(通常是一个.pfx文件)。

    问题需求

            由于客户需要把原有HTTP后端服务升级为支持https的服务,因为原有的HTTP服务是一个基于WINDOWS服务内嵌HTTP监听服务实现的,并不支持https, 也不像其他IIS中部署的WebAPI服务那样直接加载HTTPS证书,所以这里需要修改原服务支持https和服务器环境上进行HTTPS端口绑定设置。

    具体步骤

    (注:以下操作需要你已经具备了HTTPS证书。)

    1、安装证书,双击pfx文件,安装到:“本地计算机”–>“个人”;

    2、双击打开crt证书,详细信息中可以看到(certhash)指纹 相关信息;

    3、执行端口绑定(默认443端口)

    netsh http add sslcert ipport=0.0.0.0:8080 certhash=指纹 appid={程序GUID/newguid} clientcertnegotiation=enable
    

    4、服务端程序实现:

    1. using System;
    2. public class HttpService
    3. {
    4. public MyHttpServer()
    5. {
    6. System.Net.HttpListener httpListener = new System.Net.HttpListener();
    7. httpListener.AuthenticationSchemes = System.Net.AuthenticationSchemes.Anonymous;
    8. httpListener.Prefixes.Add("https://*:8000/"); // 支持https
    9. httpListener.Start();
    10. new System.Threading.Thread(new System.Threading.ThreadStart(delegate
    11. {
    12. while (true)
    13. {
    14. try
    15. {
    16. System.Net.HttpListenerContext httpListenerContext = httpListener.GetContext();
    17. new System.Threading.Thread(new System.Threading.ParameterizedThreadStart((input) =>
    18. {
    19. System.Net.HttpListenerContext ctx = (System.Net.HttpListenerContext)input;
    20. System.Net.HttpListenerRequest request = ctx.Request;
    21. string pram = request.QueryString["Data"];//Get入参
    22. string responseMessage = string.Empty;//返回值
    23. if (!string.IsNullOrEmpty(pram))
    24. {
    25. //Get入参
    26. pramOrg = pram;
    27. pram = System.Web.HttpUtility.UrlDecode(pram);
    28. }
    29. //POST入参
    30. if (request.HttpMethod == "POST")
    31. {
    32. //处理业务请求
    33. StreamReader reader = new StreamReader(request.InputStream, Encoding.UTF8);
    34. pram = reader.ReadToEnd();
    35. reader.Close();
    36. reader.Dispose();
    37. }
    38. #region 业务处理
    39. try
    40. {
    41. //业务处理
    42. responseMessage = "业务结果";
    43. }
    44. catch (Exception ex)
    45. {
    46. //异常处理
    47. responseMessage = ex.Message;
    48. }
    49. #endregion 业务处理
    50. #region 返回给调用者
    51. //输出类型
    52. httpListenerContext.Response.ContentType = "text/html; charset=UTF-8";
    53. //返回状态
    54. httpListenerContext.Response.StatusCode = 200;
    55. //设置授权,尝试解决Jquery跨域问题
    56. //httpListenerContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
    57. //httpListenerContext.Response.Headers["Access-Control-Allow-Methods"] = "GET,POST";
    58. //httpListenerContext.Response.Headers["Access-Control-Max-Age"] = "1000";
    59. try
    60. {
    61. //输出界面内容
    62. if (!string.IsNullOrEmpty(responseMessage))
    63. {
    64. //返回文本内容
    65. using (StreamWriter writer = new StreamWriter(httpListenerContext.Response.OutputStream))
    66. {
    67. writer.Write(responseMessage);
    68. }
    69. }
    70. }
    71. catch
    72. {
    73. //刷新太快异常,不做处理
    74. }
    75. #endregion 返回给调用者
    76. })).Start(httpListenerContext);
    77. }
    78. catch
    79. { }
    80. }
    81. })).Start();
    82. }
    83. }

    如上面执行端口绑定过程中报错,或添加失败,可以参考下面的处理:

    1、检查netsh 命令的参数是否正确;

    2、SSL 证书添加失败, 错误: 1312 指定的登录会话不存在。它可能已经被终止。的处理方法:

         键盘 WIN+R 输入mmc.exe,如下:

        

      点‘确定“,弹出如下控制台根节点界面,

    选择 文件->添加/删除管理单元,或直接快捷键ctrl+m 弹出如下,并进行操作:

    然后再到个人导入证书

    最后将SSL证书绑定至端口号

    netsh http add sslcert ipport=0.0.0.0:8080 certhash=指纹 appid={程序GUID/newguid} clientcertnegotiation=enable
    

    结语

            通过以上步骤,你可以成功将基于Windows服务的HTTP后端服务升级为HTTPS服务。这不仅提升了服务的安全性,还符合现代网络安全的最佳实践。在实施过程中,如果遇到任何问题,建议查阅相关文档或咨询专业人士以获得进一步帮助。通过不断学习和实践,你将能够熟练掌握更多的网络安全和服务部署技能,为开发高效、安全的应用程序奠定坚实基础。

     

  • 相关阅读:
    《Fundamantals of Software Architecture》 Q&A
    分析各大常用的JS加密优缺点
    迅捷 FW300R固件升级参考
    css标签及其作用
    面试题:深拷贝、浅拷贝、引用拷贝的区别
    【MySQL知识点】唯一约束、主键约束
    Fiddler抓包工具详解
    Zabbix 6.0:原生高可用(HA)方案部署
    MySQL主从分离读写复制
    CMU15445 (Fall 2019) 之 Project#1 - Buffer Pool 详解
  • 原文地址:https://blog.csdn.net/martian665/article/details/140268303