接上篇《WebApi服务URI加密及验证的两种方式》,在实际开发中,仅对URI进行加密是不够的,在传输层采用SSL加密也是必须的。

如果服务寄宿于IIS,那对传输层加密非常简单仅需要配置一下项目属性开启SSL即可,所用的证书也是IIS帮你搞定(默认443端口证书),基本就是傻瓜式配置后即可强制使用HTTPS访问资源。

而在Self Host WebApi服务中使用传输层SSL加密,则需要自己手动绑定服务器端的证书,并且在服务器端对客户端Request验证其是否为HTTPS访问方式;在客户端也需要对原有(上一篇)代码做一些小小的补充。

服务端:

服务端的工作分为服务器证书绑定,以及WebApi自宿主代码修改。

1:服务器证书绑定

关于如何在服务器端绑定一个自签名的证书,网上有很多资料,这里只是简要记录一下要点。因为认证机构颁发的证书都需要钱,开发测试过程中不需要购买证书,只需要在测试端口绑定一个自签名证书即可。

step 1: 找一个可用的证书指纹

    我是在开发环境下的IIS(服务器证书)中找的一个已安装的证书,即IIS Express Development Certificate。找到详细信息中的指纹(一串16进制加密数字),复制备用;

step 2:拿到项目的UUID,我就用的sln文件中该项目的UUID;

step 3:以管理员权限运行cmd,为指定端口绑定一个自签名的证书

    netsh命令不再详述,只给出这里需要用到得3个命令:

1)端口7777绑定证书:netsh http add sslcert ipport=0.0.0.0:7777 certhash=8239ff15609faaa25f55d07931e78bee96bbXXXX appid={FAE04EC0-301F-11D3-BF4B-00C04F79EFBC},运行后如果绑定成功,将提示“成功添加SSL证书”;

      其中,certhash即step1复制的指纹,appid即step2的uuid;  

    2)端口7777证书删除:netsh http delete sslcert ipport=0.0.0.0:7777,运行成功后如果成功删除该端口上绑定的证书,则将提示“成功删除SSL证书”;

    3)查看SSL证书:netsh http show sslcert,执行后将列出机器上所有端口绑定的证书,找到端口7777的证书,将能看到证书哈希及应用程序ID信息,与之前添加的一致。

2:Web API 自宿主服务器端代码修改

服务器端的代码修改包括:1)uri的scheme验证,确保资源访问必须采用ssl加密;2)自宿主服务器启动监听uri改为https字头。

scheme验证仍然采用与上篇文章相同的方法,即实现一个新的HttpMessageHandler,并将其注入到消息处理管道中:

 1     public class HttpsGuard : DelegatingHandler2     {3         protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)4         {5             if (!request.RequestUri.Scheme.Equals(Uri.UriSchemeHttps, StringComparison.CurrentCultureIgnoreCase))6             {7                 var response = new HttpResponseMessage(HttpStatusCode.BadRequest)8                 {9                     Content = new StringContent("Https is required for security reason")
10                 };
11                 return Task.FromResult(response);
12             }
13             return base.SendAsync(request, cancellationToken);
14         }
15     }

View Code

修改Startup的Configuration,将上面的HttpMessageHandler注入:

 1         public void Configuration(IAppBuilder app)2         {3             // Configure Web API for self-host. 4             var config = new HttpConfiguration();5             config.Routes.MapHttpRoute(6                 name: "DefaultApi",7                 routeTemplate: "api/{controller}/{action}/{param}",8                 defaults: new { id = RouteParameter.Optional }9             );
10             //注入response handler
11             config.MessageHandlers.Add(new ResponseHandler());
12             //注入httpmessagehandler用于验证request是否均采用SSL加密传输
13             config.MessageHandlers.Add(new HttpsGuard());
14             //允许WebApi的跨域访问 - 测试条件下允许所有域的跨域访问
15             var cors = new EnableCorsAttribute("*", "*", "*");
16             config.EnableCors(cors);
17
18             app.UseWebApi(config);
19         }

View Code

服务器启动则改为如下:

1 var urlBase = new UriBuilder("HTTPS", ip, 7777).Uri;
2
3 var server = WebApp.Start<Startup>(url: urlBase.AbsoluteUri);

View Code

以上三部分修改完成后,对web api服务端代码的修改完毕,可以启动服务,正常开始监听本地7777端口。此时如果在浏览器中访问,则会提示证书失效,是否继续访问等等大家熟悉的场景。

客户端:

如何远程调用SSL通信加密后的Web Api资源

以上步骤完成后,直接在客户端经由上一篇所重写的HttpClient访问加密后的资源,一般会报一个“基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。”这样的错(我的VS是中文版的),产生这个错误的原因是因为服务器上7777端口绑定的证书错了(因为我们搞了个自签名的测试证书),或者证书过期了啊什么的,也都会出现这个问题,总之就是证书不受信任了。绑定一个有效的受信证书就不会有这个问题了(没试过)。这里为了方便开发及测试,需要对客户端代码做如下修改,目的就是不验证证书的有效性,即接受所有证书的认证。

新增如下方法:

private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{return true;
}

View Code

在base.SendAsync(request, cancellationToken)之前,调用下这个方法:

ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;

即可。

或者不需要新增这个方法,直接在base.SendAsync(request, cancellationToken)之前新增一句:ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };即可,简单粗暴,信任所有证书。

以上步骤完成之后,即可通过

var myResponse = myClient.GetAsync("https://192.168.1.166:7777/api/test/GetUser/id=123123&name=jiakai").Result;

类似的URI访问服务器资源。经测试,SSL加密后的客户端-服务器通信消息,在fiddler中无法抓取到包(网上有fiddler抓取https通信包的各种方法,不较真了)。

经过上篇与本篇的通信加密方法,即可建立一套基本的web api资源安全通信方式,可满足通常情况下的通信安全需求。

转载于:https://www.cnblogs.com/scoluo/p/10191090.html

Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)相关推荐

  1. 连接数据库报com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    JDBC加载驱动,连接SQLServer 2012 报 java.ext.dirs: C:\Program Files\Java\jdk1.8.0_331\jre\lib\ext;C:\Windows ...

  2. com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立 安全连接。

    @TOcom.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立 安全连接.C co ...

  3. JDBC连接SQLServer2012报错:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。

    目录 一.场景描述: 二.解决方法(实测通过) 三.注意事项 四.测试运行效果 错误信息:The server selected protocol version TLS10 is not accep ...

  4. SQLServer JDBC 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    此方法适用于JDK1.8,应用场景常见于window server操作系统 网上有不少人遇到过使用jdbc连接sqlserver出错的情况,错误信息为 错误一: 驱动程序无法通过使用安全套接字层(SS ...

  5. com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立 安全连接

    com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立 安全连接 驱动版本 最新 ...

  6. 问题解决:idea 中无法连接 sql server 数据库,报错 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    报的错误信息如下: [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接.错误:"PKIX path building failed: sun ...

  7. [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is

    文章目录 项目场景 问题描述 解决方案 方案一:修改jdk(推荐) 方案二:修改idea 测试连接 项目场景 Idea使用DateSource插件连接SqlServer数据库报错 问题描述 [08S0 ...

  8. JDBC连接数据库遇到的“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。”问题解决方法

    JDBC连接数据库遇到的"驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接."问题解决方法! 时间:2018-12-20 本文章向大家介绍JDB ...

  9. 关于解决驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“sun.security.validator.ValidatorException:

    首先 如果你是在访问一个网站,可以通过可以通过导入证书的方式解决该问题.或者跳过ssl证书验证.这些操作步骤,其他博主已经写的非常详细了.在这里不做赘述. 如果你只是单纯链接一个本地数据库,却莫名其妙 ...

  10. idea连接sql server报错:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接

    idea连接sql server报错:驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接 运行环境:IDEA2020.1:JDK1.8:SQL SERVER2005: ...

最新文章

  1. 智能车竞赛云上比赛第二天
  2. 8086汇编基础 push,pop指令执行时,sp怎么变
  3. 在使用chrome调试angular2的时候出现下面问题
  4. 深度解密Go语言之unsafe
  5. Spring Boot 集成 WebSocket通信信息推送!
  6. cefsharp重写默认js弹窗(alert/confirm/prompt)
  7. “3D几何与视觉技术”全球在线研讨会第四期~几何深度学习
  8. 2013年计算机考试ppt,2013年全国专业技术人员计算机应用能力考试PPT题库
  9. 【干货】神策标签生产引擎架构
  10. LeetCode-2: Add Two Numbers
  11. 计算机操作系统知识整理-计算机操作系统概述(计算机操作系统入门指南)
  12. 天正2014打开加载lisp_天正CAD2014对不信任加载项的解决方法
  13. THINKPHP官方推荐第三方插件库
  14. 让html img图片垂直居中的三种方法
  15. 【Scala】Scala中的模式匹配、类型参数与隐式转换
  16. .Net Core 微信/支付宝 官方Demo
  17. C#基于RealPlayX.ocx视频监控整合程序
  18. 用python成为顶级黑客-python绝技:运用python成为顶级黑客 PDF 超清中文版
  19. Android移动应用开发之Viewpage2+fragment实现微信滑动界面的效果
  20. 智能驾驶车辆横向控制算法

热门文章

  1. 用R演示逻辑回归过程-值得收藏
  2. 内推|网易高级数据分析师(地点:杭州)
  3. python基础--集合
  4. win10环境下MinGW和MSYS的安装与配置
  5. Linux 入门记录:五、vi、vim 编辑器
  6. leetcode : Rotate List
  7. 第五篇:白话tornado源码之褪去模板的外衣
  8. (转)汉字转拼音码缩写
  9. aodv包头分析-上
  10. JPress v2.0-rc.6 发布,新增 Java 插件的在线升级功能