精华内容
下载资源
问答
  • 售后服务协议书精选.doc
  • 冰箱售后服务协议书.doc
  • 带提供财务软件售后服务协议书模板,通过这份合同能够保障自己的合法权益,保证自己的利益不受...该文档为财务软件售后服务协议书,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 财务软件售后服务协议书格式 甲方:____________________ 乙方:____________________ 通过甲乙双方友好协商,达成如下协议: 一、甲方已使用乙方“______财务软件”超过一年,根据原销售合同所定款项,一年的...
  • 项目合作协议书

    2014-02-17 16:17:05
    项目合作协议书 项目协议书由:项目出资人(以下简称甲方)和项目技术负责人(以下简称乙方)  合伙人:甲:(姓名),身份证号:_____籍贯:_____  合伙人:乙:(姓名),身份证号:_____籍贯:_____  甲...

    项目合作协议书

    项目协议书由:项目出资人(以下简称甲方)和项目技术负责人(以下简称乙方)
      合伙人:甲:(姓名),身份证号:_____籍贯:_____
      合伙人:乙:(姓名),身份证号:_____籍贯:_____
      甲乙双方本着公平、平等、互利的原则订立合伙协议如下:
    第一条 甲乙双方自愿合伙经营(项目名称),总投资为×万元,甲出资×万元,乙出资×万元及技术和客源支持,各占投资总额的×%、×%。
    第二条 本合伙依法组成合伙企业,由甲负责办理工商登记。在合作期间合作人出资的为共有财产,不得随意分割。合作终止后,各合作人的出资仍为个人所有,届时予以返还。
    第三条 本合伙企业经营期限为三年。如果需要延长期限的,在期满前六个月办理有关手续。
    第四条 合伙双方共同经营、共同劳动,共担风险,共负盈亏。
    第五条 企业盈余按照各自的投资比例分配。
    第六条 企业债务按照各自投资比例负担。任何一方对外偿还债务后,另一方应当按比例在十日内向对方清偿自己负担的部分。
    第七条 他人可以入伙,但须经甲乙双方同意,并办理增加出资额的手续和订立补充协议。补充协议与本协议具有同等效力。
    第八条 每年项目产品总销售利润的本分之十进行固定投入。销售利润分红,一年一次。
    第九条 本协议一式贰份,合伙人各一份。本协议自合伙人签字(或盖章)之日起生效。
    第十条 自协议签订之日起,乙方需要负责技术和市场开发及售后跟进,甲方负责管理和日常事务。
    第十一条 本协议有效期暂定三年,自双方签字之日起计算,即从_____年_____月_____日至_____年_____月_____日止。
    第十二条 争议处理
    1、    对于执行本合同发生的 与本合同有关的争议应本着友好协商的原则解决。
    2、    如果双方通过协商不能达成一致,则提交仲裁委员会进行仲裁,或依法向人民法院起诉。
    第十三条 本协议到期后,双方未提出终止协议要求的,视为同意继续合作,本协议继续有效,如果不再继续合作的,退出方应提前三个月向另一方提交退出的书面文本,并将乙方的有关本合同项目的资料及客户资源都应交给另一方。
    第十四条 违约处理
    如果一方违反本合同的任何条款,非违约方有权终止本合同的执行,并依法要求违约方赔偿损害。
    第十五条 出现下列事项,合伙终止:
      (一)一方合伙人有违反本协议的,另一方有权解除合作协议;
      (二)合伙期满;
      (三)合伙双方协商同意;
      (四)其他法律规定的情况
    第十六条 本协议未尽事宜,双方可以补充规定,补充协议与本协议有同等效力。
    第十七条 本协议一式贰份,双方各执一份,具有相同的法律效力。
    甲方:×××(签字)         乙方:×××(签字)
    地址:                     地址:               
    合同签订地点:_____
    合同签订时间:____年____月____日

    转载地址:http://www.5ykj.com/Article/cygwflfb/92399.htm

    展开全文
  • 服务器售后服务承诺 为做好民航西南地区管理局搬迁办公区工程网络系统服 务器及存储设备项目验收 系统集成 系统调试和系统试运行工作我公司须按本售后服务承诺规定的各项条款对本项目提供相关的技术支持及服务 ...
  • {售后服务}电信客户服务电子商务网站商务计划 赣州电信 客户服务电子商务网站 商务计划 舒君亮 目录 \ " \ \ \ 前言 自年欧盟发布了欧洲电子商务协议美国随后发布全球电子商务纲要以后电子商务受到世界各国政府...
  • 如何做好售后服务

    万次阅读 2012-12-03 23:33:15
    第一章 如何做好售后服务   ...售后服务工作的意义和注意事项 ...售后服务是产品被销售后由厂商、销售商或服务商为客户所提供的有偿或无偿的培训、产品调试、问题咨询、客户回访、产品维护和升级等服务,

    第一章 如何做好售后服务

     

    第一讲 售后服务工作的意义和注意事项

    众所周知,这个一个服务取胜的时代,然而目前国内售后服务的现状却令人堪忧,因售后工作不到位导致产品滞销乃至品牌“破产”的事例屡见不鲜。如果搞好售后服务工作,成为困扰众多企业的一大难题。

    售后服务是产品被销售后由厂商、销售商或服务商为客户所提供的有偿或无偿的培训、产品调试、问题咨询、客户回访、产品维护和升级等服务,其服务质量评价标准是客户满意度。

    一、   案例

    如何做好售后服务?我认为海尔的售后服务值得我公司学习的。有些超市的售后服务很差,根本是货不对板。为何这么说呢?

    这是我一个朋友买空调所遇到的一件事:

    上个月他到家乐福超市购买空调。当时他本来想买格力牌空调的,当他找到销售员说明他的想法时,销售员就建议他购买另一个品牌的空调。就是志高空调,销售员告知此款空调无论是功能还是省电等方面均比格力要好,且价格便宜10%,他就购买了志高空调,但是却因此给自己找了麻烦事。当时此家超市承诺第二天可以安装,可是却没有人到他家安装,因为他打了两个电话去询问何时可以安装?在他的三请四催下,安装人员终于在第四天到他家安装,可是空调一安装好,试机却是坏的。确认是线路板坏了。因为他决定退货。这个退货的过程非常之麻烦,一下子说没人,一下说没车,一下说要求他自己将空调送到超市来退货。这不是在坑人呢?购买空调是标明是免费送货上门包安装。到了你要退货,就左推右摚的。他先后打了十个电话,找超市的负责人处理此事,却是一个推一个,令人非常之恼火和生气,为了此事,他前后跑了家乐福超市四五次。浪费了时间及金钱,虽然到最后超市是退了钱,但是却只有一句抱歉给他。这事令我在反省我公司对待顾客方针是否需要改变。

    对于家乐福来说,也许他只是一次性购买的顾客,不需要在意。所以只有推销出产品就可以,不需要售后服务的。反正你也不会再来第二次的。我们公司的顾客有一部分也是一次性顾客,那么我们要如何对待他们呢?我要求公司的销售人员对一次性或是长期顾客均需一视同仁,竭尽全力为顾客服务,并做了售后服务。要知道,现在的科技太先进了,经过十几年的磨合,现在许多的工厂的质量标准都是相同的。现在的企业要求的是服务。谁的服务做得好,谁的生意才能做大。

          我们要牢记“信誊”这两个字,就是你向客人承诺了这样的服务,你就必须做到。不能因为他是你的一次性顾客就不理不睬,虽知道你的一次性顾客可能会是你的潜在顾客,可能会成为你的长期顾客或是他会介绍更多的顾客给你。记住,让客人满意是我们公司的承诺。我们会坚守此承诺为客人竭诚服务。

     

    二、   明确售后服务的重要意义

    1、            售后服务是一次营销的最后过程,也是再营销的开始,它是一个长期的过程。大家要树立这样一个观念,一个产品售出以后,如果所承诺的服务没有完成,那么可以说这次销售没有完成。一旦售后服务很好的被完成,也就意味着下一次营销的开始,正所谓:“良好的开端的等于成功的一半”。

    2、          售后服务过程中能够进一步了解客户和竞争对手更多的信息。其实,售后服务人员更像一个深入客户那里的考察者,售后人员一定要珍惜这个机会,以便能通过一次服务为公司带回更多的信息。你要清楚你能够垂手而得的信息可能就是销售人员急需而无法得到的。

    3、          售后服务能与客户进一步增进感情、为下一步合作打下基础。一个好的售后服务人员,总能够给客户留下一个好的印象,能够与不同类型的客户建立良好的关系,甚至成为朋友,实际上,你已经为下一次的合作增加了成功系数。当然这需要有扎实的技术功底、良好的职业道德和服务技巧。

    4、          售后服务能为产品增值。我们知道产品销售出去以后,一般都有保修期,保修期过了之后一般是需要收取服务费的,假设产品可以有多家服务商来竞争,客户就不一定选择谁来做。如何保住和得到这一部分增值利润,很大程度上取决于公司整体的售后服务质量。

    5、          售后服务是一种广告,是为公司赢得信誉的关键环节。我经常听说,这家产品尽管贵些但服务不错,那家便宜但服务没保障。市场的规律已经证明,企业的信誉积累很大程度上来源于售后服务。

    6、          售后服务的过程也是服务人员积累经验、提高技巧、增长才干的过程。在公司里也许你永远也看不到如此多的高档设备,在客户那里,你能学到你的产品如何与这些高档设备协同工作,而且有机会学到这些设备的使用方法。

     

    三、掌握售后服务的技巧

    1、抓住主要服务对象。做销售的时候我们经常说搞定某个人,就是拍板的人。做售后服务的时候也是一样,即使你的服务被客户方所有技术人员都认可了,客户负责人一个不字就可以否定你的一切,所以在你做完服务后一定要得到客户负责人的认可后方可离开。

    2、不要轻视客户那里的每个人。客户那里的每个人都很重要,如果你只顾及了负责人的感觉,对别人提的要求置之不理,就大错而特错了。当别人提的要求与责任人有冲突时,你要不厌其烦的给与合理的解释,以期得到别人的理解。你要明白,他们中的某个人到明年也许就是负责人。

    3、抓住主要解决的问题。在做服务之前,要写出服务计划,要明确你主要解决的问题是什么,因为,你不可能一直呆在客户那里,有时间在约束着你。你一定要先把主要的问题解决掉。以免犯本末倒置的错误。这也是技术人员最容易犯的错误。譬如:你要到客户那里调试一台交换机,而客户个人的PC出了点问题想请你帮助解决。你千万不能受着这种影响,你可能在PC上化费很多时间,还可能会引起客户那里其他人对你的意见。

    4、不要讲太绝对的话。世上没有绝对的事情,你不要轻易说“绝对没问题”或“绝对应该这样做”;你可保持沉默,如果必须要说的话,你可以说:“一般是没有问题的”,“可以做”,“有问题的话,我们会及时给您提供服务”,“正常来讲应该是这样的”之类的话。

    5、举止、谈吐、衣着、大方得体,表现出公司的文化底蕴。“一滴水可以折射出一个太阳”你出差到客户那,你的一言一行都代表在公司的形象,千万不可太随便,你的一句话一个动作都可以丢掉一个客户,养成良好的职业习惯,毛手毛脚、不修边幅、无谓争吵等都是售后服务人员应该注意的。

    6、你不代表公司最高水平、让客户感觉到你有强大的技术后盾作支撑。做技术的人容易犯的错误就是总认为自己的技术是最好的,甚至有人会在客户那里贬低同事,这是大忌。一个人的技术水平无论多高都是有限的,一旦在服务的过程中出现难题,解决不了,打电话向公司其他人求救,尽管你明知道其他人也解决不了问题,你要让客户感觉到公司还有人支持你,这样如果客户对你不认可,也不会对公司的信誉造成太大的影响。

    7、两个人一起做服务、要分清主次。

    8、打有准备之仗,做好最坏打算。做售后服务不要抱侥幸心理,也许一根网线、一本说明书就要让你来回奔波几千里。新的设备、所带的工具一定要检查,没有把握的技术一定要先在服务之前作试验。譬如:若带的软盘会不会坏掉,能给你提供支持和帮助的人的联系方式是否有,万一需拖延几天,带的路费够不够等。

    9、见好就收。并不是说设备不明不白调试好了,就赶快收场,而说如果你需要做的工作做完了,就不要再做什么添枝加叶的事情,结果会造成迟迟不能交工。

    10、不要与客户大谈竞争对手的不是。贬低别人是为了抬高自己,但事情往往事与愿违,贬低别人正因为你害怕别人,不妨大度一点,也给别人一点肯定,有助于给自己树立好的形象。

    11、与客户主要负责人及技术人员建立一条联系通道。做完服务以后一定记下客户相关人员的联系方式(电话、传真、Email、私人电话、地址),这对公司都是很有价值的信息。

    12、打好扎实的专业基础,这是一条不是技巧的技巧,巧妇难为无米之炊,大家都应该明白这个道理。

    13、公司内部矛盾和问题不要反映到客户哪里去。

    经常出现这样的情况,两个技术人员有个人矛盾,刚好被派在一起为客户提供售后服务,到了客户那里两人不是互相配合,而是互相较劲,谁也不听谁的。还有就是把公司的问题带到客户那里,譬如:出差补贴少、公司经营问题、公司决策层矛盾,老板的缺点等。

     

    四、   做好售后服务其他注意事项

    1、        把握时间

    为了提高服务效率,一定要把握好时间,譬如:快下班了,你还差一点没做完,客户又不愿意加班,你不得不等一个漫长的夜晚,第二天再奔波一趟。尤其是到了周末,更是麻烦了。

    2、        干脆利索,去繁就简

    没有谁喜欢啰里啰唆的人,做售后服务也是一样,如果你总有提不完的条件,甚至吹毛求疵,或者丢三落四,犹犹豫豫。这样不但影响效率,还会给客户留下很坏的印象。

    3、        少说多做 巧妙回避

    言多必失的道理大家都应该明白,你如果在做服务的过程中滔滔不绝(当然培训除外)你还有时间工作吗?会让人感觉你不踏实,如若遇到敏感问题(如价格)更要想办法回避,可以把这个问题推给销售人员,千万要管住自己的嘴巴,尤其在客户请你吃饭的时候。

    4、        做到写到 学会总结

    要养成写工作日记的习惯,并且要记一些细节,他会为你以后的服务带来很多方便,同时,要学会总结,总结才有提高。这些日记对公司和你个人都是财富

    5、                 整理环境,全面测试,不留隐患

    也许你也碰到过这样的情况,刚买完票上车,电话又打来了,也许是一个小问题,你不得不再跑回去一趟,所以做完工程一定要全面的测试,能否全面取决于你的经验和服务标准,不要留下模棱两可的事情,很多偶然的故障都有必然的原因,不要心存侥幸心理,任何问题都要找出问题的原因,否则,就应视为问题没有解决。

    6、        敬业守信、说到做到

    这一点很重要,我想大家应该明白敬业和守信是何等重要。

     

    第二讲 售后服务工作的原则和技巧

    一、售后服务的原则

    1、礼尚往来的原则

    人们的潜意识中,最有威力、影响力的就是一种礼尚往来原则。比如当我们到水果摊买水果时,我们看到很好吃的橘子或苹果,这时卖水果的老板会剥一个橘子,或者是切一片苹果让你尝一尝。你因为尝了他的水果,一不小心就会买它一斤或是两斤。你到百货公司购物时有些促销员会请你尝一瓶牛奶,你会觉得很不错,你会买上一大瓶的牛奶,这就是礼尚往来原则。别人对我们所做的事情使得我们也很想替对方做点事。这种心理状况,通常称之为互惠原则,你对我好,我也要对你更好,这是一种社会与文化的规范,当别人给我们帮忙的时候,我们就希望也能够为别人做点什么来予以回报。同样,我们在和顾客达成交易的关系时,也别忘了在适当的时机,带一些有纪念性的用品,或者说有一些小东西送给顾客,顾客会觉得,你在重视他。当你需要一些信息时,我相信这个顾客也会告诉你,买了你的产品以后,用得怎么样,他也会把一些信息全都告诉给你,同时他也会把你的竞争对手的一些信息告诉给你。所以每次当你帮顾客的忙,那位顾客就会感觉到自己也应该替你做些什么似的,每当你对顾客要求做个什么让步,顾客内心就会感到对你好像有种亏欠,增进你俩的关系,就有了做成下一次生意的可能。这叫做礼尚往来原则。
        2
    .承诺与惯性原则

    在心理学上,影响人们动机与说服力的一个最重要的因素叫做承诺惯性原则。它是指人们对过去做过的事情有一种强烈连贯性的需求,希望维持一切旧有的形式,使用承诺来扩充观念。顾客有一种什么样的习惯,或者说他有什么样的旧的做法,做事的方法或处理事物的一些态度,你要掌握这种惯性的原则。这个承诺惯性的原则就是我们怎么样更进一步地与我们的顾客相处,以及找到顾客内心里一种需要层次的提升。
        3
    .社会认同原则

    威力无穷的潜意识影响称之为社会认同原则。购买某个产品和服务的人数深深地影响着客户的购买决策。如果你与顾客关系处理得很好,这时公司又开发了一个新的产品,当你到顾客那里时,也可以用这种方法告诉顾客,你看我们的产品还没有上市就已经有很多顾客向我们订了单子,你看这是某某报纸对我们这个商品的报道,社会对我们的评价都不错……”当他看到这样的一个东西或者一个信息时,他会觉得,嗯,不错,人家都买了,我也应该买,这叫做社会认同原则。也就是购买某产品或者服务的人数深深地影响客户的购买决策。

    4.同类认同

    假如你今天的顾客是个医生,都在使用这个产品,或接受这样的服务,那你给护士推销,护士也可以接受。假如律师都用这种产品,那你向其他的律师再推销这种产品时,其他律师也会接受,这就叫社会认同。

    5.使用者的证言

    这也是促使顾客购买产品的一种因素,利用曾经买过我们的产品的人,或使用我们产品的人,用他们的一些见证,告诉我们的顾客,这也是影响顾客购买决定的一种方法。当然你必须要取得一份现有顾客的名单,他们用了我们的产品以后,看看他们的一些感觉。

    6.喜爱原则

    比如一种化妆品,某某明星在用,所以我也想去用它,因为我喜欢那个明星;那个明星穿什么样的衣服,我也想买什么样的衣服,目前很多促销广告,都找一些名人,也就是在运用这种喜爱原则,去激发顾客采取购买行动。

    7.友谊原则

    客户介绍的潜在客户比全新的顾客更为有利,因为它的成功几率是全新顾客的15倍,一个拔尖的销售人员,他永远知道在培养他的老顾客,同时他也不断地开发他的新顾客,而新顾客的开发来源,最好的方法就是由老顾客介绍。而这种老顾客的介绍,就是人们在运用友谊的原则。

    今天的售后服务并不是顾客已经买了你的东西,你去给他做服务,而是在建立一种和谐的人际关系。顾客还没有买你的东西之前,你可以用这些原则,是在促进顾客更相信你的产品,更相信你。而买过产品的人,你也要让他更进一步地跟你维持一种更信赖的关系。

    二、恰当时机的感谢函

    1.初次访问的顾客反应不错时

    我们要在适当的时期致以感谢函,一个顾客无论有没有做购买的决定,有没有买你的东西都不重要,重要的是要在访问的时候顾客反映不错,这就需要你在拜访过后马上要发感谢函给他,现在的感谢函的方法都很简便,电子邮件几分钟就过去了,可以省下你很多的时间。

    2.签订契约的时候

    当你与顾客见面或顾客买了东西以后,你一定要心存感恩的心态,感谢顾客。客户的第一印象来自于销售人员。你的服装仪容是不是很好,甚至于当你和顾客寒喧的时候,你是否谦恭有礼,是否让人感觉到你很专业,都会影响印象分。所以要记住,你今天在做销售:首先在推销你自己;在销售商品的效用,也就是在替顾客解决问题。

    销售商品的效用或价值时,下一个阶段是销售商品、销售你的服务,所以你在写感谢函的时候,一定要把这种心存感恩的心境告诉你的顾客,因为每个人都有一种感觉,当你写了一封信给他,或者说是寄一张贺卡给他时,他通常是不太容易把它忘掉的,这样可以加深顾客对你的一种信任。

    3.承蒙顾客帮忙时

    还有一种需要写感谢函的情形是承蒙顾客帮忙时,去拜访顾客,不管他是否买过你的产品,但是他会在礼尚往来的触动之下,虽然他没有买你的东西,就是因为你一点小小的礼物送给他,他会觉得心里有点内疚,所以他一定会帮你的忙,虽然说他买过了,或者说并没有买你的公司的产品,但是他也会帮你忙,你还是不要忘记,永远心存感恩,致以感谢函。

    4.从旅游地向平日惠顾的顾客致谢

    你可以告诉你的顾客,什么地方休闲不错,可以提供给顾客;什么地方有一场足球赛,你有票,会在什么时候叫快递给他送过去……这样顾客就觉得,有这么一个人,时时在关心着他,他一定很感动。同时,你也会收到很多回馈、很多关心。你去玩的时候,你别忘了带回一些小纪念品送给你的顾客,这样可以增加你和顾客之间一种信赖的关系。

     

    三、   视察销售后的状况

    对于购买你的商品的客户,你要经常做回访,直到顾客使用熟练为止。在还没有熟练之前,顾客总会遇到许多问题,特别是那些机械一类的东西,使用一段时间之后需要更换零部件,所以你要做经常性的售后访问。对于消费型产品,有必要调查顾客的使用情况,这些都是比较重要的问题。

     

    四、提供最新的情报

    为顾客提供经营情报,介绍公司的新产品、新服务项目,都需要在做售后服务时去做,这等于不断地与客户建立良好的关系。要善于运用礼尚往来、承诺友谊等种原则,在为顾客提供公司新产品、新服务的经营情报的同时,还可以从顾客那里以得到很多有关其它公司的情报。

    【自检】
    请回答下列问题:

    你的售后服务工作都包括哪些内容?你今后准备如何改进?

    _____________________________________________
    _____________________________________________
    _____________________________________________
    _____________________________________________
    _____________________________________________
    _____________________________________________

    五、将顾客组织化

    人际关系的好坏会直接影响到我们的销售,如果今天我们没有把顾客的关系处理得很好的话,我们将会失掉很多生意。上一讲讲过,通过顾客介绍的客户的成交率是普通顾客的15倍,所以如何将顾客组织化将成为一个重要的问题。
        1
    .建立影响力中心

    每个顾客都有很多的朋友,我们都希望顾客介绍给我们更多他周边的一些人,有时候相处很好的顾客会把他的一些亲戚和朋友也介绍过来购买产品,这样就建立了影响力中心。
        2
    .举办研讨会

    选择一个适当的时机,将使用过你的产品的顾客请来参加研讨会,请他们为公司提合理化建议,同时也可以让这些顾客去认识更多的人,这是一项利人利己的工作。举办研讨会最主要的目的,就是让这些顾客相互认识,同时也是你对顾客真诚的一种展现。
        

    六、诚恳的作为商讨对象

    1.     从头到尾

    对顾客所说的话要从头到尾耐心地听。一般人如果听到对方重复话题,不免都想阻止对方,于是就说我知道了,不想让对方再说下去。但是请你一定把这些反复的话当作重要的环节来耐心地听完。
        2
    .听出真意

    在与顾客谈话的过程中或者是了解、商讨对策的过程中,你要注意地去听,听出顾客真正的用意在哪里,看他们有什么不满或者抱怨的情形。如果你遇到的顾客表达可能不是特别好,或他讲话方面可能有一些结巴,但是你一定要有耐心,让顾客把他的问题说出来,听出真意。出说不便或不敢说的话才是重要的。
        3
    .让顾客想出对策

    如果商品问题实在没有办法解决,也可以让顾客帮你想出对策。当你用心去为顾客服务,用心地关心顾客,顾客会谢谢你,还会做出更大、更好的回馈,为你想出最好的解决烦恼的对策来。

     

    七、处理不满的要诀
    要耐心倾听

    不要辩解,只需认错

    了解顾客不满的原因

        1
    .要耐心倾听

    顾客购买你的东西,总是有不满意的时候,所以常常会打电话到公司告诉我们他对这个事情不满。无论是打电话还是当面跟你说,永远记住,不要争辩,要耐心地倾听,尽量地学会多听别人的,然后在适当时机才表达你的观点。
        2
    .不要辩解,只需认错

    千万不要和你的顾客发脾气,要学会控制情绪,做一个高EQ的销售人员。顾客可能很生气,但是你一定要耐心地接受,不要做过分地辩解,只需要认错。我非常了解您的情形,同时我可以感受到您对我们的服务的关心,因为您希望我们好,所以您才会告诉我们。尊重顾客是一个称职的销售人员必须具备的素质,即使你知道这个顾客的误会,或者是平白无故地被这个顾客给骂了,你仍然要静静倾听顾客吐苦水,有时在你耐心地倾听之中,顾客的怒气就消了,对顾客的不满也就不知不觉解决了。许多人在顾客尚未表露不满时,就很焦急地想找借口应付他,如果你一再地辩解,顾客会情绪性地产生反感。他的不满一旦严重表现出来,就会带走更多的顾客。
        3
    .了解不满的原因

    由于商品本身的问题而引来的不满,只要直接替顾客解决了就没事了。

     

    *         表现不满型就是发牢骚的那种类型,在不满的情绪中产生情感对立,就会有这种情形发生。所以你要静下心来,倾听顾客吐苦水是最好的方法。

    *         自我表现型就是利用问题发生的机会,夸耀自己的立场是一种不满的做法。你只要让他感觉到被尊重,一切就OK

    *         撒娇依赖型这一种顾客说,哎呀,你们都是这样。就好像很希望销售人员再对他好一点。这种顾客不是不满,他只是想找机会跟你接近。

     

    八、提高自己的口才

    提高你的口才,提高感性原则很重要,要学会观察人,要学习别人的长处。你的顾客也是你的老师。要学会善于思考,思考的简单方式就是自问自答,我这样做对吗、可以满足别人、有没有要改进的地方?平时要多观察、多探听、多阅读、多交谈,锻炼自己的口才,然后把这些零碎的片断组合起来,经分析后提炼一些更有品质的内容。提高应对的能力就需要模仿那些有经验的人,看看他们是怎么做的,你同时要反复地练习,才能提高自己的口才。

     

    九、磨练自己
    请教别人,说出你自己的缺点
    努力使缺点改变成优点


    本讲总结

        售后服务本身同时也是一种促销手段,通过售后服务可以提高企业的信誉,扩大产品的市场占有率,提高推销工作的效率与效益。掌握售后服务原则,并且在适当的时机向顾客致以感谢函,可以增加你与顾客之间的一种信赖的关系,有利于销售工作的进一步开展。掌握售后服务的要点,提高自身素质,努力做好售后服务,使售后服务成为再次销售的开端。

     

    第二章 售后服务礼仪

    售后服务礼仪是帮助学员掌握基本的售后服务礼仪与服务技巧,把售后服务做到系统化,给客户留下一个好的印象。

     

    一、    什么是售后服务礼仪

    售后服务礼仪是指生产企业、经销商把产品销售给消费者之后,为消费者提供的一系列服务(包括产品介绍、送货、安装、调试、维修、技术培训、上门服务等)时,面对客户应该体现出的律己敬人的过程;可以说是售后服务从业人员代表公司的内在修养和素质的外在表现。售后服务是产品生产单位对消费者负责的一项重要措施,也是增强产品竞争能力的一个办法。

     

    二、            售后服务礼仪的内容

    1、  为消费者安装、调试产品;

    2、  根据消费者要求,进行有关使用等方面的技术指导;

    3、  保证维修零配件的供应;

    4、  负责维修服务;

    5、  对产品实行“三包”,即包修、包换、包退。现在许多人认为产品售后服务就是为“三包”,这是一种狭隘的理解;

    6、  处理消费者来信来访,解答消费者的咨询。同时用各种方式征集消费者对产品的意见,并根据情况及时改进。

     

    三、            为什么要培训售后服务

    售后服务礼仪培训案例1——

    就拿旅游业、酒店业来说——希尔顿饭店是全球著名的跨国旅游集团,希尔顿本人也被誉为美国“旅馆大王”。有人询问希尔顿的经营诀窍,希尔顿的回答是:“请你在离开我的希尔顿饭店时留下改进意见,当你再次光临我的饭店时就不再会有相同的意见——这就是我的经营诀窍”。

    那么,我们国内的企业如果注重服务营销,售后服务营销,是不是会称为“旅行社大王”、“景区大王”、“航空业大王”呢?如果掌握诀窍,我看机会还是很大。

    在德国大众汽车流传着这样一句话:对于一个家庭而言,第一辆车是销售员销售的,而第二、第三辆乃至更多的车都是售后服务人员销售的,服务的本质是销售。那么我们有没有这样的理念呢?如果掌握了售后服务的理念,那么,售后服务的规范呢?

     

    售后服务礼仪培训案例2——

    我们再来看看谭木匠的案例吧:

    谭木匠公司服务理念:顾客是亲人。为小小的木梳提供售后服务,在业内已是难得;而且提供全国免费维修,更是堪称一绝了。以下节选自谭木匠的售后服务范围和规范的部分条款:

    1、  十天内,包装未打开,产品未使用,商品整体完好无损的情况下,可以退、换。

    2、  一个月内,由于非人为损坏所出现的质量问题可予退、换。

    3、  购买时间超过一个月的商品损坏;或由于顾客自身原因导致的产品损坏的情况下,专卖店可给予免费维修。

    4、  凡谭木匠专卖店售出的产品,在可维修范围内,均实行全国免费维修。专卖店维修需1-3天,返厂维修需30天左右。

    5、  对维修需要更换零部件的产品只收取适当的成本费。

    除了以上的售后承诺、详细的维修细则、产品保养事项等也是谭木匠对用户无微不至关怀的体现。总之,谭木匠无时不在提升用户的满意度和拥有后的体验感受。

    试想一下,一把梳子,你可以当着心爱的宝物一样来拥有,不慎损坏了,你可以有弥补的机会;于是你越加珍藏。

     

    售后服务礼仪培训案例3——

    在美国新造的房子有一个选项:屋顶。美国的屋顶生产商都非常有技术含量:保修15年的屋顶一般到16-17年一定会坏,逼使你更换,因为在一个成熟的市场,新生意的来源很大程度上来自更换。有位朋友装的屋顶没到15年就坏了,时隔这么久,发票什么都没有了,于是便上屋顶看了打在上面的生产商Logo,再找生产商。

    厂家给的解决方案很简单:很抱歉,我们说能用15年,但是没做到,给用户带来不少麻烦,现在我们给您换一个新的有15年保修期的。这位“中彩”的客户等于花了一个屋顶的钱,因为这次遭遇得到了一个新的屋顶。

    这件事要是就此结束了那也没什么可多说的,只是有家愿意在满足客户方面多做一点的企业。不过这事并没有就此结束,厂家要找出为什么这个屋顶用不了15年的原因,给用户一个事实为依据的解释。在对换下的屋顶一番仔细检查后,终于有了答案:原来北方与南方的气候差别巨大,用在二地的屋顶是不同的。

    由于厂家将报废时间卡得较紧,能保证在南方用15年的,在北方的冬雪夏日中就保证不了了。而厂家发现这个用在北方房子上的屋顶居然是南方的批号?这可是15年前的一个重大疏忽!于是厂家进一步对这个社区的所有屋顶都做了复查,发现这里15年保修的屋顶批号都是南方的,也就是说:在同样气候条件下,这批屋顶都快要出问题了。厂家左后为这里的居民全部免费更换了新屋顶。

    这是厂家一次明显的失误,不过应该说处理得漂亮。比较会算的朋友也许会说:屋顶是15年一次的非频繁消费,厂家这个处理虽好,恐怕很难再在15年后赢得同一位客户了,这笔支出肯定收不回了,只是赢得了品牌声誉,却损失了一大笔利润,其实不然:首先这群客户也有亲戚朋友,这就是口碑。

     

    售后服务礼仪的关键问题——

    现在,产品的售后服务逐渐成了每一个品牌不得不关注的热点,因为它直接关系到一个产品品牌形象的确立,关系到一个企业的生产与发展。与此同时,几乎每一个品牌都发出了这样的感慨,那就是售后服务难做,客户的要求越来越细、越来越高、越来越多。

    三个方面的关键问题:

    a)       服务场景和有形展示方面,除了装修风格和人员着装之外,服务价格的公示、收费的合理性、不输于正品质量的配件品质、原厂的配件等都在传递品牌价值。

    b)      服务流程方面,顾客在售后服务最需要的是公平和便捷,特别是服务补救的时候,惠普的笔记本售后门引起的全国数百个维权群,丰田的召回门,都需要在流程上体现出来。正确的流程才有正确的结果,没有事前拟定的处理原则。设计好的预案和确保执行的制度,很难仅仅依靠现场服务人员的应变去回应顾客令其满意。

    c)       高素质的服务人员,没有顾客不喜欢热情、积极、善于倾听、愿意解决问题、有权利解决问题、经过培训知道如何解决问题的服务人员,他们可以有效的弥补有形展示和流程的不足。不幸的是没有无缘无故的爱,如果没有良好的作业环境、持续有效的培训支持、足够的激励政策,很难想象一位满腹怨言的服务人员能提供优质的服务。

     

    四、            售后服务礼仪培训背景

    企业竞争发展到现在,客户售后服务已经不是简单的、最低要求的礼貌问题,光说应酬话或光说“是”已经不够了——绝大多数企业早已可以在这一点上做的很好。对于处于激烈竞争中的现代企业来说,客户售后服务方面的竞争直接决定着企业市场运营的成败。除了优良的产品,良好的售后服务品质已经成为企业的一种核心竞争力,一个企业,售后服务品质必须作为基本素质要求加以重视。

     

    五、            售后服务礼仪培训目的

    1、  售后服务理念融入售后服务行为技巧之中

    2、  提升员工售后服务意识和售后服务水平

    3、  获得更高的顾客忠诚度

     

     

    六、            售后客户服务礼仪技巧

    1、  不同环节的客户服务技巧

    2、  不同类型的客户服务技巧

    3、  客户投诉的处理技巧

    4、  电话服务技巧

    5、  处理客户服务压力的技巧

     

    七、            售后客户服务人员管理

    1、  售后客户服务团队管理

    2、  售后客户服务人员的素质要求

    3、  售后客户服务人员的行为规范

    4、  售后客户服务人员的激励

    5、  售后客户服务人员的效绩管理

     

    八、            售后如何通过培训提高服务水平

    1、  建立好完善的客户档案。客户的档案应包括客户的经营情况,客户的经营情况主要包括企业的地址、企业的经营水平等情况。

    2、  对客户进行分类。客户档案建立以后,产品经理要根据客户的档案情况对客户进行分类,以全面熟悉掌握客户的情况,针对不同时期的需要对客户进行了个性化的服务。

    3、  畅通与客户沟通的渠道。客户需求是多方面,有经营方面,有融资方面的。为了确保能及时了解客户需求,了他们提供个性化的服务。

    4、  尊重客户的个性化需求。既然是个性化的服务,就要求我们根据客户的个性,为他们提供真诚的服务。尊重客户的个性化需求首先要尊重客户的个性。

    除了个性化服务营销的手段,要想突破同质化“营销困境”,实现高层次的跨越,还必须利用品牌这个利器。展开强大的宣传营销攻势,积极抢占业务市场。

     

    九、            售后微笑服务礼仪培训

    微笑是一把神奇的金钥匙,可以打开心灵的钥匙。

    微笑是一种国际礼仪,能充分体现一个人的热情、修养和魅力。

    微笑能使陌生人感到亲切,是朋友感到安慰,使亲人感到愉悦。

    微笑是友好和平的代名词,它使我们的生活变得更加美好和温馨。

    微笑一下并不费力,却产生无穷魅力;受惠者成为富有,施予者并不变穷。

    微笑,是仁爱的象征,仁德的体现,快乐的源泉,是沟通消费者的第一桥梁。

    所谓“微笑”,多指对事物心领神会后的小笑,而生成这种笑细胞的基因就是自信。

    就说《蒙娜丽莎》吧,说起来,很难琢磨的微笑——但人家连锁巨头沃尔玛,对微笑竟然定了个人人能执行的标准叫“三米微笑原则”:顾客在走到员工三米之内的时候,要眼睛注视顾客,面带微笑,露出八颗牙齿,与顾客打招呼,并询问能帮助顾客做什么。

    1、  微笑要有内涵,不是皮笑肉不笑

    微笑时一种外在的表现,而内在的是内涵。从业人员要根据自己的工作,丰富微笑的内涵,要在微笑中给客户以力量,给客户以鼓励、镇静、宽容、理解,似春风春雨,给客户解决困难和问题。我们经常看到有的服务人员的笑是那样的假,有的人的笑像是黄鼠狼,有的人的笑很虚伪,有的人的笑里藏刀,就是没有内涵。

     

     

    2、  微笑要以很好的技能为前提,否则就成了傻笑

    服务人员说到底是为客户提供服务的,不要一提微笑就有卖笑的感觉,我们从业人员的微笑只是为服务提供附加价值,而不是业务的全部。有的人讲,宁要一分钟的高速度,不要三分钟的微笑,指的就是良好技能的重要。要在微笑中让客户不知不觉办完业务,让他感觉是一种享受,而不是受罪。

    3、  微笑要发自内心,是内心自然的流露,而不是应付、职业、僵硬的笑

    服务人员的售后服务要主动热情、自然大方、一如既往、养成习惯、心境平和、注意场合、态度端正。微笑要发自内心,只有发自内心,才能笑得亲切、自然、甜美,而不是生硬的、硬挤出来的笑。

    我们经常听人说,笑得比哭还难看,就是指笑不是发自内心,而是职业性。而要发自内心的微笑,就必须把顾客当做亲人和朋友,体现真诚、友善、和蔼、可亲。

    4、  微笑的前提是热爱你的工作、岗位、售后,否则是笑不起来的

    微笑是一种态度,将客户视为衣食父母,才能对顾客保持真诚的微笑。而要能够有这样认识,前提是你必须热爱你的工作、岗位,而不仅仅是作为谋生的手段、吃饭的工具、不得不做的事,而要倾注你的全部热情、你的激情、你的感情,把工作做为你的事业,才能精神焕发地工作。

    5、  要保持快乐的心情

    真诚的微笑是内心心情的流露,我们经常可以看到当人心情好时,笑意是自然的洋溢在脸上,这种笑是自然的,也是最美的,最具有感染力和影响力的。

    国内很多企业都知道要微笑,微笑很好,售后微笑服务等等,但是大家如何微笑、如何微笑得好、如何改善自己的微笑,如何坚持能做到售后微笑服务,所有人都不清楚,也没有强烈的意愿去弄清楚,知道微笑重要了就行了,何必那么认真,这是大多数中国企业的通病,也是大多数中国企业现状的真实写照。

    19191月,希尔顿的父亲因车祸去逝,他怀揣5千美元只身到德克萨斯州,买了他的第一家旅馆——梅比莱旅馆。192584,“达拉斯希尔顿饭店”竣工,开始了“一流设施,一流微笑”的经营理念。希尔顿和员工同心协力坚持微笑,以微笑带动服务质量的提高。

     

    十、            如何才能让售后服务礼仪的培训更有效

    1、  心态调整

    不可否认,很多从业人员,不屑于“售后服务”,是因为他们觉得认为做完工作就行,没有必要那么客气,甚至有人有“售后服务”就是低身下气、就是“奴文化”这种不健康心理。其实不然,售后服务本身就是从业人员的基本工作职责和内容。

    售后服务,是自信、阳光、规范、亲和力的外在表现。如果没有这个意识,提倡售后服务必然只是个形式,不容易达到良好的效果。

    2、  规范的培训

    规范培训是有效实施售后服务的基础。培训中,不仅要让学员从思想上有所认知、认可,更要教给学员规范的、和学员实际工作岗位一致的操作规范、技巧和流程。既然是“流程”,很明显,仅仅培训“微笑”是远远不够的,还须有相关的配套服务行为。

    3、  规章制度配合

    规章制度配合的目的,就是为了跟进、监督,实现有效的长期执行。不可否认,一个单位内部在没有形成一种文化和氛围之前,员工在执行制度时难免有一定惰性。所谓“师傅领进门,修行在个人”,只是对于高度自律一族而言。如果培训后一切都听之任之,必然会出现“微笑走形”的情况。所以,这时候后期的监督管理就非常重要。

    4、  其他细节配合

    “售后服务”是一种高附加值的、被认为有一定档次的服务规范。可以说,凡是提倡“售后服务”的部门,必是有一定物质基础的行业或岗位。所以,既然要提倡售后服务,就必然要有其他配合相跟进,比如上文提到的良好的工作环境和硬件设施,还有从业人员规范的服饰、妆容,一定的便民措施。

     

    十一、    售后服务礼仪培训提升的七种方式

    1、  避免服务不好的印象

    肯定和成功的第一印象对公司带来良好的收益,而不良的第一印象所带来的危害,远比能意识到的还要严重。现在的客户有了如此之多的选择机会,又有如此之多的企业挣抢着吸引他们的注意力。

    客户不但不能忍受不好的服务并因此而离开公司另寻新欢,而且会将对公司不好的印象向更多的人传播。所以,要提升服务质量,首先要避免给客户留下服务部好的印象。

    2、  弥补服务中的不足

    对服务中的不足,要及时弥补,而不是找借口推脱责任。通过“服务修整”,不但可以弥补服务中发生的问题,还可以使挑剔的客户感到满意,使你和竞争者之间产生明显差别。

    3、  制定服务修正的方案

    每个企业及其员工都会犯错误,客户对这点能够理解。客户关心的是你怎样改正自己的错误。对服务中出现的问题,首先是道歉,但并不仅仅如此,还需要制定出切实可行的方案,用具体的行动来解决客户的问题。

    4、  考虑客户的实际情况

    在为客户提供服务的过程中,要考虑客户的实际情况,按照客户的感受来调整服务制度,也就是为客户提供个性化的、价值最高的服务。

    5、  经常考察服务制度

    企业制定服务制度的目的是更好的为客户服务,帮助客户解决问题,满足他们的需求,达到和超过他们的期望。如果因为制度问题影响了客户服务质量的提高,就要及时地修改制度。

    6、  建立良好的服务制度

    良好的服务制度的含义基本上就是好事好办。通过良好的服务制度,可以很好的指导客户,让他们指导你能向他们提供什么以及怎样提供。通过良好的服务制度,可以极大的提高企业内部员工的服务意识,提升服务质量。

    7、  老客户和新客户

    即使做不到更好,也要把为老客户服务看得与为新客户服务同等重要。很对企业把更多的精力放在争取新客户上,为新客户提供优质的服务,却忽视了对老顾客的服务,这是非常错误的。因为发展新客户的成本要大大高于保持老客户的成本,等到老客户失去了再去争取就得不偿失了。所以,重视对老客户的服务可以显著地提升服务的质量。

     

    第三章 售后服务工作的一般方法

     

    一、售后人员应具有的条件

    售后服务工作是一个综合技能要求相当高的工作,由对售后服务人员的要求也相当高,必须具备以下条件:

    1、从事行内工作至少有五年以上经验,最好是从事技术工作或销售工作有几年经验,知道市场现状,了解客户需求,而且了解一些企业运作和服务途径。

    2、个人修养较多,有较高的知识水平,如本科以上学历,对产品知识熟悉,并且具备所使用销售产品的机械,装置,设备的知识。

    3、个人交际能力好,口头表达能力好,对人有礼貌,知道何时何地面对何种情况适合用何种语言表达,懂得一定的关系处理,或处理经验丰富,具有一定的人格威力,第一印象好能给客户信任。

    4、头脑灵活,现场应变能力好,能够到现场利用现场条件即时解决问题。

    5、外表整洁大方,言行举止得体,有企业形象大使和产品代言人的风度,不一定是要长得英俊、漂亮,但至少要对得起观众,别一出场就歪鼻扭嘴斜服,吹胡子瞪眼睛的,有损企业的形象。

    6、工作态度良好,热情,积极主动,能及时为客户服务,不计较个人得失,有奉献精神。

     

    二、处理顾客投诉与抱怨的程序:

    1、建立客户意见表(或投诉登记表)之类表格。

    接到客户投诉或抱怨的信息,在表格上记录下来,如公司名称、地址、电话号码、以及原因等;并及时将表格传递到售后服务人员手中,记录的人要签名确认,如办公室文员,接待员或业务员等。

    2、售后服务人员接到信息后即通过电话、传真或到客户所在地进行面对面的交流沟通,详细了解投诉或抱怨的内容,如问题产品名称,规格,生产日期,生产批号,何时使用,问题表现状况,在使用此品牌前曾使用何种品牌,状况如何,最近使用状况如何等。

    3、分析这些问题信息,并向客户说明及解释工作,规定与客户沟通协商。

    4、将处理情况向领导汇报,服务人员提出自己的处理意见,申请领导批准后,要及时答复客户。

    5、客户确认处理方案后,签下处理协议。

    6、将协议反馈回企业有关部门进行实施,如需补偿配件的,通知仓管出货,如需送小礼物的,通知市场管理人员发出等。

    7、跟踪处理结果的落实,直到客户答复满意为止。

     

    三、处理客户抱怨与投诉的方法:

    1、确认问题 

    认真仔细,耐心地听申诉者说话,并边听边记录,在对方陈述过程中判断问题的起因,抓住关键因素。尽量了解投诉或抱怨问题发生的全过程,听不清楚的,要用委婉的语气进行详细询问,注意不要用攻击性言辞,如请你再详细讲一次或者请等一下,我有些不清楚……”把你所了解的问题向客户复述一次,让客户予以确认。了解完问题之后征求客户的意见,如他们认为如何处理才合适,你们有什么要求等。

    2、分析问题

    在自己没有把握情况下,现场不要下结论,要下判断,也不要轻下承诺。最好将问题与同行服务人员协商一下,或者向企业领导汇报一下,共同分析问题。问题的严重性,到何种程度?你掌握的问题达到何种程度?是否有必要再到其它地方作进一步了解?如听了代理商陈述后,是否应到具体用户,如修车店那儿了解一下。如果客户所提问题不合理,或无事实依据,如何让客户认识到此点?解决问题时,抱怨者除要求经济补偿外,还有什么要求?如有些代理商会提出促销,开分店帮助等要求。

    3、互相协商 

    在与同行服务人员或者与公司领导协商之后,得到明确意见之后,由在现场的服务人员负责与客户交涉协商,进行协商之前,要考虑以下问题。

    A:公司与抱怨者之间,是否有长期的交易关系?

    B:当你努力把问题解决之后,客户有无今后再度购买的希望?

    C:争执的结果,可能会造成怎样的善意与非善意口传的影响?(即口碑)。

    D:客户的要求是什么?是不是无理要求或过分要求?

    E:公司方面有无过失?过失程度多大?

    作为公司意见的代理人,要决定给投诉或抱怨者提供某种补偿时,一定要考虑以上条件,如果属公司过失造成的,对受害者的补偿应更丰厚一些,如果是客户方面不合理;且日后不可再有业务来往,你大方明确地向对方说:“NO” 与客户协商时同样要注意言词表达,要表达清楚明确,尽可能听取客户的意见和观察反应,抓住要点,妥善解决。

    4、处理及落实处理方案 

    协助有了结论后,接下来就要作适当的处置,将结论汇报公司领导并征得领导同意后,要明确直接地通知客户,并且在以后的工作中要跟踪落实结果,处理方案中有涉及公司内部其它部门的,要将相关信息传达到执行的部门中,如应允客户补偿油品的,要通知仓管及发货部门,如客户要求油品特殊包装的或附加其它识别标志的,应通知相应的生产部门,相关部门是否落实这些方案,售后服务便一定要进行监督和追踪,直到客户反映满意为止。

     

    四、处理客户抱怨与投诉的方法的七“点”:

    1、耐心多一点 

    在实际处理中,要耐心地倾听客户的抱怨,不要轻易打断客户的叙述,还不要批评客户的不足,而是鼓励客户倾诉下去让他们尽情演泄心中的不满,当耐心地听完了客户的倾诉与抱怨后,当他们得到了发泄的满足之后,就能够比较自然地听得进服务人员解释和道歉了。

    2、态度好一点

    客户有抱怨或投诉就是表现出客户对企业的产品及服务不满意,从心理上来说,他们会觉得企业亏待了他,因此,如果在处理过程中态度不友好,会让他们心理感受及情绪很差,会恶化与客户之间关系反之若服务人员态度诚恳,礼貌热情,会降低客户的抵融情绪。俗话说:怒者不打笑脸人,态度谦和友好,会促使客户平解心绪,理智地与服务人员协商解决问题。

    3、动作快一点

    处理投诉和抱怨的动作快,一来可让客户感觉到尊重,二来表示企业解决问题的诚意,三来可以及时防止客户的负面污染对企业造成更大的伤害,四来可以将损失诚至最少,如停车费,停机费等等,一般接到客户投诉或抱怨的信息,即向客户电话或传真等方式了解具体内容,然后在企业内部协商好处理方案,最好当天给客户答复。

    4、语言得体一点

    客户对企业不满,在发泄不满的言语陈述中有可能会言语过激,如果服务人员与之针锋相对,势必恶化彼此关系,在解释问题过程中,措辞也十分注意,要合情合理,得体大方,不要一开口就说你怎么用也不会?”“你懂不懂最基本的技巧?等等伤人自尊的语言,尽量用婉转的语言与客户沟通,即使是客户存在不合理的地方,也不要过于冲动,否则,只会使客户失望并很快离去。

    5、补偿多一点

    客户抱怨或投诉,很大程度是因为他们采用该企业的产品后,他们利益受损,因此,客户抱怨或投诉之后,往往会希望得到补偿,这种补偿有可能是物质上如更换产品,退货,或赠送配件使用等,也可能是精神上的,如道歉等,在补偿时,企业认为有必要进行补偿才能安抚客户的,应该尽量补偿多一点,有时是物质及精神补偿同时进行,多一点的补偿金(当然,这点得按公司规定),客户得到额外的收获,他们会理解企业的诚意而对企业再建信心的。

    6、层次高一点

    客户提出投诉和抱怨之后都希望自己和问题受到重视,往往处理这些问题的人员的层次会影响客户的期待解决问题的情绪。如果高层次的领导能够亲自到客户处处理或亲自给电话慰问,会化解许多客户的怨气和不满,比较易配合服务人员进行问题处理。因此处理投诉和抱怨时,如果条件许可,应尽可能提高处理问题的服务人员的级别,如本企业领导出面(或服务人员任职为某部门领导)或聘请知名人士协助等。

    7、办法多一点 

    很多企业处理客户投诉和抱怨的结果,就是给他们慰问、道歉或补偿配件,赠小礼品等等,其实解决问题的办法有许多种,除上所述手段外,可邀请客户参观成功经营或无此问题出现的客户,或邀请他们参加企业内部讨论会,或者给他们奖励等等。

     

    五、六步骤平息顾客的不满

    1、让顾客发泄。

    要知道,顾客的愤怒就像充气的气球一样,当你给客户发泄后,他就没有愤怒了。毕竟客户的本意是:表达他的感情并把他的问题解决掉。当顾客发泄时,你最好的方式是:闭口不言、仔细聆听。当然,不要让客户觉得你在敷衍他。要保持情感上的交流。认真听取顾客的话,把顾客遇到的问题判断清楚。

    2、充分的道歉,让顾客知道你已经了解了他的问题。

    道歉并不意味着你做错了什么。顾客的对错并不重要,重要的是我们该如何解决问题而不让他蔓延。我们不要像某些公司一样花费大量的时间去弄清楚究竟是谁对谁错,这样对己对人都没有好处。当年的恒升电脑不就是为了一个小小的对错问题,丢掉了大陆的市场吗?向顾客说,你已经了解了他的问题,并请他确认是否正确。你要善于把顾客的抱怨归纳起来。

    3、收集事故信息。

    顾客有时候会省略一些重要的信息,因为他们以为这并不重要,或着恰恰忘了告诉你。当然,也有的顾客自己知道自己也有错而刻意隐瞒的。你的任务是:了解当时的实际情况。你还要搞清楚顾客到底要的是什么?如果顾客给你说:你们的产品不好,我要换货。你能知道他内心的想法吗?不能。你要了解顾客对品质的评判标准是什么,又是如何使用的,他想换成什么样的产品。

    你去看病的时候,医生是如何对待病人的?他们会问你许多问题。是他们不懂医术吗?不是,是因为他们知道,如果有什么信息被漏掉,他们可能无法开出药方来。你希望给你看病的大夫是看病最快的呢,还是他的病人对其竖大拇指的呢?

    你要做到

    知道问什么样的问题。

    问足够的问题。

    倾听回答。

    4、提出解决办法。

    对顾客的问题提出解决办法才是我们的根本。想想,当你在饭店等候多时饭菜才来时饭店老板是如何做的?可能是给你一盘小菜或者是一杯免费的酒,对吗?作为公司可以有更多的选择,比如:

    打折。

    免费赠品,包括礼物、商品或其他。

    名誉。对顾客的意见表示感谢。

    私交。以个人的名义给予顾客关怀。

    5、询问顾客的意见。

    顾客的想法有时和公司想像的差许多。你最好在提供了解决方案后再询问顾客的意见。如果顾客的要求可以接受,那最好的办法是迅速、愉快的完成。我们都要记住:开发一个新客户的费用是维护老客户费用的五倍!当所有的投诉发生时,解决问题的关键是——干净彻底地、令顾客满意地处理掉。” 

    6、跟踪服务。

    是否处理完成后就万事大吉了呢?不是,上面的五步都做了,表明你是一个优秀的公司,如果你继续跟踪顾客,你的公司是一个出类拔萃的公司。不要心痛钱,给顾客一个电话或者传真,当然,亲自去一趟更好。看顾客对该解决方案有什么不满意的地方。是否需要更改方案。

     

    六、在处理客户投诉的过程中技巧或原则

    原则一:不要人为的给客户下判断。

    客户是因为信赖你,觉得你可以为他解决问题才向你求助的。

    原则二:换位思考,站在客户的立场上看问题。

    如果你晚上睡不着,你是怨恨自己吗?你会说床不好,或者是环境太吵闹或者其他。你的顾客也一样,你只是他们的发泄对象,并不是你得罪了他们。

    原则三:坚持以下的利益原则:让公司赚钱,不赚不赔,少赔为赚。

     

    第四章 透视海尔的售后服务

         在产品同质化日益严重的今天,售后服务作为销售的一部分已经成为众厂家和商家争夺消费者的重要领地,良好的售后服务是下一次销售前最好的促销,是提升消费者满意度和忠诚度的主要方式,是树立企业口碑和传播企业形象的重要途径,在这方面海尔无疑是做的最出色的,也是做的最早的。海尔在售后服务方面积累了大量实战经验,再加以科学合理的改进,其服务模式已经成熟稳定,深得消费者认可,也是众多企业争效模仿的对象之一。经过一番对海尔的售后服务观察分析研究,可以看出国内众多企业学习海尔服务模式容易,学海尔服务的精髓难,况且海尔一直在不断改进,跟在海尔后面学习只能亦步亦趋,永远落后海尔,这也是国内企业百思不得其解、百做不见其效的症结所在。所以要超过海尔服务必须另辟蹊径,找到自己的服务模式,但万变不离其宗:消费者满意的适合企业的就是最好的

     

    一.工程师接受服务任务

      1.接到上门服务任务

      在接受顾客上门服务任务时,首先要明确并保证用户信息准确,用户信息包括:用户姓名、地址、联系电话(或传呼、手机等)、产品型号、购买日期、故障现象、用户要求等等。如信息不详细,如地址不详、电话错、无产品型号、无购买日期故障现象不详等,首先同派工的信息员或调度核实,如核实不到则直接联系用户核实。

      2.对用户信息进行分析

      (1)根据用户反映的故障现象分析可能故障原因、维修措施及所需备件。如果是用户误报或使用不当,可以电话咨询而不需要上门,但应电话咨询、指导用户正确使用,2小时后跟踪回访用户使用情况;如果有可能无此备件,则马上领用或申请备件。

      (2)据用户地址、要求上门时间及自己手中已接活的情况分析能否按时上门服务,如果是时间太短,不能保证按时到达,或同其他用户上门时间冲突,要向用户道歉、说明原因,征得用户同意与用户改约时间;若用户不同意,转其他他人或反馈中心信息员。

      (3)此故障能否维修?如果是此故障从来未维修过或同类故障以前未处理好,应立即查阅资料并请教其他工程师,或同中心、总部联系。

      (4)此故障能否在用户家维修?是否需拉修?是否需提供周转机?有可能无法在用户家维修,需要拉修的,应直接带周转机上门。

      3.联系用户

      在问题确定并找到解决方法后,应电话联系用户,确认上门时间、地址、产品型号、购买日期、故障现象等。

      (1)如果离用户住地路途遥远,无法保证按约定时间上门,要向客户道歉说明原因并改约时间。

      (2)如果客户地址、型号或故障现象不符,应重新确认,按确认后的地址、型号或故障现象上门服务。如果客户的产品超保,要准备收据(发票),按公司规定的收费标准进行收取费用。

      (3)如果问题属用户误报或使用不当的信息,服务工程师电话咨询指导用户使用,若用户不接受咨询,服务工程师应上门进行服务;为了预防咨询错误或误咨询,凡咨询后的用户2个小时后必须回访用户,确保用户没有问题。

    4)如果用户电话无人接,服务工程师应改时间打,如再晚就不能按约定时间到达则直接按地址上门,及时向中心反馈中间结果;如果用户恼怒,拒绝服务工程师上门,应耐心听取用户发泄(注意中间要应答,让用户知道你在 听),并本着承担责任,解决 问题的原则与用户沟通,征得用户同意上门,接受服务;如果用户一直联系不上,服务工程师要按地址上门,或用户不在家,则给用户留下留言条,留下电话,希望用户以后再联系。

     

    二.准备出发
      1.准备好各种服务工具

      服务工程师应准备好维修工具、备件(或周转机)、五个一道具,保修记录单、收据、收费标准、留言条、上岗证等,其中垫布属于必备物品,以免弄脏用户的东西。为了防止物品带错或漏带,服务工程师在出发前都要将自己的工具包对照标准自检一遍。

      

    2.服务工程师出发

      服务工程师出发时间要提前1小时根据约定时间及路程所需时间确定,以确保到达时间比约定时间提前5-10分钟。服务工程师要根据约定时间及路程所需时间倒推出发时间,以预防出发晚导致不能按时到。

      3.服务工程师在路上

    如果路上不出现塞车或意外,服务工程师在其他用户家不要耽误,以确保到达时间比约定时间提前5-10分钟;若服务工程师在路上遇到塞车或其他意外,要提前电话联系向用户道歉,在用户同意的前提下改约上门时间或提前通知中心改派其他人员;如果服务工程师在上一个用户家耽误时间,应将信息反馈信息员或相关人员,以便通知到用户。

     

     三.正式服务前的工作

      1.服务工程师进门前的准备工作

      服务工程师应首先检查自己的仪容仪表,以保证:海尔工作服且正规整洁;容仪表清洁,精神饱满;眼神正直热情;面带微笑。

      为预防服务工程师着装为非海尔工作服或衣服脏、不干净,服务工程师头发长且篷乱,胡子过长等,海尔严格要求服务工程师平时要注意自己的修养,另每天上班前要对自己的仪容仪表进行检查,在敲用户家门前,要首先对自己的仪容仪表进行自检,直到符合服务规范方可敲门。

      2.敲门

      虽然敲门只是一个微不足道的普通动作,但海尔照样严格要求服务工程师,一丝不苟。海尔规定的标准动作为连续轻敲2次,每次连续轻敲3下,有门铃的要先按门铃。海尔要求服务工程师平时多加练习,养成习惯;另敲门前稍微稳定一下自己的情绪,防止连续敲不停;敲的力量过大。

      如果用户听不见,或有其他事情无法脱身或用户家无人,服务工程师应每隔30秒钟重复1次;5分钟后再不开门则电话联系;电话联系不上,同用户邻居确认,确认用户不在家后,给用户门上或显要位置贴留言条,等用户回来后主动电话联系用户:同时通知中心(话务中心)。为了预防用户在楼下等待,服务工程师应到楼下周围查看,有无用户在此等候。

      3.进门

      服务工程师按约定时间或提前5分钟到达用户家,第一要自我介绍,确认用户,并出示上岗证。

      (1)如果服务工程师遇到迟到,未按约定时间到达,用户不高兴甚至不让进门等情况,海尔给服务工程师提供了各种解决方法:如用户有联系电话,必须在同用户约定的时间前1~2分钟同用户取得联系,道歉取得用户的谅解。

      若服务工程师迟到时间小于15分钟,应首先向用户道歉,可以以交通受阻为理由向用户解释,争取得到用户谅解(不能以服务用户太多为理由);若用户要赶时间可主动提出改约,再按约定时间提前上门。

      若服务工程师迟到时 间超过15分钟(或更长)首先向用户真诚道歉,可解释为本来是安排其他师傅上门,但他在另一具用户家耽误了,临时改派我来,所以耽误了时间,希望得到用户的谅解,可赠送小礼品;若道歉不接受,再由售后经理上门道歉。

      (2)如果用户不在家,服务工程师要表示道歉,离开并落实原因,及时找到用户;如果用户本人不在家(在家的是保姆等),而不让进门,服务工程师应亮出自己的上岗证,向对方说明事由,请对方马上联系用户确认,特殊情况下改约。

      (3)若用户对上门服务工程师资格表示怀疑甚至不让进门,服务工程师应首先亮出上岗证,给用户进明是受过正规培训的;把海尔的投诉、监督电话告诉用户;通过规范的咨询语言,熟练的维修技术来赢得用户的信任;如用户就是不让进门,则同用户改约时间,由售后经理亲自上门。

      (4)服务工程师有可能遇到报修产品不在此处而在别地的情况,在这种情况下,服务工程师应在征得用户同意的前提下,由用户带领到产品所在地或自行前往或改约重新上门。

      (5)如果用户家临时停电或用户临时有事出门,在征得用户同意的前提下改约时间;如果用户正在吃饭,服务工程师应等用户吃完饭再上门,也可按用户的意见办。

      4.穿鞋套,放置工具箱

      服务工程师穿鞋套时,先穿一只鞋套,踏进用户家,再穿另一只鞋套,踏进用户家门。如果用户不让穿,服务工程师要向用户解释为工作纪律,原则上必须穿;特殊情况下可按用户的意见办理。如果服务工程师穿鞋套站在门外,进门前要擦干净鞋套。为了预防鞋套太脏、破烂、太旧等,工具包内要带备用鞋套一付。

    放置工具箱时要找到一个靠近产品的合适位置,在保证工具箱不弄脏地面的前提下放好工具箱,取出垫布铺在地上,然后将工具箱放在垫布上。安装时,用盖布盖在附近可能因安装而弄脏的物品。海尔要求服务工程师出发前一定要自检,以防止工具箱、垫布太脏,工具箱内工具不整齐、乱,零部件放置杂乱、脏等,给用户造成坏印象,影响公司形象。

     

     四.开始服务
      1.耐心听取用户意见

      服务工程师要耐心听取用户意见,消除用户烦恼,服务工程师服务语言要规范,海尔要求服务工程师的语言文明、礼貌、得体;语调温和,悦耳、热情;吐字清晰,语速适中。

      如果用户恼怒,情绪激动,服务工程师要耐心、专心听取用户发泄,眼睛注视用户并不时应答,让用户知道你在认真听;若用户拒绝修理,要求退换弄清用户不让修的原因,从用户角度进行咨询,打消用户顾虑,让用户接受检修服务;如果用户有强烈要求维修工休息,喝水,抽烟等违反海尔服务规范的行为,服务工程师要详细讲解海尔服务宗旨及服务纪律,取得用户理解。

      2.故障诊断

      服务工程师应准确判断故障原因及所需更换的零部件,若超保产品,则向用户讲明产品超保需收费,征得用户同意并出示收费标准。

      (1)如果服务工程师对故障原因判断不准,就以拉回通过检测仪全面检测为理由拉回检查;若所需更换备件未带,备件不好或错,服务工程师应向用户表示歉意,仅凭电话所叙述的故障现象进行判断,所带备件不对,如果用户有时间,可以马上回去取备件,如果用户暂无时间,则与用户重新约定合理时间上门服务;如果机器正常但用户认定有问题,服务工程师应用规范的咨询口径向用户进行合理咨询。

      (2)服务工程师要严格按公司下发的相关技术资料,迅速排除产品故障。能在用户家修复的就现场修复,不能在用户家维修的,委婉向用户说明需拉回修,并提供周转机。.对需拉修产品外观进行检查,出示欠条并签字。如安装产品,则安装前要与用户商量安装位置,尊重用户意见,但如果用户意见违背安装规范,则应向用户说明可能会出现的隐患,请用户再斟酌,但最后的意见一定要由用户来确定。

      在用户家言行一定要规范:工具、工具包、备件等维修时用的或从产品上拆卸下的一切物品必须放在垫布上;尽可能不借用用户的东西,特殊情况下如需借用,则必须征求用户同意;如需移动用户家摆放的物品时,必须事先向用户说明,并征求用户同意;要借用户家的凳子或其它物品时,必须事先征得用户同意,踩时必须用垫布防护;绝对禁止在用户家抽烟,喝水、吃饭、留宿;绝对禁止使用用户家的洗手间和毛巾等;进行产品或家具搬运时,不允许在地板或地毯上推来拖去,给用户家损坏东西应照价赔偿,并表示歉意。

      (3)在实际维修中,如果.用户小修不让换件,服务工程师要向用户咨询解释;.如果在用户家无法修复,需拉回维修而用户不让拉修,或怀疑将好件给换掉或怀疑产品有大毛病而不让位修,服务工程师应以维修后需全面检测为由,讲明拉修的好处,说服用户拉修;如用户就是不同意拉修,则在用户同意的前提下在用户家中修,可让用户记下备件编号。同时为用户提供周转机,将用户产品拉回,提供收条,并跟用户约定送回时间,按规定时间送回。

      (4)如果在维修中遇到新的问题,服务工程师要暂时回避用户,及时将新问题反馈到中心或总部技术科,争取当场解决,若无法保证当场解决则以检测为由说服用户拉修。如果用户不同意维修,要求退机或换机,符合退机或换机条件的,服务工程师应按用户要求给予退机或换机;不符合退机或换机条件的,给用户认真解释国家三包规定,通过真诚的服务来感动用户;特殊情况上报中心请示。如果.用户要求给予赔偿,服务工程师不要轻易答复用户,报中心请未示后办理。

      (5)如果服务工程师在用户家服务时接到另一上门信息,需马上上门处理,要向用户解释需打个电话(不准用用户家电话),向中心讲明现正在用户家服务及尚需时间,由中心根据用户的轻重缓急程度改派其他服务工程师或同用户改约时间。

      如果在维修时遇用户家吃饭而产品一时不能修复,原则上在征得用户同意的前提下继续维修,如确有不便则清理现场,与用户约定等用户吃完饭再回来,明确再回来的时间(不能在用户家吃饭);若用户强烈要求服务工程师吃饭,则婉言谢绝。

      (6)服务工程师如果遇到用户以他提出的条件没有得到满足为由,扣押服务工程师或扣押服务工程师工具,或用户态度蛮横,对服务工程师打骂等情况,不要同用户发生正面冲突,电话通知中心,由中心出面处理。

      (7)试机通检。服务工程师要保证产品修复正常,且无报修外的其它故障隐患。如果产品未修复,要重新检修或拉修;存在其它故障隐患要将其它故障隐患一并排除掉;若服务工程师没有时间试机,则两小时后跟踪回访,以确保机器运行恢复正常。

      (8)指导用户使用和产品清擦及现场清理。服务工程师在试机通检后,要向用户培训产品的基本使用常识及保养常识,对于用户不会使用等常见问题进行讲解耐心讲解。

    维修完毕后,服务工程师要将产品恢复原位,用自带干净抹布将产品内外清擦干净,并清擦地板,清理维修工具。让用户签意见之前,自己要对产品及现场自检一遍,整理工具箱,对工具箱自检一遍,防止产品清擦不干净或现场清理不干净、工具遗漏在用户家等;如果产品搬动复位时将地板、产品碰坏,给用户照价赔偿。

     

     五.收费
      1.升级费用

      在上门维修前服务工程师要首先给用户出示收费标准和服务政策。如果使用备件要给用户出示备件费用,按用户要求给用户升级收费并给用户开具发票或收据;用户要求将旧件折费的,服务工程师要给用户讲明服务政策及公司规定,按标准收费。

      2.软件收费

      上门安装一个月内的软件,给用户免费调试并培训到位;三个月后的,给用户调试,收费并给用户开具发票或收据。

      3.超保收费

      出示收费标准,严格按收费标准进行收费,并开具收据,如用户要求开发票,则必须给用户开发票。如果收费标准与用户保修证标准不符,要以二者中最低收费标准为准,若现场未带发票,应与用户约定再送发票或寄发票。

      4.其他

    如果保收费用户不交,或要求减免费用再修,服务工程师要详细向用户解释国家三保规定及保修期范围,以真诚打动用户,让用户明白收费的合理性,如果用户一再坚持则将信息处理结果报回中心,根据中心批示处理,特殊情况向中心领导汇报,请求批示。

     

    六.服务完毕
      1.征询用户意见

      服务工程师在维修完毕后要详细填写保修记录单内容,让用户对产品的维修质量和服务态度进行评价,并签名(如故障原因及维修措施需对用户进行适当隐瞒,则这两栏可以不填,等回到维修部后再进行填写)。

    如果用户不填意见和签名,不要强迫用户签名;用户不满意则跟踪服务直至用户满意为止。

     

      2.赠送小礼品及服务名片

      最后服务工程师要向用户赠送小礼品及名片,若用户再有什么要求可按服务名片上的电话进行联系。如果用户要求服务工程师留下电话,服务工程师要向用户解释,名片上的电话为公司服务电话,若有什么要求我们都会及时上门服务。

      3.向用户道歉

    同用户道别时,服务工程师要走到门口时先脱下一只鞋套跨出门外,再脱另一只鞋套,站到门外,最后再次向用户道谢。如果在用户家中脱了鞋套,服务工程师要用抹布将地擦拭干净,并向用户道歉。

     

    七.回访与信息反馈
      1.回访

      对没有彻底修复把握的用户信息,维修工3小时后回访(正常情况下由电话中心统一回访,或中心回访用户),若回访用户不满意,则重新上门服务直至用户满意为止。

      2.信息反馈

      服务工程师要将《服务任务监督卡》当天反馈至网点信息员处,网点信息员当天将用户结果反馈中心。如果服务任务监督中满意非用户所签或保修记录单未及时反馈,网点信息员每日与维修人员对帐,对弄虚作假按规定处理,并及时回访用户采取补救措施;若网点信息员信息反馈不及时,中心信息员每天同网点信息员在固定时间对帐,并按规定处理。

     

     

    展开全文
  • 甲乙双方本着自愿、平等和互利原则,经过友好协商,就乙方在规定区域内销售甲方提供的产品、配件以及就为用户提供售后服务事宜,达成如下协议: 第一条 授权与认可 1.1甲方负责提供优质合格的产品及合法的销售协议和...
  • TLS协议分析

    千次阅读 2017-03-29 10:48:38
    TLS协议分析

    转自:http://blog.csdn.net/yzhou86/article/details/51211167/

    2015-09-06

    本文目标:

    1. 学习鉴赏TLS协议的设计,透彻理解原理和重点细节
    2. 跟进一下密码学应用领域的历史和进展
    3. 整理现代加密通信协议设计的一般思路

    本文有门槛,读者需要对现代密码学有清晰而系统的理解,建议花精力补足背景知识再读。本文最后的参考文献里有一些很不错的学习资料。

    目录 :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    
    
    TLS协议分析 与 现代加密通信协议设计
    一 . TLS协议的设计目标:
    1. 密码学的方法论
    2. TLS的设计目标
    3. TLS的历史
    二. TLS协议的原理
    1. 自顶向下,分层抽象
    3. TLS CipherSuite
    4. 协议分层
    5. record 协议
    1. SecurityParameters
    2. record层分段
    3. record层的密码学保护
    4. record层的密码学保护--MAC
    5. record层的密码学保护--stream cipher
    6. record层的密码学保护-- CBC block cipher
    7. record层的密码学保护-- AEAD cipher
    8. record层的密码学保护-- Key扩展
    5. handshake 协议
    1.handshake的总体流程
    3. handshake 协议外层结构
    4. handshake -- ClientHello,ServerHello,HelloRequest
    4.1 Client Hello
    4.2 Server Hello
    4.3 Hello Extensions
    4.4 Hello Request
    5. handshake -- Server Certificate
    6. handshake -- Server Key Exchange
    7. handshake -- Certificate Request
    8. handshake -- Server Hello Done
    9. handshake -- Client Certificate
    10. handshake -- Client Key Exchange
    (1). RSA 加密的 Premaster Secret 消息
    (2). 客户端 Diffie-Hellman 公钥
    (3). 客户端 EC Diffie-Hellman 公钥
    11. handshake -- Cerificate Verify
    12. handshake -- Finished
    13. handshake -- NewSessionTicket
    6. ChangeCipherSpec 协议
    7. Alert 协议
    8. application data协议
    8. TLS协议的安全分析
    1. 认证和密钥交换 的安全性
    1. 匿名密钥交换
    2. RSA 密钥交换和认证
    3. Diffie-Hellman 密钥交换和认证
    2. 版本回退攻击
    3. 针对握手过程的攻击
    4. 针对 Resuming Sessions 的攻击
    5. 针对应用数据保护的攻击
    6. 显式 IV的安全性
    7. 加密和MAC组合模式的安全性
    8. DOS 攻击下的安全性
    9.Session Ticket 的安全分析
    1. 无效的Session
    2. 窃取 Tickets
    3. 伪造 Tickets
    4. DoS 攻击
    5. 加密 Ticket 的key 的管理
    6. Ticket 的有效期
    7. 其他的 Ticket 格式和分发方法
    8. Identity Privacy, Anonymity, and Unlinkability
    9. TLS扩展:
    10. TLS的配套:PKI体系
    1. X.509 证书
    2.现有PKI体系暴露出的问题
    1. public key pin
    2. HSTS
    11. TLS协议历史上出现过的漏洞,密码学常见陷阱
    1. TLS的漏洞
    2. 密码学常见陷阱
    13. 下一代TLS: TLS 1.3
    1. record层的密码学保护的改动
    2.handshake协议的改动
    3.1-RTT 握手
    4. 有副作用的 0-RTT握手
    5. Resumption 和 PSK
    6. Key Schedule 过程的改动
    三. TLS协议的代码实现
    四. TLS协议的部署与优化
    五. 更多的加密通信协议case:QUIC,iMessage,TextSecure, otr, ios HomeKit,libsodium
    1. QUIC
    2. apple ios iMessage
    3. apple ios HomeKit
    4. TextSecure
    5. otr 协议
    6. libsodium/NaCL
    7. Tox.im
    8. CurveCP
    9. tcpcrypt
    10.noise
    11.tcpcrypt
    12. netflix MSL
    12.Amazon KMS 密钥管理服务 白皮书
    六. TLS协议给我们的启发 -- 现代加密通信协议设计
    七. 附录:密码学基础概念
    1. 块加密算法 block cipher
    2. 流加密算法 stream cipher
    3. Hash函数 hash funtion
    4. 消息验证码函数 message authentication code
    5. 密钥交换 key exchange
    6. 公钥加密 public-key encryption
    7. 数字签名算法 signature algorithm
    8. 密码衍生函数 key derivation function
    9. 随机数生成器 random number generators
    八. 参考文献:
    TLS/SSL 相关RFC及标准
    协议分析文章
    实际部署调优相关
    密码学相关
    相关开源项目
    

    [TOC]

    一 . TLS协议的设计目标:

    1. 密码学的方法论

    密码学和软件开发不同,软件开发是工程,是手艺,造轮子是写代码的一大乐趣。软件开发中常常有各种权衡,一般难有明确的对错,一般还用建筑来比拟软件的结构,设计的优雅被高度重视。

    密码学就不一样了。密码学是科学,不是工程,有严格的技术规范,严禁没有经过学术训练者随意创造。要求严谨的理论建模,严密的数学证明。很少有需要权衡的地方,正确就是正确,错误就是错误。又由于密码学过去在军事上的重要价值,各国政府一直投入大量人力物力财力,不断深入强化己方的算法,破解对手的算法,所以密码学就是一种残酷的军备竞赛。

    • 密码学有很多的陷阱(下文会介绍几个),设计使用密码学的协议或者软件,是极其容易出错,高风险的专业活动,单纯的码农背景是做不了的。本着不作死就不会死的伟大理念,首先推荐读者尽可能使用 TLS 这种标准化,开源,广泛使用,久经考验,高性能的协议。本文也只是整理一点粗浅的科普常识,读完这篇文章,并不能使读者具有设计足够安全的密码学协议的能力。

    • 密码学经过几十年的军备竞赛式发展,已经发展出大量巧妙而狡猾的攻击方法,我们使用的算法,都是在所有已知的攻击方法下都无法攻破的,由于我们大多数码农并没有精力去了解最前沿的攻击方法,所以我们其实并没有能力去评价一个加密算法,更没有能力自己发明算法。所以最好跟着业界的主流技术走,肯定不会有大错。

    • 现代密码学近20年进展迅猛,现在搞现代密码学研究的主要都是数学家,在这个领域里面以一个码农的知识背景,已经很难理解最前沿的东西,连正确使用加密算法都是要谨慎谨慎再谨慎的。一个码农,能了解密码学基本概念,跟进密码学的最新应用趋势,并正确配置部署TLS这种协议,就很不错了。

    • 密码学算法很难被正确地使用,各种细节非常容易出错。 例如:

      • 1.大多数码农都听说过aes,可是大多数都不了解细节,比如:aes应该用哪种模式?应该用哪种padding?IV/nonce应该取多少bit?IV/nonce应该怎么生成? key size应该选多大?key应该怎么生成?应不应该加MAC?MAC算法的选择?MAC和加密应该怎么组合?
      • 2.大多数知道RSA的码农分不清 RSASSA-PKCS1-v1_5 ,RSAES-OAEP 和 RSASSA-PSS
      • 3.更多错误参见 这个stackoverflow问答,强烈推荐仔细阅读
    • 密码学算法很难被正确地实现(代码实现过程中会引入很多漏洞,比如HeartBleed,比如各种随机数生成器的bug,时间侧通道攻击漏洞)

    • 不能一知半解,绝对不能在一知半解的情况下就动手设计密码学协议。犹如“盲人骑瞎马,夜班临深池”。

    • 不能闭门造车,密码学相关协议和代码一定要开源,采用大集市式的开发,接受peer review,被越多的人review,出漏洞的可能越小(所以应该尽可能使用开源组件)

    2. TLS的设计目标

    TLS的设计目标是构建一个安全传输层(Transport Layer Security ),在基于连接的传输层(如tcp)之上提供:

    1. 密码学安全 (1). 保密, message privacy (保密通过加密encryption实现,所有信息都加密传输,第三方无法窃听 ) (2). 完整性, message integrity( 通过MAC校验机制,一旦被篡改,通信双方会立刻发现 ) (3). 认证, mutual authentication (双方认证,双方都可以配备证书,防止身份被冒充 )
    2. 互操作,通用性 ( 根据公开的rfc,任何符合rfc的软件实现都可以互操作,不受限于任何专利技术)
    3. 可扩展性 ( 通过扩展机制 tls_ext可以添加功能,有大量的新功能,都是通过扩展添加的)
    4. 高效率 (通过session cache,恰当部署cache之后,tls的效率很高)

    请认准这几个目标,在后文中,会逐一实现。

    3. TLS的历史

    • 1995: SSL 2.0, 由Netscape提出,这个版本由于设计缺陷,并不安全,很快被发现有严重漏洞,已经废弃。
    • 1996: SSL 3.0. 写成RFC,开始流行。目前(2015年)已经不安全,必须禁用。
    • 1999: TLS 1.0. 互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版.
    • 2006: TLS 1.1. 作为 RFC 4346 发布。主要fix了CBC模式相关的如BEAST攻击等漏洞
    • 2008: TLS 1.2. 作为RFC 5246 发布 。增进安全性。目前(2015年)应该主要部署的版本,请确保你使用的是这个版本
    • 2015之后: TLS 1.3,还在制订中,支持0-rtt,大幅增进安全性,砍掉了aead之外的加密方式

    由于SSL的2个版本都已经退出历史舞台了,所以本文后面只用TLS这个名字。 读者应该明白,一般所说的SSL就是TLS。

    二. TLS协议的原理

    1. 自顶向下,分层抽象

    构建软件的常用方式是分层,把问题域抽象为多层,每一层的概念定义为一组原语,上一层利用下一层的组件构造实现,并被上一层使用,层层叠叠即成软件。 * 例如在编程语言领域中,汇编语言为一层,在汇编上面是C/C++等静态编译语言,C/C++之上是Python/php/lua等动态类型脚本语言层,之上常常还会构造领域特定的DSL * 在网络架构中,以太网是一层,其上是ip协议的网络层,ip之上是tcp等传输层,tcp之上是http等应用层

    密码学通信协议也是分层构造得到。大致可以这么分层:

    1. 最底层是基础算法原语的实现,例如: aes , rsa, md5, sha256,ecdsa, ecdh 等(举的例子都是目前的主流选择,下同)

    2. 其上是选定参数后,符合密码学里标准分类的算法,包括块加密算法,签名算法,非对称加密算法,MAC算法等,例如: aes-128-cbc-pkcs7,rsaes-oaep ,rsassa-pkcs1-v1_5, hmac-sha256,ecdsa-p256,curve25519 等

    3. 再其上,是把多种标准算法组合而成的半成品组件,例如:对称传输组件例如 aes-128-cbc + hmac-sha256,aes-128-gcm,认证密钥协商算法: rsassa-OAEP + ecdh-secp256r1,数字信封:rsaes-oaep + aes-cbc-128 + hmac-sha256 ,文件密码加密存储组件:pbkdf2+aes-128-cbc-hmac-sha256,密钥扩展算法 PRF-sha256 等

    4. 再其上,是用各种组件拼装而成的各种成品密码学协议/软件,例如:tls协议,ssh协议,srp协议,gnupg文件格式,iMessage协议,bitcoin协议等等

    第1层,一般程序员都有所了解,例如rsa,简直路人皆知; md5 被广泛使用(当然,也有广泛的误用) 第2层,各种莫名其妙的参数,一般很让程序员摸不着头脑,需要深入学习才能理清。 第3层,很多程序员自己造的轮子,往往说白了就是想重复实现第3层的某个组件而已。 第4层,正确地理解,使用,部署这类成熟的开放协议,并不是那么容易。很多的误用来源于不理解,需要密码学背景知识,才能搞懂是什么,为什么,怎么用。

    最难的是理论联系实际。面对一个一团乱麻的实际业务问题,最难的是从中抽象分析出其本质密码学问题,然后用密码学概念体系给业务建模。在分析建模过程中,要求必须有严密的,体系化的思考方式。不体系化的思考方式会导致疏漏,或者误用。

    第2层中,密码学算法,常见的有下面几类:

    1. 块加密算法 block cipher: AES, Serpent, 等
    2. 流加密算法 stream cipher: RC4,ChaCha20 等
    3. Hash函数 hash funtion:MD5,sha1,sha256,sha512 , ripemd 160,poly1305 等
    4. 消息验证码函数 message authentication code: HMAC-sha256,AEAD 等
    5. 密钥交换 key exchange: DH,ECDH,RSA,PFS方式的(DHE,ECDHE)等
    6. 公钥加密 public-key encryption: RSA,rabin-williams 等
    7. 数字签名算法 signature algorithm:RSA,DSA,ECDSA (secp256r1 , ed25519) 等
    8. 密码衍生函数 key derivation function: TLS-12-PRF(SHA-256) , bcrypto,scrypto,pbkdf2 等
    9. 随机数生成器 random number generators: /dev/urandom 等

    每个类别里面的都有几个算法不断竞争,优胜劣汰,近几十年不断有老的算法被攻破被淘汰,新的算法被提出被推广。这一块话题广,水很深,内容多,陷阱也多,后续byron会翻译整理一系列文章,分享一下每一类里面个人收集的资料。 在此推荐一下  开源电子书crypto101,讲的很透彻,而且很易读)

    设计一个加密通信协议的过程,就是自顶向下,逐步细化,挑选各类组件,拼装成完整协议的过程

    3. TLS CipherSuite

    从上述分层的角度看,TLS大致是由3个组件拼成的: – 1.对称加密传输组件,例如aes-128-gcm(这几个例子都是当前2015年最主流的选择); – 2.认证密钥协商组件,例如rsa-ecdhe; – 3.密钥扩展组件,例如TLS-PRF-sha256

    这些组件可以再拆分为5类算法,在TLS中,这5类算法组合在一起,称为一个CipherSuite: authentication (认证算法) encryption (加密算法 ) message authentication code (消息认证码算法 简称MAC) key exchange (密钥交换算法) key derivation function (密钥衍生算法)

    TLS协议设计之初就考虑到了这每一类算法的演变,所以没有定死算法,而是设计了一个算法协商过程,来允许加入新的算法( 简直是软件可扩展性设计的典范!),协商出的一个算法组合即一个CipherSuite TLS CipherSuite 在 iana 集中注册,每一个CipherSuite分配有 一个2字节的数字用来标识 ,可以在 iana的注册页面 查看

    iana注册页面截图: 

    在浏览器中,就可以查看当前使用了什么 CipherSuite,在地址栏上,点击一个小锁的标志,就可以看到了。 

    服务器端支持的CipherSuite列表,如果是用的openssl,可以用 openssl ciphers -V | column -t 命令查看,输出如: 

    例如其中这一行(这个是目前的主流配置):

    1
    
    0xC0,0x2F  -  ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH        Au=RSA    Enc=AESGCM(128)    Mac=AEAD
    

    表示: 名字为ECDHE-RSA-AES128-GCM-SHA256 的CipherSuite ,用于 TLSv1.2版本,使用 ECDHE 做密钥交换,使用RSA做认证,使用AES-128-gcm做加密算法,MAC由于gcm作为一种aead模式并不需要,所以显示为aead,使用SHA256做PRF算法。

    可以参考 man 1 ciphers

    要注意的是,由于历史兼容原因,tls标准,和openssl的tls实现中,有一些极度不安全的CipherSuite,一定要禁用,比如:

    EXP , EXPORT : 一定要禁用。EXPORT表示上世纪美国出口限制弱化过的算法,早已经被攻破,TLS的FREAK 攻击就是利用了这类坑爹的算法。 eNULL, NULL : 一定要禁用。NULL表示不加密!默认是禁用的。 aNULL : 一定要禁用。表示不做认证(authentication) ,也就是说可以随意做中间人攻击。

    ADH : 一定要禁用。表示不做认证的 DH 密钥协商。

    上面是举个例子,读者不要自己去研究怎么配置,这太容易搞错。 请按照mozilla官方给出的这个权威文档,复制粘贴就好了。

    CipherSuite的更多解释,配置方法等,可以参考byron之前写的一篇文章 SSL/TLS CipherSuite 介绍

    4. 协议分层

    TLS是用来做加密数据传输的,因此它的主体当然是一个对称加密传输组件。为了给这个组件生成双方共享的密钥,因此就需要先搞一个认证密钥协商组件,故,TLS协议自然分为:

    1. 做对称加密传输的record协议 ,the record protocol
    2. 做认证密钥协商的handshake协议,the handshake protocol

    还有3个很简单的辅助协议:

    1. changecipher spec 协议,the changecipher spec protocol, 用来通知对端从handshake切换到record协议(有点冗余,在TLS1.3里面已经被删掉了)
    2. alert协议,the alert protocol, 用来通知各种返回码,
    3. application data协议, The application data protocol,就是把http,smtp等的数据流传入record层做处理并传输。

    这种 认证密钥协商 + 对称加密传输 的结构,是绝大多数加密通信协议的通用结构,在后文的更多协议案例中,我们可以看到该结构一再出现。

    这5个协议中: record协议在tcp流上提供分包, 图片来自网络: 

    其它的: handshake protocol, alert protocol, changeCipherSpec protocol, application data protocol都封装在record protocol的包里,然后在tcp上传输(此处以tcp举例,也有可能是udp,或者随便什么ipc机制等)

    下文分别介绍,内容主要是翻译自 RFC5246,RFC5077,RFC4492

    5. record 协议

    record协议做应用数据的对称加密传输,占据一个TLS连接的绝大多数流量,因此,先看看record协议 图片来自网络: 

    Record 协议 — 从应用层接受数据,并且做:

    1. 分片,逆向是重组
    2. 生成序列号,为每个数据块生成唯一编号,防止被重放或被重排序
    3. 压缩,可选步骤,使用握手协议协商出的压缩算法做压缩
    4. 加密,使用握手协议协商出来的key做加密/解密
    5. 算HMAC,对数据计算HMAC,并且验证收到的数据包的HMAC正确性
    6. 发给tcp/ip,把数据发送给 TCP/IP 做传输(或其它ipc机制)。

    1. SecurityParameters

    record层的上述处理,完全依据下面这个SecurityParameters里面的参数进行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      struct {
          ConnectionEnd          entity;
          PRFAlgorithm           prf_algorithm;
          BulkCipherAlgorithm    bulk_cipher_algorithm;
          CipherType             cipher_type;
          uint8                  enc_key_length;
          uint8                  block_length;
          uint8                  fixed_iv_length;
          uint8                  record_iv_length;
          MACAlgorithm           mac_algorithm;
          uint8                  mac_length;
          uint8                  mac_key_length;
          CompressionMethod      compression_algorithm;
          opaque                 master_secret[48];
          opaque                 client_random[32];
          opaque                 server_random[32];
      } SecurityParameters;
    

    record 层使用上面的SecurityParameters生成下面的6个参数(不是所有的CipherSuite都需要全部6个,如果不需要,那就是空):

    1
    2
    3
    4
    5
    6
    
      client write MAC key
      server write MAC key
      client write encryption key
      server write encryption key
      client write IV
      server write IV
    

    当handshake完成,上述6个参数生成完成之后,就可以建立连接状态,连接状态除了上面的SecurityParameters,还有下面几个参数,并且随着数据的发送/接收,更新下面的参数:

    • compression state : 当前压缩算法的状态。

    • cipher state : 加密算法的当前状态,对块加密算法比如aes,包含密码预处理生成的轮密钥(感谢温博士指出) “round key”,还有IV等;对于流加密,包含能让流加密持续进行加解密的状态信息

    • sequence number : 每个连接状态都包含一个sequence number,并且读和写状态有不同的sequence number。当连接开始传输数据时,sequence number必须置为0. sequence number 是uint64类型的,并且不得超过 $ 2^{64}-1$ 。s. Sequence number不得回绕。如果一个TLS实现无法避开回绕一个sequence number,必须进行重协商。sequence number在每个record被发送时都增加1。并且传输的第1个Record必须使用0作为sequence number。

    此处有几个问题值得思考:

    (1). 为什么MAC key , encryption key, IV 要分别不同?

    在密码学中,对称加密算法一般需要encryption key,IV两个参数,MAC算法需要MAC key参数,因此这3个key用于不同的用途。 当然,不是所有的算法都一定会用到这3个参数,例如新的aead型算法,就不需要MAC key。

    (2). 为什么client和server要使用不同的key 如果TLS的双方使用相同的key,那么当使用stream cipher加密应用数据的时候,stream cipher的字节流在两个方向是一样的,如果攻击者知道TLS数据流一个方向的部分明文(比如协议里面的固定值),那么对2个方向的密文做一下xor,就能得到另一个方向对应部分的明文了。

    还有,当使用 aead 比如 aes-gcm 做加密的时候,aead标准严格要求,绝对不能用相同的 key+nonce 加密不同的明文,故如果TLS双方使用相同的key,又从相同的数字开始给nonce递增,那就不符合规定,会直接导致 aes-gcm 被攻破。

    参考: http://crypto.stackexchange.com/questions/2878/separate-read-and-write-keys-in-tls-key-material

    2. record层分段

    如上图所示,对要发送的数据流,首先分段,分段成如下格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
      struct {
          uint8 major;
          uint8 minor;
      } ProtocolVersion;
    
      enum {
          change_cipher_spec(20), alert(21), handshake(22),
          application_data(23), (255)
      } ContentType;
    
      struct {
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          opaque fragment[TLSPlaintext.length];
      } TLSPlaintext;
    

    • version字段 : ,定义当前协商出来的TLS协议版本,例如 TLS 1.2 version 是 { 3, 3 }

    • length字段 : 即长度,tls协议规定length必须小于 $2^{14}$,一般我们不希望length过长,因为解密方需要收完整个record,才能解密,length过长会导致解密方需要等待更多的rtt,增大latency,破坏用户体验,参考 Web性能权威指南 TLS那一章。

    • type字段 : ,用来标识当前record是4种协议中的哪一种,

    record压缩 : TLS协议定义了可选的压缩,但是,由于压缩导致了 2012 年被爆出CRIME攻击,BREACH攻击,所以在实际部署中,一定要禁用压缩。 http://www.unclekevin.org/?p=640http://www.freebuf.com/articles/web/5636.html

    3. record层的密码学保护

    record层的密码学保护:

    经过处理后的包格式定义如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      struct {
          ContentType type;
          ProtocolVersion version;
          uint16 length;
          select (SecurityParameters.cipher_type) {
              case stream: GenericStreamCipher;
              case block:  GenericBlockCipher;
              case aead:   GenericAEADCipher;
          } fragment;
      } TLSCiphertext;
    

    TLS协议设计目标中的 1.保密(encryption) 2.完整性(authentication) ,和防重放就在这里实现。 实现方式有3类:

    1. Block Cipher (CBC mode of operation) + HMAC:例如 aes-128-cbc+hmac-sha256
    2. Stream Cipher (RC4) + HMAC
    3. Authenticated-Encryption using block cipher (GCM/CCM 模式):例如 aes-128-gcm

    1.Block Cipher+HMAC 和 2.Stream Cipher + HMAC 的各类算法目前(2015年)都已经爆出各种漏洞(后文解释),目前最可靠的是 3.Authenticated-Encryption 类的算法,主要就是aes-gcm,下一代的TLS v1.3干脆只保留了3.Authenticated-Encryption,把1和2直接禁止了(所以。。。你真的还要继续用aes-cbc吗?)。

    GCM模式是AEAD的,所以不需要MAC算法。 GCM模式是AEAD的一种,AEAD 的 作用类似于 Encrypt-then-HMAC ,例如 Sha256 + Salt + AES + IV

    此处需要介绍一个陷阱。 在密码学历史上,出现过3种加密和认证的组合方式:

    1. Encrypt-and-MAC
    2. MAC-then-Encrypt
    3. Encrypt-then-MAC

    在TLS协议初定的那个年代,人们还没意识到这3种组合方式的安全性有什么差别,所以TLS协议规定使用 2.MAC-then-Encrypt,即先计算MAC,然后把 “明文+MAC” 再加密(块加密或者流加密)的方式,做流加密+MAC,和块加密+MAC。 但是,悲剧的是,近些年,人们发现 MAC-then-Encrypt 这种结构导致了 很容易构造padding oracle 相关的攻击,例如这在TLS中,间接形成被攻击者利用,这间接导致了 BEAST 攻击 , Lucky 13攻击 (CVE-2013-0169), 和 POODLE 攻击 (CVE-2014-3566).

    目前因此,学术界已经一致同意: Encrypt-then-MAC 才是最安全的! tls使用的是 MAC-then-Encrypt 的模式,导致了一些问题。 具体比较,参见: http://cseweb.ucsd.edu/~mihir/papers/oem.pdf https://www.iacr.org/archive/crypto2001/21390309.pdf http://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac https://news.ycombinator.com/item?id=4779015 http://tozny.com/blog/encrypting-strings-in-android-lets-make-better-mistakes/

    鉴于这个陷阱如此险恶,学术界有人就提出了,干脆把Encrypt和MAC直接集成为一个算法,在算法内部解决好安全问题,不再让码农选择,避免众码农再被这个陷阱坑害,这就是AEAD(Authenticated-Encryption With Addtional data)类的算法,GCM模式就是AEAD最重要的一种。

    4. record层的密码学保护—MAC

    TLS record 层 MAC的计算方法:

    1
    2
    3
    4
    5
    
      MAC(MAC_write_key, seq_num +
                            TLSCompressed.type +
                            TLSCompressed.version +
                            TLSCompressed.length +
                            TLSCompressed.fragment);
    

    其中的seq_num是当前record的 sequence number,每条record都会++, 可以看到把 seq_num,以及record header里面的几个字段也算进来了,这样解决了防重放问题,并且保证record的任何字段都不能被篡改。

    算完MAC,格式如下:

    1
    2
    3
    4
    
      stream-ciphered struct {
          opaque content[TLSCompressed.length];
          opaque MAC[SecurityParameters.mac_length];
      } GenericStreamCipher;
    

    然后根据SecurityParameters.cipher_type,选择对应的对称加密算法进行加密,分类解说如下:

    5. record层的密码学保护—stream cipher

    stream cipher: 算stream cipher,stream cipher的状态在连续的record之间会复用。 stream cipher的主力是RC4,但是目前RC4已经爆出多个漏洞,所以实际中基本不使用流加密没法,详情请见:

    https://tools.ietf.org/html/rfc7457#section-2.5

    [FreeBuf] RC4加密已不再安全,破解效率极高

    http://www.imperva.com/docs/HII_Attacking_SSL_when_using_RC4.pdf

    6. record层的密码学保护— CBC block cipher

    CBC模式块加密 TLS目前靠得住的的块加密cipher也不多,基本就是AES(最靠谱,最主流),Camellia,SEED,(3DES,IDEA之类已经显得老旧,DES请禁用),加密完的格式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      struct {
          opaque IV[SecurityParameters.record_iv_length];
          block-ciphered struct {
              opaque content[TLSCompressed.length];
              opaque MAC[SecurityParameters.mac_length];
              uint8 padding[GenericBlockCipher.padding_length];
              uint8 padding_length;
          };
      } GenericBlockCipher;
    

    这个值得说道说道,因为我们码农平常在业界还能看到很多用AES-CBC的地方,其中的几个参数:

    IV : : 要求必须用密码学安全的伪随机数生成器(CSPRNG)生成,并且必须是不可预测的,在Linux下,就是用用/dev/urandom,或者用 openssl 库的 RAND_bytes()。

    注意:TLS 在 1.1版本之前,没有这个IV字段,前一个record的最后一个block被当成下一个record的IV来用,然后粗大事了,这导致了 BEAST攻击。 所以,TLS1.2改成了这样。 (还在使用CBC的各位,建议关注一下自己的IV字段是怎么生成出来的。如果要用,做好和TLS1.2的做法保持一致)。

    其中 SecurityParameters.record_iv_length 一定等于 SecurityParameters.block_size. 例如 AES-256-CBC的 IV 一定是16字节长的,因为AES 128/192/256 的block size都是16字节。

    padding : 使用CBC常用的PKCS 7 padding(在block size=16字节这种情况下,和pkcs 5的算法是一回事,java代码里面就可以这么用这个case里,和pkcs 5的结果是一样的)

    padding_length : 就是PKCS 7 padding的最后一个字节

    注意2个险恶的陷阱: 1. 实现的代码必须在收到全部明文之后才能传输密文,否则可能会有BEAST攻击 2. 实现上,根据MAC计算的时间,可能进行时间侧通道攻击,因此必须确保—运行时间和padding是否正确无关

    7. record层的密码学保护— AEAD cipher

    AEAD 到了我们重点关注的AEAD,AEAD是新兴的主流加密模式,是目前最重要的模式,其中主流的AEAD模式是 aes-gcm-128/aes-gcm-256/chacha20-poly1305

    AEAD加密完的格式是:

    1
    2
    3
    4
    5
    6
    
      struct {
         opaque nonce_explicit[SecurityParameters.record_iv_length];
         aead-ciphered struct {
             opaque content[TLSCompressed.length];
         };
      } GenericAEADCipher;
    

    AEAD ciphers的输入是: key,nonce, 明文,和 “additional data”. key是 client_write_key 或者 the server_write_key. 不需要使用 MAC key.

    每一个AEAD算法都要指定不同的nonce构造算法,并指定 GenericAEADCipher.nonce_explicit 的长度. 在TLS 1.2中,规定很多情况下,可以按照rfc5116 section 3.2.1的技术来做。其中record_iv_length是nonce的显式部分的长度,nonce的隐式部分从key_block作为 client_write_iv和 and server_write_iv得出,并且把显式部分放在 GenericAEAEDCipher.nonce_explicit 里.

    在TLS 1.3 draft中,做了更改:

    1. 规定 AEAD算法的 nonce的长度规定为 max(8 bytes, N_MIN),即如果N_MIN比8大,就用N_MIN; 如果比8小,就用8。
    2. 并且规定 N_MAX小于8字节的AEAD不得用于TLS。
    3. 规定TLS AEAD中每条record的nonce通过下面的方法构造出来: 64bit的sequence number的右侧填充0,直到长度达到iv_length。然后把填充过的sequence number和静态的 client_write_iv或 server_write_iv (根据发送端选择)做异或(XOR)。异或完成后,得到的 iv_length 的nonce就可以做每条record的nonce用了。

      AEAD输入的明文就是 TLSCompressed.fragment (记得上面的介绍吗?AEAD是MAC和encrypt的集成,所以输入数据不需要在算MAC了).

      AEAD输入的additional_data 是:

    1
    2
    
      additional_data = seq_num + TLSCompressed.type +
                        TLSCompressed.version + TLSCompressed.length;
    

    “+” 表示字符串拼接。

    可以看到,此处类似上面的MAC计算,算入了seq_num来防重放,type,version,length等字段防止这些元数据被篡改。
    
    1
    2
    
      AEADEncrypted = AEAD-Encrypt(write_key, nonce, plaintext,
                                   additional_data)
    

    解密+验证完整性:

    1
    2
    3
    
    TLSCompressed.fragment = AEAD-Decrypt(write_key, nonce,
                                            AEADEncrypted,
                                            additional_data)
    

    如果解密/验证完整性失败,就回复一条 fatal bad_record_mac alert 消息.

    aes-gcm的iv长度,nonce长度,nonce构成等,后续再深入探讨。

    8. record层的密码学保护— Key扩展

    Key 扩展

    TLS握手生成的master_secret只有48字节,2组encryption key, MAC key, IV加起来,长度一般都超过48,(例如 AES_256_CBC_SHA256 需要 128字节),所以,TLS里面用1个函数,来把48字节延长到需要的长度,称为PRF:

    1
    2
    3
    4
    
      key_block = PRF(SecurityParameters.master_secret,
                      "key expansion",
                      SecurityParameters.server_random +
                      SecurityParameters.client_random);
    

    然后,key_block像下面这样被分割:

    1
    2
    3
    4
    5
    6
    
      client_write_MAC_key[SecurityParameters.mac_key_length]
      server_write_MAC_key[SecurityParameters.mac_key_length]
      client_write_key[SecurityParameters.enc_key_length]
      server_write_key[SecurityParameters.enc_key_length]
      client_write_IV[SecurityParameters.fixed_iv_length]
      server_write_IV[SecurityParameters.fixed_iv_length]
    

    TLS使用HMAC结构,和在CipherSuite中指定的hash函数(安全等级起码是SHA256的水平) 来构造PRF,

    首先定义P_hash,把(secret,seed)扩展成无限长的字节流:

    1
    2
    3
    
      P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
                             HMAC_hash(secret, A(2) + seed) +
                             HMAC_hash(secret, A(3) + seed) + ...
    

    其中”+“表示字符串拼接。 A() 定义为:

    1
    2
    
      A(0) = seed
      A(i) = HMAC_hash(secret, A(i-1))
    

    TLS的 PRF 就是把 P_hash 应用在secret上:

    1
    
      PRF(secret, label, seed) = P_<hash>(secret, label + seed)
    

    其中 label 是一个协议规定的,固定的 ASCII string.

    要注意的是,TLS 1.3里面已经废弃了这种方式,改为使用更靠谱的 HKDF,HKDF 也是 html5的WebCryptoAPI的标准算法之一。

    5. handshake 协议

    handshake protocol重要而繁琐。

    TLS 1.3对握手做了大修改,下面先讲TLS 1.2,讲完再介绍一下分析TLS 1.3.

    1.handshake的总体流程

    handshake protocol用于产生给record protocol使用的SecurityParameters。 在handshake中:

    • 客户端和服务器端协商TLS协议版本号和一个CipherSuite,
    • 认证对端的身份(可选,一般如https是客户端认证服务器端的身份),
    • 并且使用密钥协商算法生成共享的master secret。

    步骤如下:

    • 交换Hello消息,协商出算法,交换random值,检查session resumption.

    • 交换必要的密码学参数,来允许client和server协商出premaster secret。

    • 交换证书和密码学参数,让client和server做认证,证明自己的身份。

    • 从premaster secret和交换的random值 ,生成出master secret。

    • 把SecerityParameters提供被record层。

    • 允许client和server确认对端得出了相同的SecurityParameters,并且握手过程的数据没有被攻击者篡改。

    Handshake的结果是在双方建立相同的Session,Session 包含下列字段:

    1. session identifier session id,用来唯一标识一个session,在session 恢复的时候,也要用到
    2. peer certificate 对端的 X509v3 格式证书. 如果不需要认证对端的身份,就为空。
    3. compression method 压缩算法,一般被禁用
    4. cipher spec CipherSuite,如上文介绍,包含: 用于生成key的pseudorandom function (PRF) , 块加密算法例如AES, MAC算法 (例如 HMAC-SHA256). 还包括一个 mac_length字段,在后文的we握手协议介绍
    5. master secret 48字节的,client和server共享密钥。
    6. is resumable 一个标志位,用来标识当前session是否能被恢复。

    以上字段,随后被用于生成 record层的SecurityParameters,多个连接可以通过握手协议的session恢复功能来复用同一个session。

    握手协议使用 非对称加密/密钥协商/数字签名 3类算法, 因此要求读者对这3类算法概念清晰,能准确区分。 在此澄清一下,: 非对称的算法分为3类: , * 非对称加密,有:RSAES-PKCS1-v1_5,RSAES-OAEP ,Rabin-Williams-OAEP, Rabin-Williams-PKCS1-v1_5等 * 非对称密钥协商,有:DH,DHE,ECDH,ECDHE 等 * 非对称数字签名:RSASSA-PKCS1-v1_5,RSASSA-PSS,ECDSA,DSA,ED25519 等

    另外,非对称加密算法,可以当作密钥协商算法来用,所以 RSAES-PKCS1-v1_5,RSAES-OAEP 也可以当作密钥协商算法来用


    插播一段 RSA:

    RSA的实际工程应用,要遵循PKCS#1 标准,见 https://www.ietf.org/rfc/rfc3447

    其中的 RSAES-PKCS1-v1_5 和 RSASSA-PKCS1-v1_5 是使用RSA算法的两种不同scheme(体制)。 RSAES表示 RSA Encryption schemes,即非对称加密, RSAES有:RSAES-OAEP,RSAES-PKCS1-v1_5两种,其中RSAES-OAEP更新更安全

    RSASSA表示 Signature schemes with appendix,即appendix模式(appendix和recovery的区别请参看密码学教材)的非对称数字签名算法。 RSASSA有: RSASSA-PSS, RSASSA-PKCS1-v1_5 两种, 其中RSASSA-PSS更新更安全

    RSA还有一个缺陷,就是很容易被时间侧通道攻击,所以现在的RSA实现都要加 blinding ,后文有介绍。

    可以看到,RSA是一种很特殊的算法,既可以当非对称加密算法使用,又可以当非对称数字签名使用。这一点很有迷惑性,其实很多用RSA的人都分不清自己用的是RSA的哪种模式。

    相比之下,ECC(椭圆曲线)这一块的算法就很清晰,ECDSA只能用作数字签名,ECDH只能用作密钥交换。

    分清楚 RSAES-PKCS1-v1_5 和 RSASSA-PKCS1-v1_5 有什么用涅?

    PKCS#1规范解释:

    A generally good cryptographic practice is to employ a given RSA key pair in only one scheme. This avoids the risk that vulnerability in one scheme may compromise the security of the other, and may be essential to maintain provable security.

    FIPS PUB 186-3 美国标准规定:

    An RSA key pair used for digital signatures shall only be used for one digital signature scheme (e.g., ANS X9.31, RSASSA-PKCS1 v1.5 or RSASSA-PSS; see Sections 5.4 and 5.5). In addition, an RSA digital signature key pair shall not be used for other purposes (e.g., key establishment).

    一对密钥只做一个用途,要么用作非对称加解密,要么用作签名验证,别混着用! 一对密钥只做一个用途,要么用作非对称加解密,要么用作签名验证,别混着用! 一对密钥只做一个用途,要么用作非对称加解密,要么用作签名验证,别混着用!

    这个要求,决定了一个协议的 PFS(前向安全性),在斯诺登曝光NSA的“今日捕获,明日破解”政策后,越发重要

    https://news.ycombinator.com/item?id=5942534

    http://news.netcraft.com/archives/2013/06/25/ssl-intercepted-today-decrypted-tomorrow.html

    https://lwn.net/Articles/572926/

    https://www.eff.org/deeplinks/2014/04/why-web-needs-perfect-forward-secrecy

    http://www.wired.com/2013/10/lavabit_unsealed

    PFS反映到密钥协商过程中,就是:

    • 不要使用RSA做密钥协商,一定只用RSA做数字签名
    • 不要把ECDH的公钥固定内置在客户端做密钥协商

    后文可以看到这一原则在 TLS 1.3, QUIC,Apple的iMessage等协议中一再贯彻。

    非对称RSA/ECC这个话题比较大了,后面有空再写文章吧,读者可以先看一下参考资料,里面有清晰的介绍。

    插播结束,继续TLS。


    由于设计的时候,就要考虑兼容性,而且实际历史悠久,所以TLS协议90年代曾经使用的一些算法,现在已经被破解了,例如有的被发现漏洞(rc4),有的密钥长度过短(例如曾经美帝有出口限制,限制RSA 在512比特以下,对称加密密钥限制40比特以下,后来2005年限制被取消),但是考虑到兼容,现在的TLS实现中,还是包含了这种已经被破解的老算法的代码。这样,如果攻击者可以干扰握手过程,诱使client和server使用这种已经被破解的算法,就会威胁TLS协议的安全,这被称为“降级攻击”。

    为了在握手协议解决降级攻击的问题,TLS协议规定:client发送ClientHello消息,server必须回复ServerHello消息,否则就是fatal error,当成连接失败处理。ClientHello和ServerHello消息用于建立client和server之间的安全增强能力,ClientHello和ServerHello消息建立如下属性:

    • Protocol Version
    • Session ID
    • Cipher Suite
    • Compression Method.

    另外,产生并交换两个random值 ClientHello.random 和 ServerHello.random

    密钥协商使用四条: server的Certificate,ServerKeyExchange,client的Certificate,ClientKeyExchange 。TLS规定以后如果要新增密钥协商方法,可以订制这4条消息的数据格式,并且指定这4条消息的使用方法。密钥协商得出的共享密钥必须足够长当前定义的密钥协商算法生成的密钥长度必须大于46字节

    在hello消息之后,server会把自己的证书在一条Certificate消息里面发给客户端(如果需要做服务器端认证的话,例如https)。 并且,如果需要的话,server会发送一条ServerKeyExchange消息,(例如如果服务器的证书只用做签名,不用做密钥交换,或者服务器没有证书)。client对server的认证完成后,server可以要求client发送client的证书,如果这是协商出来的CipherSuite允许的。下一步,server会发送ServerHelloDone消息,表示握手的hello消息部分已经结束。然后server会等待一个client的响应。如果server已经发过了CertificateRequest消息,client必须发送Certificate消息。然后发送ClientKeyExchange消息,并且这条消息的内容取决于ClientHello和ServerHello消息协商的算法。如果client发送了有签名能力的证书,就显式发送一个经过数字签名的CertificateVerify消息,来证明自己拥有证书私钥。

    然后,client发送一个ChangeCipherSpec消息,并且client拷贝待定的Cipher Spec到当前的Cipher Spec。然后client立即用新算法+新key+新密钥 发送Finished消息。收到后,server发送自己的ChangeCipherSpec消息,作为响应,并且拷贝待定的Cipher Spec到当前的Cipher Spec。此时,握手就完成了,client和server可以开始交换应用层数据(如下图所示)。应用层数据不得在握手完成前发送。

    引用一个来自网络的图片: 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
          Client                                               Server
    
          ClientHello                  -------->
                                                          ServerHello
                                                         Certificate*
                                                   ServerKeyExchange*
                                                  CertificateRequest*
                                       <--------      ServerHelloDone
          Certificate*
          ClientKeyExchange
          CertificateVerify*
          [ChangeCipherSpec]
          Finished                     -------->
                                                   [ChangeCipherSpec]
                                       <--------             Finished
          Application Data             <------->     Application Data
    
                 Figure 1.  Message flow for a full handshake
    
       * 表示可选的消息,或者根据上下文在某些情况下会发送的消息。Indicates optional or situation-dependent messages that are not
       always sent.
    

    注:为了帮助解决管道阻塞的问题,ChangeCipherSpec是一个独立的TLS protocol content type,并不是一个握手消息。

    TLS的完整握手过程,要进行RSA/ECDH/ECDSA等非对称计算,非对称计算是很慢的。关于非对称的性能: 例如在2015年的服务器cpu: Intel® Xeon® CPU E3-1230 V2 @ 3.30GHz 上, 使用如下命令测试:

    1
    2
    3
    4
    5
    
    openssl speed rsa2048
    openssl speed ecdsap256
    openssl speed ecdhp256
    openssl speed aes-128-cbc
    openssl speed -evp aes-128-cbc
    

    结果如下表:

      算法 性能 性能
      RSA-2048 私钥运算 723.7 次/秒 公钥运算 23505.8 次/秒 |
      256 bit ecdsa (nistp256) 签名 8628.4 次/秒 验证 2217.0 次/秒 |
      256 bit ecdh (nistp256) ECDH协商 2807.8 次/秒 |
      aes-128-cbc 加密 121531.39 K/秒 |
      aes-128-cbc 使用aesni硬件加速 加密 683682.13 K/秒 |

    注:非对称的单位是 次/秒,这是由于非对称一般只用于处理一个block, 对称的单位是 K/秒,因为对称一般用于处理大量数据流,所以单位和流量一样。 可以给非对称的 次/秒 乘以 block size ,就可以和对称做比较了。例如rsa-2048,723.7*2048/8/1024=185.2672 K/秒 , 故 RSA-2048 私钥运算性能 是aes-128-cbc 的 $1.5/1000$。是aesni的 $2.6/10000$

    如上,性能数据惨不忍睹, 简直不能忍!!!

    有鉴于此,TLS从设计之初,就采用了万能手段—加cache,有2种cache手段:session id,和session ticket。把握手的结果直接cache起来,绕过握手运算。

    当client和server决定恢复一个之前的session,或复用一个已有的session时(可以不用协商一个新的SecurityParameters),消息流程如下:

    客户端使用要被恢复的session,发送一个ClientHello,把Session ID包含在其中。server在自己的session cache中,查找客户端发来的Session ID,如果找到,sever把找到的session 状态恢复到当前连接,然后发送一个ServerHello,在ServerHello中把Session ID带回去。然后,client和server都必须ChangeCipherSpec消息,并紧跟着发送Finished消息。这几步完成后,client和server 开始交换应用层数据(如下图所示)。如果server在session cache中没有找到Session ID,那server就生成一个新的session ID在ServerHello里给客户端,并且client和server进行完整的握手。

    流程图如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      Client                                                Server
    
      ClientHello                   -------->
                                                       ServerHello
                                                [ChangeCipherSpec]
                                    <--------             Finished
      [ChangeCipherSpec]
      Finished                      -------->
      Application Data              <------->     Application Data
    
          Figure 2.  Message flow for an abbreviated handshake
    

    3. handshake 协议外层结构

    从消息格式来看,TLS Handshake Protocol 在 TLS Record Protocol 的上层. 这个协议用于协商一个session的安全参数。 Handshake 消息(例如ClientHello,ServerHello等) 被包装进 TLSPlaintext结构里面,传入TLS record层,根据当前session 状态做处理,然后传输。

    如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
      enum {
          hello_request(0), client_hello(1), server_hello(2),
          certificate(11), server_key_exchange (12),
          certificate_request(13), server_hello_done(14),
          certificate_verify(15), client_key_exchange(16),
          finished(20), (255)
      } HandshakeType;
    
      struct {
          HandshakeType msg_type;    /* handshake type */
          uint24 length;             /* bytes in message */
          select (HandshakeType) {
              case hello_request:       HelloRequest;
              case client_hello:        ClientHello;
              case server_hello:        ServerHello;
              case certificate:         Certificate;
              case server_key_exchange: ServerKeyExchange;
              case certificate_request: CertificateRequest;
              case server_hello_done:   ServerHelloDone;
              case certificate_verify:  CertificateVerify;
              case client_key_exchange: ClientKeyExchange;
              case finished:            Finished;
              case session_ticket:      NewSessionTicket; /* NEW */
          } body;
      } Handshake;
    

    TLS协议规定,handshake 协议的消息必须按照规定的顺序发,收到不按顺序来的消息,当成fatal error处理。也就是说,TLS协议可以当成状态机来建模编码。

    下面按照消息发送必须遵循的顺序,逐个解释每一条握手消息。

    handshake协议的外层字段,见这个抓包:

    4. handshake — ClientHello,ServerHello,HelloRequest

    Hello消息有3个:ClientHello, ServerHello,HellloRequest 逐个说明:

    4.1 Client Hello

    当客户端第一次连接到服务器时,第一条message必须发送ClientHello。 另外,rfc里规定,如果客户端和服务器支持重协商,在客户端收到服务器发来的HelloRequest后,也可以回一条ClientHello,在一条已经建立的连接上开始重协商。(重协商是个很少用到的特性。)

    消息结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
       struct {
           uint32 gmt_unix_time;
           opaque random_bytes[28];
       } Random;
    
       opaque SessionID<0..32>;
    
       uint8 CipherSuite[2];
    
       enum { null(0), (255) } CompressionMethod;
    
       struct {
           ProtocolVersion client_version;
           Random random;
           SessionID session_id;
           CipherSuite cipher_suites<2..2^16-2>;
           CompressionMethod compression_methods<1..2^8-1>;
           select (extensions_present) {
               case false:
                   struct {};
               case true:
                   Extension extensions<0..2^16-1>;
           };
       } ClientHello;
    

    Random 其中:

      gmt_unix_time 是 unix epoch时间戳。
      random_bytes 是 28字节的,用密码学安全随机数生成器 生成出来的随机数。
    

    密码学安全的随机数生成,这是个很大的话题,也是一个大陷阱,目前最好的做法就是用 /dev/urandom,或者openssl库的 RAND_bytes()

    历史上,恰好就在SSL的random_bytes这个字段,NetScape浏览器早期版本被爆出过随机数生成器漏洞。 被爆菊的随机数生成器使用 pid + 时间戳 来初始化一个seed,并用MD5(seed)得出结果。 见 http://www.cs.berkeley.edu/~daw/papers/ddj-netscape.html, 建议读者检查一下自己的随机数生成器。


    client_version : 客户端支持的最高版本号。

    random : 客户端生成的random。

    ClientHello.session_id 唯一标识一个session,用来做session cache。如果为空,表示不做复用,要求服务器生成新的session。 session_id的来源有:

    1. 之前的协商好的连接的session_id
    2. 当前连接的session_id
    3. 当前也在使用中的另一条连接的session_id

    其中第三种允许不做重新握手,就同时建立多条独立的安全连接。这些独立的连接可能顺序创建,也可以同时创建。一个SessionID当握手协商的Finished消息完成后,就合法可用了。存活直到太旧被移除,或者session 关联的某个连接发生fatal error。SessionID的内容由服务器端生成。

    注:由于SessionID的传输是不加密,不做MAC保护的,服务器不允许把私密信息发在里面,不能允许伪造的SessionID在服务器造成安全问题。(握手过程中的数据,整体是受Finished消息的保护的)

    ClientHello.cipher_suites字段,包含了客户端支持的CipherSuite的列表,按照客户端希望的优先级排序,每个CipherSuite有2个字节,每个CipherSuite由:一个密钥交换算法,一个大量数据加密算法(需要制定key length参数),一个MAC算法,一个PRF 构成。服务器会从客户端发过来的列表中选择一个;如果没有可以接受的选择,就返回一个 handshake failure 的 alert,并关闭连接。如果列表包含服务器不认识,不支持,或者禁用的CipherSuite,服务器必须忽略。 如果SessionID不为空,则cipher_suites里面起码要包含客户端cache的session里面的那个CipherSuite

    compression_methods,类似地,ClientHello里面包含压缩算法的列表,按照客户端优先级排序。当然,如前介绍,服务器一般禁用TLS的压缩。

    compression_methods 后面可以跟一组扩展(extensions), extensions都是可选的,比较有用的扩展如: SNI, session ticket,ALPN,OCSP 等,后文介绍。

    客户端发送了ClientHello后,服务器端必须回复ServerHello消息,回复其他消息都会导致 fatal error 关闭连接。

    4.2 Server Hello

    当收到客户端发来的ClientHello后,正常处理完后,服务器必须回复ServerHello。

    消息结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      struct {
          ProtocolVersion server_version;
          Random random;
          SessionID session_id;
          CipherSuite cipher_suite;
          CompressionMethod compression_method;
          select (extensions_present) {
              case false:
                  struct {};
              case true:
                  Extension extensions<0..2^16-1>;
          };
      } ServerHello;
    

    server_version : 服务器选择 ClientHello.client_version 和 服务器支持的版本号 中的最小的。

    random : 服务器生成的random,必须确保和客户端生成的random没有关联。

    session_id : 服务器为本连接分配的SessionID。如果ClientHello.session_id不为空,服务器会在自己的本地做查找。

    • 如果找到了匹配,并且服务器决定复用找到的session建立连接,服务器应该把ClientHello.session_id同样的 session id填入ServerHello.session_id,这表示恢复了一个session,并且双方会立即发送Finished消息。
    • 否则,回复一个和ClientHello.random_id不同的Serverhello.session_id,来标识新session。服务器可以回复一个空的session_id,来告诉客户端这个session不要cache,不能恢复。 如果一个session 被恢复了,那必须恢复成之前协商的session里面的 CipherSuite。要注意的是,并不要求服务器一定要恢复session, 服务器可以不做恢复。

    在实践中,session cache在服务器端要求key-value形式的存储,如果tls服务器不止一台的话,就有一个存储怎么共享的问题,要么存储同步到所有TLS服务器的内存里,要么专门搞服务来支持存储,并使用rpc访问, 无论如何,都是很麻烦的事情,相比之下,后文要介绍的session ticket就简单多了,所以一般优先使用session ticket。

    cipher_suite : 服务器选定的一个CipherSuite。如果是恢复的session,那就是session里的CipherSuite。

    compression_method : 跟上面类似。

    extensions : 扩展列表。要注意的是,ServerHello.extensions 必须是 ClientHello.extensions的子集。

    4.3 Hello Extensions

    The extension 的格式是:

    1
    2
    3
    4
    5
    6
    7
    8
    
          struct {
              ExtensionType extension_type;
              opaque extension_data<0..2^16-1>;
          } Extension;
    
          enum {
              signature_algorithms(13), (65535)
          } ExtensionType;
    

    其中:

    • “extension_type” 标识是哪一个扩展类型。

    • “extension_data” 一坨二进制的buffer,扩展的数据体,各个扩展自己做解析。

    extension_type 只能出现一次,ExtensionType之间不指定顺序。

    extensions 可能在新连接创建时被发送,也可能在要求session恢复的时候被发送。所以各个extension都需要规定自己再完整握手和session恢复情况下的行为。 这些情况比较琐碎而微妙,具体案例要具体分析。

    4.4 Hello Request

    服务器任何时候都可以发送 HelloRequest 消息。

    HelloRequest的意思是,客户端应该开始协商过程。客户端应该在方便的时候发送ClientHello。服务器不应该在客户端刚创建好连接后,就发送HelloRequest,此时应该让客户端发送ClientHello。

    客户端收到这个消息后,可以直接忽略这条消息。 服务器发现客户端没有响应HelloRequest后,可以发送fatal error alert。

    消息结构:

    1
    
      struct { } HelloRequest;
    

    HelloRequest不包含在握手消息的hash计算范围内。

    5. handshake — Server Certificate

    当服务器确定了CipherSuite后,根据CipherSuite里面的认证算法,如果需要发送证书给客户端,那么就发送 Server Certificate消息给客户端。Server Certificate总是在ServerHello之后立即发送,所以在同一个RTT里。

    Server Certificate里面包含了服务器的证书链。

    消息结构:

    1
    2
    3
    4
    5
    
      opaque ASN.1Cert<1..2^24-1>;
    
      struct {
          ASN.1Cert certificate_list<0..2^24-1>;
      } Certificate;
    

    certificate_list : 证书列表,发送者的证书必须是第一个,后续的每一个证书都必须是前一个的签署证书。根证书可以省略

    证书申请的时候,一般会收到好几个证书,有的需要自己按照这个格式来拼接成证书链。

    如果服务器要认证客户端的身份,那么服务器会发送Certificate Request消息,客户端应该也以 这条Server Certificate消息的格式回复。

    服务器发送的证书必须:

    • 证书类型必须是 X.509v3。除非明确地协商成别的了(比较少见,rfc里提到了例如 OpenPGP格式)。

    • 服务器证书的公钥,必须和选择的密钥交换算法配套。

      密钥交换+认证算法 配套的证书中公钥类型
      RSA / RSA_PSK RSA 公钥;证书中必须允许私钥用于加密 (即如果使用了X509V3规定的key usage扩展, keyEncipherment比特位必须置位) 这种用法没有前向安全性,因此在 TLS 1.3中被废弃了 |
         
      DHE_RSA / ECDHE_RSA RSA 公钥;证书中必须允许私钥用于签名(即如果使用了X509V3规定的key usage扩展, digitalSignature比特位必须置位),并且允许server key exchange消息将要使用的签名模式(例如 PKCS1_V1.5 ,OAEP等)和hash算法(例如sha1, sha256等) |
         
      DHE_DSS DSA 公钥; 历史遗留产物,从来没有被大规模用过,安全性差,废弃状态。证书必须允许私钥用于签名,必须允许server key exchange消息中使用的hash算法。
      DH_DSS / DH_RSA Diffie-Hellman 公钥; 要求key usage里面的keyAgreement比特位必须置位。 这种用法没有前向安全性,因此在 TLS 1.3中被废弃了 |
         
      ECDH_ECDSA / ECDH_RSA 能做 ECDH 用途的公钥;公钥必须使用 客户端支持的ec曲线和点格式。这种用法没有前向安全性,因此在 TLS 1.3中被废弃了|
         
      ECDHE_ECDSA ECDSA用途的公钥;证书必须运输私钥用作签名,必须允许server key exchange消息里面要用到的hash算法。公钥必须使用客户端支持的ec曲线和点格式。|
    • “server_name” 和 “trusted_ca_keys” 扩展用于引导证书选择。

    其中有5种是ECC密钥交换算法:ECDH_ECDSA, ECDHE_ECDSA, ECDH_RSA, ECDHE_RSA, ECDH_anon。 ECC(椭圆曲线)体制相比RSA,由于公钥更小,性能更高,所以在移动互联网环境下越发重要。 以上ECC的5种算法都用ECDH来计算premaster secret, 仅仅是ECDH密钥的生命周期和认证算法不同。 其中只有 ECDHE_ECDSA 和 ECDHE_RSA 是前向安全的。

    如果客户端在ClientHello里提供了 “signature_algorithms” 扩展,那么服务器提供的所有证书必须用 “signature_algoritms”中提供的 hash/signature算法对 之一签署。要注意的是,这意味着,一个包含某种签名算法密钥的证书,可能被另一种签名算法签署(例如,一个RSA公钥可能被一个ECDSA公钥签署)。(这在TLS1.2和TLS1.1中是不一样的,TLS1.1要求所有的算法都相同。)注意这也意味着DH_DSS,DH_RSA,ECDH_ECDSA,和ECDH_RSA 密钥交换不限制签署证书的算法。固定DH证书可能使用”signature_algorithms”扩展列表中的 hash/签名算法对 中的某一个签署。名字 DH_DSS, DH_RSA, ECDH_ECDSA, 和 ECDH_RSA 只是历史原因,这几个名字的后半部分中指定的算法,并不会被使用,即DH_DSS中的DSS并不会被使用,DH_RSA中并不会使用RSA做签名,ECDH_ECDSA并不会使用ECDSA算法。。。 如果服务器有多个证书,就必须从中选择一个,一般根据服务器的外网ip地址,SNI中指定的hostname,服务器配置来做选择。如果服务器只有一个证书,那么要确保这一个证书符合这些条件。 要注意的是,存在一些证书使用了TLS目前不支持的 算法组合。例如,使用 RSASSA-PSS签名公钥的证书(即证书的SubjectPublicKeyInfo字段是id-RSASSA-PSS)。由于TLS没有给这些算法定义对应的签名算法,这些证书不能在TLS中使用。 如果一个CipherSuite指定了新的TLS密钥交换算法,也会指定证书格式和要求的密钥编码方法。

    6. handshake — Server Key Exchange

    服务器会在 server Certificate 消息之后,立即发送 Server Key Exchange消息。 (如果协商出的CipherSuite不需要做认证,即anonymous negotiation,会在ServerHello之后立即发送Server Key Exchange消息)

    只有在server Certificate 消息没有足够的信息,不能让客户端完成premaster的密钥交换时,服务器才发送 server Key Exchange, 主要是对前向安全的几种密钥协商算法,列表如下:

    1. DHE_DSS
    2. DHE_RSA
    3. DH_anon
    4. ECDHE_ECDSA
    5. ECDHE_RSA
    6. ECDH_anon

    对下面几种密钥交换方法,发送ServerKeyExchange消息是非法的:

    1. RSA
    2. DH_DSS
    3. DH_RSA
    4. ECDH_ECDSA
    5. ECDH_RSA

    需要注意的是,ECDH和ECDSA公钥的数据结构是一样的。所以,CA在签署一个证书的时候,可能要使用 X.509 v3 的 keyUsage 和 extendedKeyUsage 扩展来限定ECC公钥的使用方式。

    ServerKeyExchange传递足够的信息给客户端,来让客户端交换premaster secret。一般要传递的是:一个 Diffie-Hellman 公钥,或者一个其他算法(例如RSA)的公钥。

    在TLS实际部署中,我们一般只使用这4种:ECDHE_RSA, DHE_RSA, ECDHE_ECDSA,RSA

    其中RSA密钥协商(也可以叫密钥传输)算法,由于没有前向安全性,在TLS 1.3里面已经被废除了。参见: Confirming Consensus on removing RSA key Transport from TLS 1.3

    消息格式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    
      enum { dhe_dss, dhe_rsa, dh_anon, rsa, dh_dss, dh_rsa,    ec_diffie_hellman
           } KeyExchangeAlgorithm;
    
      struct {
          opaque dh_p<1..2^16-1>;
          opaque dh_g<1..2^16-1>;
          opaque dh_Ys<1..2^16-1>;
      } ServerDHParams;     /* Ephemeral DH parameters */
    
      dh_p
         Diffie-Hellman密钥协商计算的大质数模数。
    
      dh_g
         Diffie-Hellman 的生成元,
    
      dh_Ys
         服务器的Diffie-Hellman公钥 (g^X mod p).
    
        struct {
            opaque point <1..2^8-1>;
        } ECPoint;
    
    
        enum { explicit_prime (1), explicit_char2 (2),
               named_curve (3), reserved(248..255) } ECCurveType;
    
        struct {
            ECCurveType    curve_type;
            select (curve_type) {
                case named_curve:
                    NamedCurve namedcurve;
            };
        } ECParameters;
    
    
        struct {
            ECParameters    curve_params;
            ECPoint         public; //ECDH的公钥
        } ServerECDHParams;
    
    
      struct {
          select (KeyExchangeAlgorithm) {
              case dh_anon:
                  ServerDHParams params;
              case dhe_dss:
              case dhe_rsa:
                  ServerDHParams params;
                  digitally-signed struct {
                      opaque client_random[32];
                      opaque server_random[32];
                      ServerDHParams params;
                  } signed_params;
              case ec_diffie_hellman:
                  ServerECDHParams    params;
                  Signature           signed_params;
              case rsa:
              case dh_dss:
              case dh_rsa:
                  struct {} ;
              /* message is omitted for rsa, dh_dss, and dh_rsa */
              /* may be extended, e.g., for ECDH -- see [TLSECC] */
          };
      } ServerKeyExchange;
    
      params
         服务器的密钥交换参数。
    
      signed_params
         对需要认证的(即非anonymous的)密钥交换,对服务器的密钥交换参数的数字签名。
    

    ECParameters 结构比较麻烦,其中ECCurveType是支持3种曲线类型的,可以自行指定椭圆曲线的多项式系数,基点等参数。但是,我们基本不会用到这种功能,因为一般部署都是使用 NamedCurve,即参数已经预先选定,各种密码学库普遍都支持的一组曲线,其中目前用的最广的是 secp256r1 (还被称为 P256,或 prime256v1)

    NamedCurve 列表中比较重要的曲线(在TLS1.3中,只保留了这几条曲线。),定义如下:

    1
    2
    3
    4
    5
    6
    
        enum {
            ...
            secp256r1 (23), secp384r1 (24), secp521r1 (25),
            reserved (0xFE00..0xFEFF),
            (0xFFFF)
        } NamedCurve;
    

    ECDHE_RSA 密钥交换算法的 SignatureAlgorithm 是 rsa 。 ECDHE_RSA 密钥交换算法的 SignatureAlgorithm 是 ecdsa。

    如果客户端提供了 “signature_algorithms” 扩展, 则签名算法和hash算法必须是列在扩展中的算法。 要注意的是,这个地方可能有不一致,例如客户端可能提供了 DHE_DSS 密钥交换,但是 “signature_algorithms”扩展中没有DSA算法,在这类情况下,为了正确地协商,服务器必须确保满足自己选择的CipherSuite满足 “signature_algorithms” 的限制。这不优雅,但是是为了把对原来的CipherSuite协商的设计的改动减到最小,而做的妥协。

    并且,hash和签名算法,必须和服务器的证书里面的公钥兼容。

    7. handshake — Certificate Request

    TLS规定了一个可选功能:服务器可以认证客户端的身份,这通过服务器要求客户端发送一个证书实现,服务器应该在ServerKeyExchange之后立即发送CertificateRequest消息。

    消息结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
      enum {
          rsa_sign(1), dss_sign(2), rsa_fixed_dh(3),dss_fixed_dh(4),
          rsa_ephemeral_dh_RESERVED(5),dss_ephemeral_dh_RESERVED(6),
          fortezza_dms_RESERVED(20),
          ecdsa_sign(64), rsa_fixed_ecdh(65),
          ecdsa_fixed_ecdh(66),
          (255)
      } ClientCertificateType;
    
      opaque DistinguishedName<1..2^16-1>;
    
      struct {
          ClientCertificateType certificate_types<1..2^8-1>;
          SignatureAndHashAlgorithm
            supported_signature_algorithms<2^16-1>;
          DistinguishedName certificate_authorities<0..2^16-1>;
      } CertificateRequest;
    

    certificate_types : 客户端可以提供的证书类型。

    • rsa_sign 包含RSA公钥的证书。
    • dss_sign 包含DSA公钥的证书。
    • rsa_fixed_dh 包含静态DH公钥的证书。
    • dss_fixed_dh 包含静态DH公钥的证书。

      supported_signature_algorithms : 服务器支持的 hash/signature 算法的列表。

      certificate_authorities : 服务器可以接受的CA(certificate_authorities)的 distinguished names 的列表 DER编码格式.

    这些 distinguished names 可能为root CA或者次级CA指定了想要的 distinguished name ,因此,这个消息可以用来描述已知的root,或者希望的授权空间。 如果 certificate_authorities 列表是空的,那么客户端可以发送任何适当的 ClientCertificateType 类型的证书,如果没有别的限制的话。

    certificate_types 和 supported_signature_algorithms 字段的交叉选择很复杂。 certificate_types 这个字段从SSLv3时代就定义了,但是一直都没有详细定义,其大多数功能都被 supported_signature_algorithms 代替了。 有如下规则:

    • 客户端提供的任何证书,必须用一个supported_signature_algorithms 中出现过的 hash/signature 算法对 签名.

    • 客户端提供的末端证书必须提供一个和 certificate_types 兼容的key。 如果这个key是一个签名key,那必须能和 supported_signature_algorithms 中提供的某个 hash/signature 算法对配合使用。

    • 由于历史原因,某些客户端证书类型的名字,包含了证书的签名算法,例如,早期版本的TLS中, rsa_fixed_dh 意思是一个被RSA算法签署,并且包含一个固定DH密钥的证书。在TLS1.2中,这个功能被 supported_signature_algorithms 淘汰,并且证书类型不再限制用来签署证书的算法。例如,如果服务器发送了 dss_fixed_dh 证书类型,和 { {sha1, dsa}, {sha1,rsa} } 签名类型,客户端可以回复一个 包含静态DH密钥,用RSA-sha1签署的证书。

    • 如果协商出来的是匿名CipherSuite,服务器不能要求客户端认证。

    8. handshake — Server Hello Done

    在 ServerHello和相关消息已经处理结束后,服务器发送ServerHelloDone。在发送ServerHelloDone后,服务器开始等待客户端的响应。

    ServerHelloDone消息表示,服务器已经发送完了密钥协商需要的消息,并且客户端可以开始客户端的密钥协商处理了。

    收到ServerHelloDone后,客户端应该确认服务器提供了合法的证书,并且确认服务器的ServerHello消息里面的参数是可以接受的。

    消息格式:

    1
    
      struct { } ServerHelloDone;
    

    9. handshake — Client Certificate

    ClientCertificate消息是客户端收到ServerHelloDone后,可以发送的第一条消息。仅当服务器要求了一个证书的情况下,客户端才发送ClientCertificate消息,如果没有可用的合适证书,客户端必须发送一条不包含任何证书的ClientCertificate消息(即 certificate_list 结构长度为0)。

    如果客户端没有发送任何证书,服务器自行决定,可以放弃要求客户端认证,继续握手;或者发送一条 fatal handshake_failure的alert消息,断开连接。并且,如果证书链的某些方面是不能接受的(比如证书没有被可信任的CA签署),服务器可以自行决定,是继续握手(放弃要求客户端认证),或者发送一条fatal的alert。

    客户端证书使用和ServerCertificate相同的结构发送。

    ClientCertificate把客户端的证书链发送给服务器。服务器会使用证书链来验证CertificateVerify 消息(如果使用基于签名的客户端认证),或者来计算premaster secret(对于非短暂的 DH)。证书必须和协商出来的CipherSuite的密钥交换算法配套,并和任何协商的扩展配套。

    尤其是:

    • 证书必须是X.509v3 类型的。
    • 客户端的末级证书的公钥必须和CertificateRequest里列出的证书类型兼容。
      客户端证书类型 证书公钥类型
      rsa_sign RSA公钥;证书必须允许公钥用于certificateVerify消息中的数字签名和hash算法 |
      dss_sign DSA 公钥;证书必须允许密钥使用CertificateVerify中的hahs函数做签名;|
      ecdsa_sign 可以用作 ECDSA 的公钥;证书必须允许 公钥用 CertificateVerify中的hash函数做签名;公钥必须使用服务器支持的曲线,和点格式;|
      rsa_fixed_dh / dss_fixed_dh Diffie-Hellman 公钥; 必须使用和服务器key相同的参数。|
      rsa_fixed_ecdh / ecdsa_fixed_ecdh 可以用作 ECDH 的公钥。必须和服务器的公钥使用同样的曲线,同样的点格式|
    • 如果 certificate_authorities 列表不是空的,客户端证书链中的某一个证书必须是CA中的某一个签署的。
    • 证书必须使用 服务器可以接受的 hash/signature 算法对。

    类似于Server Certificate,有一些证书目前无法在TLS中使用。

    10. handshake — Client Key Exchange

    客户端必须在客户端的Certificate消息之后,立即发送ClientKeyExchange消息。 或者必须在ServerHelloDone后立即发送ClientKeyExchange消息。

    ClientKeyExchange消息中,会设置premaster secret,通过发送 RSA公钥加密premaster secret的密文,或者发送允许双方得出相同的premaster secret的Diffie-Hellman参数。

    当客户端使用短暂的 Diffie-Hellman 密钥对时,ClientKeyExchange包含客户端的 Diffie-Hellman 公钥。如果客户端发送一个包含静态 Diffie-Hellman 指数的证书(比如,在使用固定DH的客户端认证),那么这条消息必须被发送,并且必须为空。

    消息结构: 消息的选择取决于选择的密钥交换算法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      struct {
          select (KeyExchangeAlgorithm) {
              case rsa:
                  EncryptedPreMasterSecret;
              case dhe_dss:
              case dhe_rsa:
              case dh_dss:
              case dh_rsa:
              case dh_anon:
                  ClientDiffieHellmanPublic;
              case ec_diffie_hellman:
                  ClientECDiffieHellmanPublic;
          } exchange_keys;
      } ClientKeyExchange;
    

    (1). RSA 加密的 Premaster Secret 消息

    如果用RSA做密钥协商和认证,客户端生成 48字节的 premaster secret,使用服务器证书里面的公钥加密,然后把密文EncryptedPreMasterSecret发送给服务器,结构定义如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
      struct {
          ProtocolVersion client_version;
          opaque random[46];
      } PreMasterSecret;
    
      client_version
         客户端支持的最新协议版本号,这个字段用来检测中间人版本回退攻击。T
      random
         46 字节的,安全生成的随机值。
    
      struct {
          public-key-encrypted PreMasterSecret pre_master_secret;
      } EncryptedPreMasterSecret;
    
      pre_master_secret
         这个随机值由客户端生成,用于生成master secret
    

    注:PreMasterSecret里面的 client_version 是 ClientHello.client_version,而不是协商的到的版本号,这个特性用来阻止版本回退攻击。不幸的是,有些不正确的老的代码使用了协商得到的版本号,导致检查client_version字段的时候,和正确的实现无法互通。

    客户端实现必须在PreMasterSecret中发送正确的版本号。如果 ClientHello.client_version 的版本号是 TLS 1.1 或者更高,服务器实现必须如下检查版本号。如果版本号是 TLS 1.0 或者更早,服务器必须检查版本号,但是可以通过配置项关闭检查。

    要注意的是,如果版本号检查失败了,PreMasterSecret 应该像下面描述的那样填充成随机数。

    TLS中的RSA使用的是 PKCS1-V1.5 填充( PKCS1-V1.5也是openssl库RSA的默认填充方式)。Bleichenbacher 在1998年发表了一种针对 PKCS1-V1.5 的选择密文攻击, Klima在2003年发现 PKCS1-V1.5 中 PreMasterSecret 版本号检查的一个侧通道攻击。只要TLS 服务器暴露一条特定的消息是否符合PKCS1-V1.5格式,或暴露PreMasterSecret解密后结构是否合法,或版本号是否合法,就可以用上面2种方法攻击。

    Klima 还提出了完全避免这类攻击的方法:对格式不正确的消息,版本号不符的情况,要做出和完全正确的RSA块一样的响应,要让客户端区分不出这3种情况。 具体地说,要如下:

    1. 生成 46 字节的密码学安全随机值 R
    2. 解密消息,获得明文 M
    3. 如果 PKCS#1 填充不正确,或者 PreMasterSecret 消息的长度不是48字节,则 pre_master_secret = ClientHello.client_version || R 或者如果 ClientHello.client_version <= TLS 1.0,并且明确禁止了版本号检查,则 pre_master_secret = ClientHello.client_version || M[2..47]

    注意:明确地用 ClientHello.client_version 构造 pre_master_secret 时,当客户端在原来的 pre_master_secret 中发送了错误的 客户端版本值时,会产生一个不合法的 master_secret 。

    另一种解决问题的方法是,把版本号不符,当成 PKCS-1 格式错误来对待,并且完全随机填充 premaster secret。

    1. 生成 48 字节的密码学安全随机值 R
    2. 解密 PreMasterSecret 恢复出明文 M
    3. 如果 PKCS#1 填充不正确,或者消息的长度不是48字节,则 pre_master_secret = R 或者如果 ClientHello.client_version <= TLS 1.0,并且 明确禁止了版本号检查,则 pre_master_secret = M 或者如果 M[0..1] != CleintHello.client_version pre_master_secret = R 或者 pre_master_secret = M

    尽管实践中,还没有发现针对这种结构的攻击,Klima 在论文中描述了几种理论上的攻击方式,因此推荐上述的第一种结构。

    在任何情况下,一个 TLS 服务器绝对不能在:1. 处理 RSA 加密的 premaster 消息失败, 2.或者版本号检查失败 时产生alert消息。当遇到这两种情况时,服务器必须用随机生成的 premaster 值继续握手。服务器可以把造成失败的真实原因log下来,用于调查问题,但是必须小心确保不能把这种信息泄漏给攻击者(比如通过时间侧通道,log文件,或者其它通道等泄漏)。

    RSAES-OAEP 加密体制,更能抵抗 Bleichenbacher 发表的攻击,然而,为了和早期的TLS版本最大程度保持兼容,TLS 仍然规定使用 RSAES-PKCS1-v1_5 体制。只要遵守了上面列出的建议,目前还没有 Bleichenbacher 的变化形式能攻破 TLS 。

    实现的时候要注意:公钥加密的数据用 字节数组 <0..216-1> 的形式表示。因此,ClientKeyExchange中的 RSA加密的PreMasterSecret 前面有2个字节用来表示长度。这2个字节在使用RSA做密钥协商时,是冗余的,因为此时 EncryptedPreMasterSecret 是 ClientKeyExchange 中的唯一字段,因此可以无歧义地得出 EncryptedPreMasterSecret 的长度。因此更早的 SSLv3 规范没有明确规定 public-key-encrypted 数据的编码格式,因此有一些SSLv3的实现没有包含 长度字段,这些实现直接把 RSA 加密的数据放入了 ClientKeyExchange消息里面。 TLS规范要求 EncryptedPreMasterSecret 字段包含长度字段。因此得出的结果会和一些 SSLv3 的实现不兼容。实现者从 SSLv3 升级到 TLS 时,必须修改自己的实现,以接受并且生成带长度的格式。如果一个实现要同时兼容 SSLv3 和 TLS,那就应该根据协议版本确定自己的行为。

    注意:根据 Boneh 等在2003年USENIX Security Symposium上发表的论文 “Remote timing attacks are practical”,针对 TLS RSA密钥交换的远程时间侧通道攻击,是实际可行的,起码当客户端和服务器在同一个LAN里时是可行的。因此,使用静态 RSA 密钥的实现,必须使用 RSA blinding,或者Boneh论文中提到的,其他抵抗时间侧通道攻击的技术。

    openssl中的RSA blinding,参见:http://linux.die.net/man/3/rsa_blinding_on

    (2). 客户端 Diffie-Hellman 公钥

    这条消息把客户端的 Diffie-Hellman 公钥 ( Yc ) 发送给服务器。

    Yc的编码方式由 PublicValueEncoding 决定。

    消息的结构:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
      enum { implicit, explicit } PublicValueEncoding;
    
      implicit
         如果客户端已经发送了一个包含合适的 DH 公钥的证书(即 fixed_dh 客户端认证方式),那么Yc已经隐式包含了,不需要再发送。这种情况下,ClientKeyExchange消息必须发送,并且必须是空的。
    
      explicit
         表示Yc需要发送。
    
      struct {
          select (PublicValueEncoding) {
              case implicit: struct { };
              case explicit: opaque dh_Yc<1..2^16-1>;
          } dh_public;
      } ClientDiffieHellmanPublic;
    
      dh_Yc
         客户端的 Diffie-Hellman 公钥 Yc.
    
    

    (3). 客户端 EC Diffie-Hellman 公钥

    1
    2
    3
    4
    5
    6