WCF分布式开发常见错误(22):The caller was not authenticated...如何在XP系统为WCF设置可信任的证书

简介:
rity 绑定协议:.WSHTTPBinding。我会把如何在XP环境下设置可信证书的过程,详细的描述出来。因为这个错误就是和证书有直接关系,对于很多XP环境下进行WCF编程的学习者来说,应该有不错的参考价值。错误信息:The caller was not authenticated by the service。服务验证调用者失败。XP系统配置证书还似乎比较麻烦,你像Windows服务器系列,我们可以建立CA来控制证书的状态。虽然我们可以自己安装。但是过于麻烦。正如申请一个免费的证书一样。仅仅为了个人学习,一切都希望简单,快速地学习WCF的安全编程。我这里也是使用了 makecert制作的证书。
   设置了服务器证书,消息安全模式。  我搜索的资料。如下:
  • QuestionThe caller was not authenticated by the service - WCF Security using ...
  • QuestionThe caller was not authenticated by the service
  • AnsweredCaller was not authenticated by the service
  • AnsweredWCF - The caller was not authenticated by the service
  • AnsweredWCF - TCP+Cert "The caller was not authenticated by the service." 但是没什么帮助,类似的问题很多都是没有解决。问题我也放到WCF中文和英文论坛:
    http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/cd3f0247-a1b4-43c0-af1c-7b0e609b1e3b
    http://social.microsoft.com/Forums/zh-CN/wcf/thread/3a5417c6-fdd1-47d7-9757-ebc8ede7affb
    【1】问题描述:      错误信息的截图:
         一样采用UserNamePasswordValidator验证方式。wsHttpBinding,此绑定支持WS安全规范。必须启动服务端证书。 WCF分布式开发常见错误(21):unable to open its IChannelListener.分发器未能打开侦听器 ,已经遇到过一次了问题。当时导致错误的原因是没有启用服务端证书。 这个错误修正完毕以后,再次启动服务,添加服务引用,生成了客户端代理等相关文件。  服务行为的证书配置信息如下:
           < serviceBehaviors >
            
    < behavior name = " WCFService.WCFServiceBehavior " >
              
    < serviceMetadata httpGetEnabled = " true "   />
              
    < serviceDebug includeExceptionDetailInFaults = " false "   />
              
    < serviceCredentials >
                
    < serviceCertificate  x509FindType = " FindBySubjectName "  findValue = " MyServer "  storeLocation = " CurrentUser " />
                
    < clientCertificate  >
                  
    < authentication certificateValidationMode = " None "   />
                
    </ clientCertificate >
                
    < userNameAuthentication userNamePasswordValidationMode = " Custom "     customUserNamePasswordValidatorType = " WCFService.MyUserNamePasswordValidator,WCFService "   />
              
    </ serviceCredentials >
            
    </ behavior >
          
    </ serviceBehaviors >
      这句话就是服务端查询证书的依据:<serviceCertificate  x509FindType="FindBySubjectName" findValue="MyServer" storeLocation="CurrentUser"/>。在CurrentUser位置,查找主题为MyServer的证书。
     使用x509证书是符合WS安全规范。证书是非对称加密算法的典型应用。至于如何获得非对称加密、证书,我在之前的系列文章里已经详细讲过,需要的话可以再参考: WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理
    【2】问题分析:
           从异常信息来看:The caller was not authenticated by the service。服务验证调用者失败。在看看验证的代码:
    if  (userName  !=   " FrankXuLei "   ||  password  !=   " 12345678 " )
                {
                    Console.WriteLine(
    " UserNamePasswordValidatation is sucessfully !:{0} " , userName);
                    
    // throw new SecurityTokenException("Unknown Username or Password"); 
                }
                
    else
                {
                    Console.WriteLine(
    " UserNamePasswordValidatation is failed !:{0} " , userName);
                }
       猜测一下可能的原因:
    (1)UserName 错误,这里用户名不等于FrankXuLei,也会导致验证失败。
    (2)Password错误,这里密码不等于12345678,同样也会导致验证失败。
    (3)加密和解密出现了问题,这个是可能的原因,虽然我们使用了证书,难说不会出现错误。比如使用了错误的服务端公钥加密。
    (4)其它原因,这个原因很难想到,居然是证书未受信任导致的。 这个原因比较诡异。我也是几乎崩溃的时候才想到的。查询了很多资料,基本都对不上,国内的技术文章基本都是直接贴代码,然后是一对分析,至于能不能执行就另外来说了。我相信很多自学WCF编程的朋友,也会遇到这个问题。    
    【3】解决办法:
          你然找到的问题的原因,就想办法来解决。下面的步骤就是如何使的自己制作的服务器证书编程可信任。
    (1)制作证书:这里直接使用 makecert 工具。Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 命令提示行里输入:
    makecert -r -pe -n  " CN=FrankWCFServer "  -ss My - sky exchan ge
        具体大家可以看文章WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理,详细的介绍。具体的参数说明:详细帮助文档:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp
    (2)导出证书:
          这里要借助IE浏览器,此例以IE7为准,其它版本功能类似,可能界面有差异。具体步骤:
          打开浏览器---->Internet 选项----->内容----->证书----->个人,你会看到刚才制作的证书。如图:
      选择导出,保存为一个证书
       这里是不包含私钥的二进制X.509证书文件。
    (3)导入证书:
        使用向导,在受信任的根证书机构里导入证书:
    (4)测试证书:
     此时刚才创建的FrankWCFServer证书,就可以使用了,我们启动WCF服务宿主,运行客户端,设置用户名和密码以后,调用方法成功!解决了上诉问题。
    【4】总结:
        WCF安全编程相对来多复杂了很多。WCF提升了安全级别。在 WCF分布式开发常见错误(21):unable to open its IChannelListener.分发器未能打开侦听器最后和Robin Zhang 还有  不若相忘于江湖 讨论过这个问题。
        我之前也有关于这个问题的疑惑。因为之前Web Service 和 WSE3.0 里都可以使用用户名和密码方式来实现身份验证。Web Service可以直接在Soap 消息头部加入UserName 和Password信息。WSE3.0对此进行了扩展,加入了安全验证机制,要求客户端在服务调用以前,必须设置用户令牌信息,服务获取请求以后,先进行消息的还原和验证。WCF里的UserNamePasswordValidator验证方式应该就是对扩展。不过他是重写了UsernameTokenManager的AuthenticateToken方法。但是机制应该类似。大家有兴趣可以看看 WSE3.0构建Web服务安全(1):WSE3.0安全机制与实例开发 。
       希望这个文章对希望简化Xp下WCF安全编程的朋友一些帮助。正在整理WCF安全的文章。代码也已经调试完毕。
    参考文章:
    1. WSE3.0构建Web服务安全(2):非对称加密、公钥、密钥、证书、签名的区别和联系以及X.509 证书的获得和管理
    2. http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe.asp


  •  本文转自 frankxulei 51CTO博客,原文链接:http://blog.51cto.com/frankxulei/320446,如需转载请自行联系原作者


  • 相关文章
    |
    8月前
    |
    Kubernetes 大数据 调度
    Airflow vs Argo Workflows:分布式任务调度系统的“华山论剑”
    本文对比了Apache Airflow与Argo Workflows两大分布式任务调度系统。两者均支持复杂的DAG任务编排、社区支持及任务调度功能,且具备优秀的用户界面。Airflow以Python为核心语言,适合数据科学家使用,拥有丰富的Operator库和云服务集成能力;而Argo Workflows基于Kubernetes设计,支持YAML和Python双语定义工作流,具备轻量化、高性能并发调度的优势,并通过Kubernetes的RBAC机制实现多用户隔离。在大数据和AI场景中,Airflow擅长结合云厂商服务,Argo则更适配Kubernetes生态下的深度集成。
    1065 34
    |
    9月前
    |
    人工智能 安全 Java
    智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
    智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
    344 5
    |
    4月前
    |
    存储 算法 安全
    “卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
    本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
    278 2
    |
    4月前
    |
    机器学习/深度学习 算法 安全
    新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
    新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
    177 3
    |
    6月前
    |
    数据采集 缓存 NoSQL
    分布式新闻数据采集系统的同步效率优化实战
    本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
    276 1
    分布式新闻数据采集系统的同步效率优化实战
    |
    8月前
    |
    安全 JavaScript 前端开发
    HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
    HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
    836 35
    |
    数据管理 API 调度
    鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
    HarmonyOS Next 是华为新一代操作系统,专注于分布式技术的深度应用与生态融合。本文通过技术特点、应用场景及实战案例,全面解析其核心技术架构与开发流程。重点介绍分布式软总线2.0、数据管理、任务调度等升级特性,并提供基于 ArkTS 的原生开发支持。通过开发跨设备协同音乐播放应用,展示分布式能力的实际应用,涵盖项目配置、主界面设计、分布式服务实现及部署调试步骤。此外,深入分析分布式数据同步原理、任务调度优化及常见问题解决方案,帮助开发者掌握 HarmonyOS Next 的核心技术和实战技巧。
    1552 76
    鸿蒙HarmonyOS应用开发 | 探索 HarmonyOS Next-从开发到实战掌握 HarmonyOS Next 的分布式能力
    |
    8月前
    |
    消息中间件 缓存 算法
    分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
    分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
    570 0
    分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
    |
    存储 运维 安全
    盘古分布式存储系统的稳定性实践
    本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。
    1016 7
    |
    存储 分布式计算 Hadoop
    基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
    本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
    413 7