WCF使用安全证书验证消息加密
首先安装 服务端安全证书 代码如下: // 下面第一行是安装证书,第二行是将证书列入信任
makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=localhost -sky exchange -pe
certmgr.exe -add -r LocalMachine -s My -c -n localhost -r CurrentUser -s TrustedPeople
安装客户端安全证书代友如下
makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=Client -sky exchange -pe
可以通过运行mmc 在证书列表中将额客户端证书导出和提供下载,要调用服务的各户端安装此客户端证书即可。
关于安装生成WcF代理类的工具- SvcUtil.exe 运行路径C:\Program Files\Microsoft SDKs\Windows\v7.0A\binSvcUtil.exe即可
安将后即可生成 客户端代理类,代码如下:
vs2010版生成非异步的代码如下
svcutil net.tcp://192.168.0.100:3333/ChatService /language:
C# /out:proxy.cs /config:app.config
vs2010版生成异步的代码如下
svcutil net.tcp://192.168.0.100:3333/ChatService /a /language:
C# /out:proxy.cs /config:app.config
VS2012版生成非异步的代码如下
svcutil /language:C# /out:D\Client.cs /config:D\app.config http://169.254.178.26:8181/mywcfUsername?wsdl
Vs2012生成异步的代码如下
svcutil /language:C# /out:D\Client.cs /config:D\app.config http://169.254.178.26:8181/mywcfUsername?wsdl /a
WCF程序中的服务契约代码
namespace WCFUserNameConstract
{
[ServiceContract]
public interface IWcfContract
{
[OperationContract]
bool GetOnWcfService(ref string MessageInfo);
}
}
WCf 和序中的实现
namespace WcfUserNameService
{
public class WcfUserNameService : IWcfContract
{
public bool GetOnWcfService(ref string MessageInfo)
{
MessageInfo = "调用服务成功了,这是返回来的!";
return true;
}
}
}
WCF中的寄宿配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<services>
<service name="WcfUserNameService.WcfUserNameService" behaviorConfiguration="myBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8181/mywcfUsername"/>
</baseAddresses>
</host>
<endpoint address="" binding="wsHttpBinding" contract="WCFUserNameConstract.IWcfContract" bindingConfiguration="myBinding"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="myBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="myBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceCredentials>
<!--服务端的验证方式-->
<serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
<!--客户端的验证方式-->
<clientCertificate>
<authentication certificateValidationMode="None"/>
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
WCF宿主程序代码
namespace WcfUserNameConsole
{
class Program
{
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(WcfUserNameService.WcfUserNameService)))
{
host.Opened += delegate
{
Console.WriteLine("服务已启动,按任意键继续……");
};
host.Open();
Console.Read();
host.Close();
}
}
}
}
WCf客户端配置(说明:下面的encodedValue中的值,最好通过上面的SvcUtil.exe 工具先生成客户端代理类和app.config,从生成app.config考出)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8181/mywcfUsername" binding="wsHttpBinding" contract="WCFUserNameConstract.IWcfContract"
behaviorConfiguration="myBehavior" bindingConfiguration="myBind" name="myEnd">
<identity>
<certificate encodedValue="AwAAAAEAAAAUAAAArqroV9p5vtgt1lik21z43G4bfgwgAAAAAQAAADkCAAAwggI1MIIB46ADAgECAhCsu6/GZUD3kUAQ86yeDBvTMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMTQxMDE4MTc0MDM4WhcNMzkxMjMxMjM1OTU5WjAUMRIwEAYDVQQDEwlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqQOFOXTVPbAjRHN+UpYJ76pYq+ZhJHwUl+WL2TBn0l0DqHxZw2MCV/89YnbMycelLk6V2O1xi5aVORDr+wetGacZ7xNBkZtKWJDIlFBCbsc3MohOtXKmODaqp/uj8aWZ3z2+rMMxx2CYOweEMTeZrZfX5wGGkb/OLdfKlJAInH5zgQfz0dy4RB+hZXgKVIoJHS9tkIlaZd1JzUCJu8wr9I6Xjd920UrKyYoqvV6eEkwvSNPUCmSzHHKx5irMmZc1V2MoDWgUMSyF1BgCKspviwjfi3s5uuJMg4JhDtvzL6Vt2hksIT156sfiiB6U9/YaMsJwJhEpwVg4neu2yWhwFAgMBAAGjSzBJMEcGA1UdAQRAMD6AEBLkCS0GHR1PAI1hIdwWZGOhGDAWMRQwEgYDVQQDEwtSb290IEFnZW5jeYIQBjdsAKoAZIoRz7jUqlw19DAJBgUrDgMCHQUAA0EAG23sBymsfSbOINVpTJj9fJNJFcGaclzlIT3B3H2WZj+nWmjx6zwB6ofZPFDQDHVaXLaL9J1dsw56aXJzN6YJhw==" />
</identity>
</endpoint>
</client>
<bindings>
<wsHttpBinding>
<binding name="myBind">
<readerQuotas maxDepth="" maxStringContentLength="" maxArrayLength=""
maxBytesPerRead="" maxNameTableCharCount="" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Certificate" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="myBehavior">
<clientCredentials>
<clientCertificate findValue="Client" storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName"/>
<serviceCertificate>
<authentication certificateValidationMode="None"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
WCf客户端调用
namespace MyClient
{
class Program
{
static void Main(string[] args)
{
ChannelFactory<WCFUserNameConstract.IWcfContract> factory = new ChannelFactory<WCFUserNameConstract.IWcfContract>("myEnd");
//UserNamePasswordClientCredential Uinfo = factory.Credentials.UserName;
//Uinfo.UserName = "张三";
//Uinfo.Password = "123456";
string MessageInfo = "服务出错了!";
IWcfContract wcf = factory.CreateChannel();
using (wcf as IDisposable)
{
bool bls = wcf.GetOnWcfService(ref MessageInfo);
Console.WriteLine("调用服务" + bls.ToString() + MessageInfo);
Console.Read();
}
}
}
}
关于WCF使用安全证书消息加密方式验证及传输的好处:
如果不加密,基本没安全可言,略有点编程常识的人都能获取的到你传输的信息,很容易破译。使用WCF证书验证,双方都传递都使用了消息加密,不易破译,另外证书验证,加强了服客两
端的安全验证,没有证书就调用不了,使程序建立在一个安全性较高的通信线路上通信。
WCF使用安全证书验证消息加密的更多相关文章
- WCF必须使用证书验证吗
你说的 ASP.NET Web Service在消息头里加个字段,服务端做验证,这个是可以的,但是无法保证传输的用户名和密码是加密安全的. 要求使用证书,也是强制服务器端,这里涉及到服务器身份鉴别的问 ...
- https页面证书验证、加密过程简介
1.服务器向CA机构获取证书(假设这个证书伪造不了),当浏览器首次请求服务器的时候,服务器返回证书给浏览器.(证书包含:公钥+申请者与颁发者的相关信息+签名) 2.浏览器得到证书后,开始验证证书的相关 ...
- WCF X.509证书双向认证小结
最近在学习WCF X.509证书验证,想实现使用证书实现服务端和客户端的双向认证,实现原理是利用了数字证书包含的一对非对称密钥来实现数字签名及加密.所谓非对称密钥是采用两个密钥将加密和解密能力分开:一 ...
- XP机器上WCF采用X509证书加密时IIS读取证书的授权
XP机器上WCF采用X509证书加密时IIS读取证书的授权 XP下的授权命令为:winhttpcertcfg -g -c LOCAL_MACHINE\My -s 证书名称 -a "ASPNE ...
- WCF 安全性 之 自定义证书验证
案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...
- 重温WCF之WCF传输安全(十三)(4)基于SSL的WCF对客户端采用证书验证(转)
转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/20/2695397.html 前一篇我们演示了基于SSL的WCF 对客户端进行用户名和密码方式的 ...
- 关于WEB Service&WCF&WebApi实现身份验证之WCF篇(1)
WCF身份验证一般常见的方式有:自定义用户名及密码验证.X509证书验证.ASP.NET成员资格(membership)验证.SOAP Header验证.Windows集成验证.WCF身份验证服务(A ...
- 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇
之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...
- 【腾讯Bugly干货分享】iOS 中 HTTPS 证书验证浅析
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ 导语 本 ...
随机推荐
- JZOJ.5307【NOIP2017模拟8.18】偷窃
Description
- Jenkins publish over ssh 上传 文件夹 配置方式
需要把编译后 目录下的 lib文件夹下的jar包都上传到服务器上 1.配置 2.完成截图 3.服务器截图 注意: 真实脚本 建议写 全路径 注意:多条命令时 添加 英文分号
- android how to deal with data when listview refresh
如何解决listview数据刷新,下拉刷新,上拉加载更多时,图片不闪烁. 在Activity的onResume()方法中将adaper和listView重新再绑定一次. listView.setAda ...
- tomcat------->简单配置
主机名:www.snowing.com 域名:snowing.com http://主机+服务器端口号/path(web应用)/xxx.html 例: http://localhost:8080/it ...
- [iOS微博项目 - 4.0] - 自定义微博cell
github: https://github.com/hellovoidworld/HVWWeibo A.自定义微博cell基本结构 1.需求 创建自定义cell的雏形 cell包含:内容.工具条 内 ...
- wordpress 忘记密码
update wp_users set user_pass=md5("123456") where user_login='帐号';
- webPage logService 日志服务 剥离
[旧的场景]1.x.a.com指向负载均衡服务器ipL;2.代码所在的应用服务器ipA,ipB,ipC,运行nginx-phpFPM服务,提供2个服务: 2.1.应用服务器ipA,ipB,ipC中we ...
- c++ socket相关
http://blog.sina.com.cn/s/blog_43ad62c70100gtow.html,一个简单的C语言的socket服务器和客户端程序 http://www.cnblogs.com ...
- Django 框架之 Models
1. 数据库配置 Django默认支持sqlite, mysql, oracle, postgresql 数据库: Django默认使用sqlite数据库,引擎名称:django.db.backend ...
- kafka-stream数据清洗
1.数据清洗业务类LogProcessor package com.css.kafka.kafka_stream; import org.apache.kafka.streams.processor. ...