一步步改造wcf,数据加密传输-匿名客户端加密传输
一步步改造wcf,数据加密传输-匿名客户端加密传输
百度搜索wcf加密传输,资料挺多,真真正正能用的确不多. 一是本来就很复杂,而是各位大神给的资料不足.本人今天来提供一个简易方法. 匿名客户端加密传输
1.契约
建立契约工程CalcContract,实现两个数的求和.
[ServiceContract]
public interface ICalculator
{
[OperationContract]
CalculatorResult Add(double x, double y);
}
[DataContract]
public class CalculatorResult
{
/// <summary>
///
/// </summary>
[DataMember]
public double Result { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
public double X { get; set; }
/// <summary>
///
/// </summary>
[DataMember]
public double Y { get; set; }
}
实现契约
public class Calculator:ICalculator
{
public CalculatorResult Add(double x, double y)
{
Console.WriteLine(x.ToString() + "+" + y.ToString() + "=" + (x + y).ToString());
return new CalculatorResult()
{
Result = x + y,
X = x,
Y = y
};
}
}
2.服务端实现
不用IIS实现,用控制台的方式实现,添加一个控制台程序Host,Main函数中:
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Calculator)))
{
host.Opened += delegate
{
Console.WriteLine("Service Has Started.Press any key to quit.");
};
//通讯状态转换到已打开
host.Open();
Console.ReadLine();
}
}
}
App.config中关于wcf的配置
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
<behavior name="behaviorConfig">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8889/calculatorservice/data" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<basicHttpBinding >
<binding name="basicHttpBindingConfiguration"/>
</basicHttpBinding>
</bindings>
<services>
<service name="CalcContract.Calculator" behaviorConfiguration="behaviorConfig">
<endpoint address="http://127.0.0.1:8889/calculatorservice"
binding="basicHttpBinding" bindingConfiguration="basicHttpBindingConfiguration" contract="CalcContract.ICalculator" >
</endpoint>
</service>
</services>
</system.serviceModel>
3.客户端
建立客户端控制台程序Client.先运行起服务端,在客户端添加服务引用,命名为CalcServiceReference,这个我就略过了.添加引用后.Main函数中代码为:
static void Main(string[] args)
{
CalcServiceReference.CalculatorClient client = new CalcServiceReference.CalculatorClient();
while(true)
{
double x = 100.0;
double y = 200.0;
CalculatorResult result = client.Add(x, y);
Console.WriteLine(result.Result.ToString());
Console.ReadLine();
}
}
Appconfig的配置如下:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ICalculator" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://127.0.0.1:8889/calculatorservice" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ICalculator" contract="CalcServiceReference.ICalculator"
name="BasicHttpBinding_ICalculator" />
</client>
</system.serviceModel>
4.运行
先运行服务端,再运行客户端.在客户端控制台敲回车,传输100和200的服务端计算,然后服务端返回给客户端打印出300,得到100+200的正确结果.
5.明文传输
用HTTP Analyzer Full抓包查看,传输的数据为明文,如下2个图片
6.说明
这个例子中使用的basicHttpBinding绑定, 接下来我将一步步改造这个项目,使能最简单实现加密传输
7.修改服务端的配置
- a.修改endpoint的binding为wsHttpBinding
- b.在 节点中增加一个关于wsHttpBinding的配置wsHttpBindingConfiguration, 并且
- c.修改endpoint下的bindingConfiguration的为wsHttpBindingConfiguration
8.制作一个证书
在vs的控制台输入:
makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=FirstCer -sky exchange –pe
makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=FirstCer -sky exchange –pe[这句不运行]
这样就制作了一个证书.
- b.控制台打开MCC,
- c.File-->Remove/Add Snap-in
- d.选择Cerfiticates双击,在弹出框中选择Computer Account,点击next-->Finish,点击OK.
- e.在左边树形目录中有了新节点:Certificates(Local Computer),点击Personal下的Certificates,发现FirstCer已经创建
- f.右键点击FirstCer,选择COPY,
- g.展开树形Trusted People-->Certificates,粘贴FirstCer到此处
在behaviors-->serviceBehaviors下增加
<behavior name="behaviorConfig">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:8889/calculatorservice/data" />
<serviceCredentials>
<!--指定一个 X. 证书,用户对认证中的用户名密码加密解密-->
<serviceCertificate findValue="FirstCer" x509FindType="FindBySubjectName" storeLocation="LocalMachine" storeName="My"/>
<clientCertificate>
<authentication certificateValidationMode="None"/>
</clientCertificate> </serviceCredentials>
</behavior>
并在services-service中增加这个behaviorConfig.
behaviorConfiguration="behaviorConfig"
9.更新客户端服务引用
- a.启动服务端
b.在VS中更新客户端的服务引用,appconfig得到更新.发现endpoint中增加一个节点
test
<identity>
<certificate encodedValue="XXXXXXXXXX" />
</identity>
- c.bindings中也自动更新节点wsHttpBinding
10.测试
- 1.启动服务端,再启动客户端,成功了么???????
NO,客户端出错了.出错信息:
The X.509 certificate CN=FirstCer chain building failed. The certificate that was used has a trust chain that cannot be verified. Replace the certificate or change the certificateValidationMode. The signature of the certificate cannot be verified.
- 2.客户端手动添加behaviors
-test
<behaviors>
<endpointBehaviors>
<behavior name="wsHttpBindingBehavior">
<clientCredentials >
<serviceCertificate >
<authentication certificateValidationMode="None" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
同时在endpoint中添加 behaviorConfiguration="wsHttpBindingBehavior"
记住:这一步非要重要,自动更新引用的时候, behaviorConfiguration="wsHttpBindingBehavior"容易丢掉.
在启动服务端,客户端,发现能通信了.并且抓包测试如下图
代码下载地址:https://download.csdn.net/download/hanghangz/11033385
说明:
- makecert.exe 生成的正式可以在 LocalMachine或是在CurrentUser下
- 手动补充wsHttpBindingBehavior这一步非常重要
- 必须你自己创建一个证书,不能用我代码的encodedValue
- 代码中包含改造前和改造后的代码,你可以按照文字一步一步来操作.
接下来,还需要研究怎么在生产环境来使用.
一步步改造wcf,数据加密传输-匿名客户端加密传输的更多相关文章
- 一步步改造wcf,数据加密传输-匿名客户端加密传输(2)
1 引言 前面的例子中, encodedValue这一串代码是自动生成的,所以在生产环境中,你需要安装一个VS201X,把代码放上去,然后刷新引用!!!就可以了,这么做的话,你可能是只 ...
- 重温WCF之WCF传输安全(十三)(2)基于SSL的WCF匿名客户端(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/13/2683514.html 这一篇我们利用上一篇制作的证书,来演示一个基于SSL的WCF服务, ...
- WCF进阶:扩展bindingElementExtensions支持对称加密传输
前面两篇文章WCF进阶:将编码后的字节流压缩传输和WCF 进阶: 对称加密传输都是实现了自定义编码,那两个例子中托管服务或者客户端调用都采用的代码实现,WCF更友好的方式是在app.config或 ...
- 【WP开发】不同客户端之间传输加密数据
在上一篇文章中,曾说好本次将提供一个客户端之间传输加密数据的例子.前些天就打算写了,只是因一些人类科技无法预知的事情发生,故拖到今天. 本示例没什么技术含量,也没什么亮点,Bug林立,只不过提供给有需 ...
- Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)
接上篇<WebApi服务URI加密及验证的两种方式>,在实际开发中,仅对URI进行加密是不够的,在传输层采用SSL加密也是必须的. 如果服务寄宿于IIS,那对传输层加密非常简单仅需要配置一 ...
- 不制作证书是否能加密SQLSERVER与客户端之间传输的数据?
不制作证书是否能加密SQLSERVER与客户端之间传输的数据? 在做实验之前请先下载network monitor抓包工具 微软官网下载:http://www.microsoft.com/en-us/ ...
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...
- 使用zlib模块实现HTTP服务端与客户端实现传输数据压缩
现如今在处理http请求的时候,由于请求的资源较多,如果不启用压缩的话,那么页面请求的流量将会非常大.启用gzip压缩,在一定程度上会大大的提高页面性能. 因此这写一个使用Node.js实现在http ...
- iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...
随机推荐
- De Bruijn序列
最近文章中经常出现及De Bruijin 这个关键字,网上搜索了一下,记录下来. De Bruijn序列 (德布鲁因序列) 问题:能否构造一个长度为2的n次方的二进制环状串,使得二进制环状串中总共2的 ...
- 2019.01.17 bzoj2333: [SCOI2011]棘手的操作(启发式合并)
传送门 启发式合并菜题. 题意:支持与连通块有关的几种操作. 要求支持连边,单点修改,连通块修改,全局修改和单点查值,连通块查最大值和全局最大值. 我们对每个连通块和答案用可删堆维护最大值,然后用启发 ...
- Java翻转数组的方法
java的api没用翻转数组的工具类,只能自己写了. int [] testIntArr = {1,2,3}; //翻转数组 for (int i = 0; i < testIntArr.len ...
- 第28章:MongoDB-索引--过期索引(TTL)
①过期索引(TTL) TTL索引是让文档的某个日期时间满足条件的时候自动删除文档,这是一种特殊的索引,这种索引不是为了提高查询速度的,TTL索引类似于缓存,缓存时间到了就过期了,就要被删除了 ②范例: ...
- AtCoder Beginner Contest-060
A - Shiritori Problem Statement You are given three strings A, B and C. Check whether they form a wo ...
- 1.8.2suspend与resume方法的缺点-独占
这两个方法使用不当,容易造成公共的同步对象的独占,使得其他线程无法访问公共的同步对象 测试 package com.cky.bean; /** * Created by edison on 2017/ ...
- mui框架如何实现页面间传值
mui框架如何实现页面间传值 我的传值 listDetail = '<li class="mui-table-view-cell mui-media>">< ...
- noip2017d1t3
其实是参考洛谷上某篇题解的思路: 先求出两个dis数组表示从1走和从n走的最短路: 转移方程:dp[v][dis1[u]-dis1[v]+w+j]+=dp[u][j]; 转移顺序要注意一下呢,肯定是先 ...
- java基础-day21
第10天 IO流 今日内容介绍 u 标准输入流 & 转换流 & 打印流 u 对象操作流 u Properties集合 第1章 标准输入流 & 转换流 & 打 ...
- Alpha冲刺 - (3/10)
Part.1 开篇 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Part.2 成员汇报 组员1(组长)柯奇豪 过去两天完成了哪些任务 ssm框架的使用并实现简单的数据处理 ...