Certificate authority (Wiki)



https://en.wikipedia.org/wiki/Certificate_authority
本文完全机器翻译,未经人工润色。

在密码学中,证书颁发机构或证书颁发机构(CA)是颁发数字证书的实体。数字证书由证书的指定主体证明公钥的所有权。这允许其他人(依赖方)依赖签名或对与经认证的公钥相对应的私钥所做的断言。CA充当受信任的第三方-由证书的主体(所有者)和依赖证书的一方信任。这些证书的格式由X.509标准指定。

证书颁发机构的一个特别常见的用途是对用于万维网的安全浏览协议HTTPS中使用的证书进行签名。另一个常见用途是由各国政府签发身份证,用于电子签字文件。

概述。
可信证书可用于通过Internet创建到服务器的安全连接。证书是必不可少的,这样才能绕过恰好在到达目标服务器的路径上的恶意方,因为目标服务器的行为就好像它是目标。这种情况通常被称为中间人攻击.。在启动安全连接之前,客户端使用CA证书对服务器证书上的CA签名进行身份验证,作为授权的一部分。通常,客户端软件(例如浏览器)包含一组受信任的CA证书。这是有道理的,因为许多用户需要信任他们的客户端软件。恶意的或受损的客户端可以跳过任何安全检查,仍然欺骗其用户相信否则。

CA的客户端是服务器监控器,它们调用其服务器将授予用户的证书。商业CA负责颁发证书,他们的客户期望CA的证书包含在大多数Web浏览器中,以便与认证服务器的安全连接能够开箱即用。信任特定证书颁发机构的Internet浏览器、其他设备和应用程序的数量称为无处不在。Mozilla是一家非营利性企业,它的产品发布了几个商业CA证书。[1]虽然Mozilla制定了自己的策略,但CA/Browser论坛也为CA信任制定了类似的指导方针。单个CA证书可以在多个CA或其转售商之间共享。根CA证书可能是颁发具有不同验证要求的多个中间CA证书的基础。

除了商业CA,一些非营利组织免费向公众发放数字证书;著名的例子是CACERT和Let’s Encrypt。

大型组织或政府机构可能有自己的PKI(公钥基础设施),每个PKI都包含自己的CA。任何使用自签名证书的站点都充当自己的CA。

浏览器和其他类型的客户机的特点是允许用户随意添加或删除CA证书。虽然服务器证书通常持续的时间相对较短,但CA证书会进一步扩展,[2]因此,对于反复访问的服务器来说,导入和信任颁发的CA是不太容易出错的,而不是每次更新服务器证书时都确认安全豁免。

较少情况下,可信任证书用于加密或签名消息。CA还提供最终用户证书,可以与S/MIME一起使用。然而,加密需要接收方的公钥,而且由于加密消息的作者和接收方显然相互了解,受信任的第三方的有用性仍然局限于对发送到公共邮件列表的消息进行签名验证。

提供者。
在世界范围内,证书颁发机构的业务是零散的,由国家或区域供应商主导其国内市场。这是因为数字证书的许多用途,例如具有法律约束力的数字签名,都与当地法律、法规和证书颁发机构的认证计划相联系。

然而,全球可信任的TLS/SSL服务器证书市场主要由少数跨国公司持有。由于技术要求,这一市场有很大的进入障碍。[3]虽然没有法律要求,但新的供应商可选择每年进行安全审计(例如北美证书颁发机构的WebTrust[4]和欧洲的ETSI[5]),以作为受信任的根列入网络浏览器或操作系统。Mozilla Firefox Web浏览器中有180多个根证书,代表了大约80个组织。[6]OSX信任200多个根证书。截至Android4.2(JellyBean),Android目前包含100多个CA,每个版本都会更新这些CA。

在2014年11月18日,包括电子前沿基金会、Mozilla、思科和Akamai在内的一些公司和非营利组织宣布,让我们加密吧,这是一个非营利认证机构,它提供免费的域验证X.509证书和软件,以便安装和维护证书。[8]让我们加密是由新成立的互联网安全研究小组(Internet Security Research Group)运营的,这是加州的一个非营利组织,根据第501(C)(3)条被认定为免税的。

根据监控活跃tls证书的行业标准netcraft 2015所述,“尽管全球(Tls)生态系统具有竞争力,但它由少数几个主要cas主导–三个证书颁发机构(赛门铁克(Symantec)、科莫多(Comodo)、高爸爸(Godp))占所有在面向公众的web服务器上颁发的证书总数的四分之三。自[我们]调查开始以来,赛门铁克(或赛门铁克收购它之前)一直占据榜首,目前它只占所有证书的不到三分之一。为了说明不同方法的影响,在百万个最繁忙的站点中,赛门铁克颁发了44%的有效、可信的证书–大大高于其整体市场份额。“[10]

验证标准。
为HTTPS服务器颁发大量证书的商业CA通常使用一种称为“域验证”的技术对证书的接收者进行身份验证。用于域验证的技术因CA而异,但在一般情况下,域验证技术旨在证明证书申请者控制给定的域名,而不是关于申请者身份的任何信息。

许多证书颁发机构还提供扩展验证(EV)证书,作为域验证证书的一种更严格的替代方法。扩展验证不仅用于验证对域名的控制,而且用于验证证书中包含的其他标识信息。有些浏览器在地址栏中的绿色框中显示此附加标识信息。EV作为域验证弱点的解决方案的一个限制是,攻击者仍然可以获得受害者域的域验证证书,并在攻击期间部署该证书;如果发生这种情况,受害者用户可以观察到的区别是没有带有公司名称的绿色条。至于用户是否会意识到这种缺失是否意味着攻击正在进行,存在一些问题:在2009使用InternetExplorer 7进行的测试显示,用户没有注意到IE7的EV警告,但是微软目前的浏览器边缘(Edge)显示,EV和域验证证书之间的差别要大得多,域验证证书有一个空心的灰色锁。

验证弱点。
域验证受到某些结构安全限制。特别是,它总是容易受到允许对手观察CA发送的域验证探测的攻击。这些攻击可能包括对DNS、TCP或BGP协议的攻击(这些协议缺乏TLS/SSL的加密保护),或路由器的危害。这种攻击可能发生在CA附近的网络上,也可能发生在受害者域本身附近。

最常见的域验证技术之一是发送包含身份验证令牌或链接的电子邮件,该电子邮件地址可能在管理上负责该域。这可能是域名WHOIS条目中列出的技术联系人电子邮件地址,也可能是管理员@、管理员@、网站管理员@、主机主@或邮政主管@该域之类的管理电子邮件。[14][15]一些证书颁发机构可能会接受使用root@、[引文所需]info@或域内支持@的确认。[16]域验证背后的理论是,只有域的合法所有者才能读取发送到这些管理地址的电子邮件。

域验证实现有时是安全漏洞的来源。在一个例子中,安全研究人员表明,攻击者可以获得Web邮件站点的证书,因为CA愿意使用诸如ssladmin@domain.com之类的电子邮件地址来访问domain.com,但并非所有的Webmail系统都保留了“ssladmin”用户名,以防止攻击者注册它。

在2011之前,没有可用于域验证的标准电子邮件地址列表,因此电子邮件管理员不清楚哪些地址需要保留。第一个版本的CA/浏览器论坛基线要求,通过了11月2011,指定了一个名单这样的地址。这允许邮件主机保留这些地址以供管理使用,尽管此类预防措施尚未普及。在2015,一名芬兰男子在微软Live.fi的芬兰版上注册了用户名“主机”,并获得了一个经过域名验证的live.fi证书,尽管他并不是该域名的所有者。

签发证书。

CA颁发包含公钥和所有者身份的数字证书。匹配的私钥不是公开可用的,而是由生成密钥对的最终用户保密。证书也是CA确认或确认证书中包含的公钥属于证书中所述人员、组织、服务器或其他实体的证书。CA在此类方案中的义务是验证申请者的凭据,以便用户和依赖方可以信任CA证书中的信息。CA使用各种标准和测试来实现这一点。本质上,证书颁发机构负责说“是的,这个人就是他们所说的那个人,我们CA证明了这一点”。

如果用户信任CA并能够验证CA的签名,那么他们还可以假定某个公钥确实属于证书中标识的任何人。

例子。
公钥密码可以用来加密双方之间通信的数据.。当用户登录到实现HTTP安全协议的任何站点时,通常会发生这种情况。在这个示例中,让我们假设用户登录了他们银行的主页www.bank.examplesto做在线银行业务。当用户打开www.bank.examplesPage时,他们会收到一个公钥以及他们的web浏览器显示的所有数据。公钥可用于将数据从客户端加密到服务器,但安全过程是将其用于确定临时共享对称加密密钥的协议中;这种密钥交换协议中的消息可以用银行的公钥加密,只有银行服务器具有读取它们的私钥。

接下来的通信使用新的(一次性)对称密钥,因此当用户向银行页面输入一些信息并提交页面(将信息发送回银行)时,用户输入到页面的数据将由他们的Web浏览器加密。因此,即使有人能够访问(加密)从用户传输到www.bank.example的数据,这种窃听者也无法读取或解密它。

只有当用户能够确定他们在Web浏览器中看到的是银行时,这种机制才是安全的。例如,如果用户键入www.bank.example,但是他们的通信被劫持,并且一个假网站(假装是银行网站)将页面信息发送回用户的浏览器,则该虚假网页可以向用户发送假公钥(对于该用户,虚假站点拥有一个匹配的私钥)。使用者会以个人资料填写表格,并提交网页。然后,伪造的网页就可以访问用户的数据了。

这是证书颁发机构机制要防止的。证书颁发机构(CA)是存储公钥及其所有者的组织,通信中的每一方都信任该组织(并知道其公钥)。当用户的Web浏览器从www.bank.example接收公钥时,它还会接收密钥的数字签名(在所谓的X.509证书中提供更多信息)。浏览器已经拥有CA的公钥,因此可以验证签名、信任证书和证书中的公钥:由于www.bank.example使用了由验证局认证的公钥,所以一个伪造的www.bank.example只能使用相同的公钥。由于伪造的www.bank.example不知道相应的私钥,因此无法创建验证其真实性所需的签名。

安全。
在向CA(可能是通过电子网络)提供数据时,以及在同样提供请求证书的人员/公司/程序的凭据时,很难确保数据与实体之间匹配的正确性。这就是商业CA通常使用多种身份验证技术的原因,包括利用政府局、支付基础设施、第三方数据库和服务以及自定义启发式。在一些企业系统中,本地形式的身份验证(如Kerberos)可用于获取证书,而外部依赖方又可以使用证书。在某些情况下,公证员必须亲自了解签名被公证的当事人;这比许多核证机关达到的标准要高。根据美国律师协会(American Bar Association)的“在线交易管理纲要”(Outline On Online Transaction Management),美国联邦和州有关数字签名的法规的主要要点一直是“防止地方法规的冲突和过于繁琐,并确定电子文字符合与纸质文件相关的传统要求”。此外,美国电子签字法规和建议的欧洲自由贸易联盟守则[20]有助于确保:

与此种交易有关的签字、合同或其他记录不得仅仅因为是电子形式而被否定其法律效力、有效性或可执行性;以及。
与此种交易有关的合同不得仅仅因为在其形成过程中使用了电子签字或电子记录而被否定其法律效力、有效性或可执行性。
尽管采取了安全措施来正确核实个人和公司的身份,但有一个单一的CA向冒充者颁发假证书的风险。还可以用相同或非常相似的名称对个人和公司进行登记,这可能导致混淆。为了尽量减少这种危险,证书透明度倡议提议审计公共不可伪造日志中的所有证书,这有助于防止网络钓鱼。[21][22]。

在大规模部署中,alice可能不熟悉Bob的证书颁发机构(可能每个证书都有一个不同的CA服务器),因此Bob的证书还可能包括由不同的CA 2签名的CA的公钥,据推测,Alice可以识别该公钥。此过程通常导致CA和CA证书的层次结构或网格。

权限撤销列表。
授权撤销列表(ARL)是包含颁发给证书颁发机构的证书的证书吊销列表(CRL)的一种形式,与包含已吊销的最终实体证书的CRLS相反。

行业组织。
证书权威安全委员会(CASC)-在2013 2月,CASC成立作为一个行业倡导组织,致力于解决行业问题和教育公众的互联网安全。创始成员是七个最大的证书颁发机构。[23][24]。
通用计算安全标准论坛(CCSF)-在2009成立的共同计算安全标准论坛是为了促进保护最终用户的行业标准。科莫多集团首席执行官MelihAbdulhayoğLu被认为是CCSF的创始人。
CA/Browser论坛-2005成立了一个由证书颁发机构和Web浏览器供应商组成的新联盟,以促进行业标准和互联网安全的基线要求。科莫多集团首席执行官MelihAbdulhayoğLu组织了第一次会议,并被认为是CA/Browser论坛的创始人。[26][27]。
基线要求。
CA /浏览器论坛发布基线要求,[28] CA遵循的政策和技术要求清单。这些是包含在Firefox[29]和Safari的证书存储中的要求。

CA折衷。
如果CA可以被颠覆,那么整个系统的安全性就会丢失,可能会颠覆所有信任受损CA的实体。

例如,假设攻击者EVE成功地获得了一个CA来向她发出一个声称代表Alice的证书。也就是说,证书将公开声明它代表Alice,并且可能包括关于Alice的其他信息。关于Alice的一些信息,比如她的雇主的名字,可能是真的,从而提高了证书的可信度。然而,EVE将拥有与证书相关联的所有重要的私钥。然后,伊芙可以用这个证书向鲍勃发送经过数字签名的电子邮件,诱使鲍勃相信这封电子邮件来自爱丽丝。鲍勃甚至可能用加密的电子邮件来回应,他相信只有爱丽丝才能阅读,而伊芙实际上能够用私钥解密它。

一个像这样的CA颠覆的著名案例发生在2001,当时证书颁发机构威瑞信给一个声称代表微软的人颁发了两份证书。这些证书的名称是“微软公司”,因此它们可以被用来欺骗某人,使他们相信微软软件的更新来自微软,而实际上并不是这样。这个骗局是在2001年初被发现的。微软和威瑞信采取措施限制问题的影响。[31][32]。

在2011份来自科莫多和DigiNotar的欺诈性证书中,[33][34]据称是由伊朗黑客取得的。有证据表明,伪造的DigiNotar证书是在伊朗的一次中间人攻击中使用的。

在2012,人们知道信任波发布了一个从属根证书,用于透明的流量管理(中间人),它实际上允许企业使用从属证书嗅探ssl内部网络流量。

密钥存储。
盗取证书颁发机构私钥的攻击者能够伪造证书,就好像它们是CA一样,而无需持续访问CA的系统。因此,密钥盗窃是证书颁发机构防范的主要风险之一。公开信任的CA几乎总是将其密钥存储在硬件安全模块(HSM)上,该模块允许它们使用密钥对证书进行签名,但通常会阻止使用物理和软件控件提取密钥。CA通常采取进一步的预防措施,将其长期根证书的密钥保存在离线的HSM中,除非需要对较短的中间证书进行签名。存储在在线HSM中的中间证书可以做签署最终实体证书和保持吊销信息最新的日常工作。

CA有时在生成签名密钥时使用密钥仪式,以确保密钥不会被篡改或复制。

可信第三方方案的实现弱点。
当前X.509方案实现方式中的关键弱点是,由特定方信任的任何CA都可以为其选择的任何域颁发证书。这些证书将被信任方接受为有效,不管它们是否合法和授权。[37]这是一个严重的缺点,因为使用X.509和受信任的第三方的最常见技术是https协议。由于所有主要的web浏览器都被分发给他们的最终用户,预先配置了数十个可信CA的列表,这意味着这些预先批准的可信CA中的任何一个都可以为任何域颁发有效的证书。[38]业界对此的反应已经减弱。[39]考虑到浏览器预配置的可信CA列表的内容是由分发或分发的一方独立确定的,因此业界对此的反应是低调的。[39]考虑到浏览器的预配置可信CA列表的内容是由分发方独立确定的,因此,这意味着任何一个预先批准的可信CA都可以为任何域颁发有效证书。导致安装浏览器应用程序时,CA本身实际上什么也做不了。

这个问题是基于DNS的命名实体身份验证(DANE)协议发展的推动力。如果与域名系统安全扩展(DNSSEC)一起采用,DANE将大大减少(甚至完全消除)可信第三方在域的PKI中的角色。

软件。
可以使用各种软件来操作证书颁发机构。一般来说,需要这样的软件来签署证书、维护撤销信息和操作OCSP或CRL服务。一些例子是:
DogTag[40]
EJBCA
gnoMint
OpenCA
OpenSSL, an SSL/TLS library that comes with tools allowing its use as a simple certificate authority
EasyRSA, OpenVPN’s command line CA utilities using OpenSSL.
r509[41]
TinyCA, which is a perl gui on top of some CPAN modules.
XCA[42]
XiPKI,[43] CA and OCSP responder. With SHA3 support, OSGi-based (Java).
Boulder is an automated server that uses the Automated Certificate Management Environment[44] (ACME) protocol.
Windows Server contains a CA as part of Certificate Services for the creation of digital certificates. In Windows Server 2008 and later the CA may be installed as part of Active Directory Certificate Services.
OpenXPKI

Sunday, April 22, 2018 by blast

Certificate Attributes(Oracle)



https://docs.oracle.com/cd/E24191_01/common/tutorials/authz_cert_attributes.html

概述
企业网关可以根据经过身份验证的客户端证书的X.509属性授权对Web服务的访问。
例如,一个简单的Certificate Attributes筛选器可能只授权证书有一个特殊名称(DName)的客户端,该名称包含以下属性:O=Oracle。
换句话说,只有“Oracle”用户有权访问Web服务。

X.509证书由多个字段组成,Subject字段是与本教程最相关的字段之一。它提供证书所属客户端的DName。DName 是X.500目录对象的唯一名称。它由一些称为相对区别名(Relative Distinguished Name,RDN)的属性值——对组成。

下面是一些最常见的RDN及其解释:
CN: CommonName
OU: OrganizationalUnit
O: Organization
L: Locality
S: StateOrProvinceName
C: CountryName

例如,以下是 Enterprise Gateway 提供的sample.p12客户端证书的DName :

CN=Sample Cert, OU=R&D, O=Company Ltd., L=Dublin 4, S=Dublin, C=IE

使用证书属性筛选器,可以基于例如DName 中的“CN”、“OU”或“C”属性来授权客户端。

———

配置
X.509属性表列出了许多针对客户端证书运行的属性检查。
对于每个条目来说,测试证书属性的方式是:只有当所有配置的属性值与客户端证书中的属性值匹配时,检查才会通过。

因此,实际上,在单次属性检查中列出的属性会被同时进行AND检查。

例如,假设以下内容被配置为X.509属性表中的一个条目:

OU=Eng, O=Company Ltd

如果企业网关收到具有以下DNAME的证书,此属性检查将通过,因为所有配置的属性都与证书DNAME中的属性匹配:

CN=User1, OU=Eng, O=Company Ltd, L=D4, S=Dublin, C=IE
CN=User2, OU=Eng, O=Company Ltd, L=D2, S=Dublin, C=IE

但是,如果企业网关收到带有以下DNAME的证书,属性检查将失败,因为DNAME中的属性与所有配置的属性不匹配(即“OU”属性有错误的值):
CN=User1, OU=qa, O=Company Ltd, L=D4, S=Dublin, C=IE

X.509属性表可以包含多个属性检查项。在这种情况下,属性检查(即表中的条目)一起以OR条件执行判断,因此如果任何检查成功,则整个证书属性筛选器都会成功。

总结一下:
- 只有当所有配置的属性值与客户端证书的DNAME中的属性值匹配时,属性检查才会成功。
- 如果X.509属性表中列出的任何属性检查结果为成功,则筛选器将返回成功。

若要配置证书筛选器,请完成下列字段:
Name: 在此输入筛选器的名称。
X.509属性: 若要添加新的X.509属性检查,请单击“添加”按钮。

在AddX.509属性对话框中,输入一个逗号分隔的名称-值对列表,表示X.509属性及其值,例如“OU=dev,O=Company”。新的属性检查将出现在X.509属性表中。可以分别单击“编辑”和“删除”按钮编辑和删除现有条目。

by blast

Client Certificates vs. Server Certificates What’s the Difference?



https://www.websecurity.symantec.com/security-topics/client-certificates-vs-server-certificates
客户或用户身份。
对有些人来说,提及PKI或“客户证书”可能会让人联想到企业保护和完成客户在线交易的形象,然而,在我们的日常生活中,以各种方式都可以找到此类证书;当我们登录VPN时;在ATM上使用银行卡,或使用卡进入建筑物;例如在伦敦市中心使用的Oyster公共交通智能卡中。这些数码证书甚至出现在汽油泵、汽车装配线上的机器人上,甚至出现在我们的护照上。

在欧洲大陆和许多所谓的“新兴国家”,客户证书的使用尤其普遍,政府发放的身份证有多种用途,如缴纳地方税、电费和驾照。原因很简单–客户端证书在确保人们在线安全方面起着至关重要的作用。顾名思义,它们用于识别客户端或用户,向服务器验证客户端,并准确地确定客户端是谁。

客户或用户身份。
加密在传输过程中保护数据。
服务器证书或SSL证书执行与客户端证书非常相似的角色,除了客户端证书用于标识客户端/个人和前者对站点所有者进行身份验证。服务器证书通常颁发给主机名,主机名可以是机器名(如“XYZ-server-01”),也可以是域名(如“www.symantec.com”)。Web浏览器到达服务器,并验证SSL服务器证书的真实性。这告诉用户,他们与网站的互动没有窃听者,而网站正是它声称的样子。这种安全性对于电子商务至关重要,这就是为什么证书现在得到如此广泛的使用。

他们是怎么做到的?实际上,网站操作员通过向具有证书签名请求的证书提供程序申请证书来获得证书。这是一个包含所有基本信息的电子文档:网站名称、联系人电子邮件地址和公司信息。证书提供者在请求上签字,并出示一份公共证书,该证书提供给任何连接到该网站的网络浏览器,关键是向该网络浏览器证明,该供应商向他认为是该网站所有者的人签发了一份证书。但是,在签发证书之前,证书提供者将从公有域名注册机构请求该网站的联系人电子邮件地址,并根据证书请求中提供的电子邮件地址检查发布的地址,确保已关闭信任圈。

此外,您还可以配置网站,以便希望连接的任何用户都需要提供有效的客户端证书、有效的用户名和密码。这通常被称为“双因素认证” - 在这种情况下,“你知道的东西”(密码)和“你有的东西”(证书)。

对于那些在网络上进行交易的人来说,证书意味着匿名的结束,相反,它提供了一个你可以信任的人的保证,他们就是他们所说的那个人。在我们的安全不断受到挑战的网络世界中,这种保证是无价的。

Monday, April 9, 2018 by blast

Client Certificate Authentication (Part 1)



https://blogs.msdn.microsoft.com/kaushal/2015/05/27/client-certificate-authentication-part-1/

SSL/TLS证书通常用于双方的加密和身份验证。在这篇博文中,我将简要地描述客户端证书认证。

客户端证书身份验证是一种基于相互证书的身份验证,客户端向服务器提供其客户端证书以证明其身份。这是SSL握手的一部分(它是可选的)。

在我们继续之前,我们需要了解。

什么是客户证书?
什么是身份验证&为什么我们需要它?

客户证书
客户证书是一个证明X.509系统的数字证书。客户端系统使用它来向远程服务器证明其身份。下面是一个简单的方法来确定证书是否是客户端证书的位置:

在“详细信息”选项卡中,预期用途的证书具有以下文本:
“向远程计算机证明您的身份”
验证证书的增强型密钥用法字段是否将OID设置为(1.3.6.1.5.5.7.3.2)。
以下是客户端证书示例的屏幕截图:

3173.060215_0710_ClientCerti1.png

请参阅RFC 5246

认证和授权
在计算机科学中,身份验证是一种用于证明参与通信的各方身份的机制。它被用于证明“你就是你说的你。”
不要与授权相混淆,授权是用来证明“你被允许执行正在尝试执行的操作”。

有几种类型的认证。以下是在IIS上广泛使用的身份验证列表(顺序不定):

匿名身份验证(无身份验证)
基本认证
客户端证书认证
摘要式身份验证
表单认证
NTLM
Kerberos
智能卡身份验证

注意:由于SSL握手发生在HTTP通信之前,客户端证书身份验证的优先级高于通过HTTP协议进行的任何其他类型的身份验证。
Kerberos,客户端证书认证和智能卡认证是相互认证机制的例子。 身份验证通常用于访问控制,您希望限制对已知用户的访问。 另一方面,授权用于确定授予用户的访问级别/特权。

在Windows上,线程是执行的基本单元。 由用户执行的任何任务由特定账户/身份的上下文中的线程执行。 身份验证是用于确定线程身份的方式之一,其特权将被线程用于执行。

SSL / TLS握手中的客户端证书身份验证

我已经在我的一篇博文中讨论过SSL握手。浏览:
http://blogs.msdn.com/b/kaushal/archive/2013/08/03/ssl-handshake-and-https-bindings-on-iis.aspx

以下是描述SSL / TLS握手的屏幕截图:

6574.060215_0710_ClientCerti2.png

客户端如上图所示发送CLIENT HELLO
在收到CLIENT HELLO后,如果服务器配置为客户端证书认证,则除了上述其他细节外,它还会将作为SERVER HELLO的一部分的专有CA名称和客户端证书请求发送给客户端。
在收到包含客户端证书请求和可分辨CA名称列表的服务器Hello时,客户端将执行以下步骤:
客户端使用SERVER HELLO中提供的CA列表来确定相互信任的CA证书。
该客户将确定由相互信任的证书颁发机构颁发的客户证书。
然后,客户端将向用户展示客户端证书列表,以便他们可以选择要发送给用户的证书。

注意:
在客户端上,客户端证书必须有一个私钥。如果没有的话,则认证被忽略。
如果服务器未在SERVER HELLO中提供专有CA名称列表,则客户端将向用户呈现其有权访问的所有客户端证书。

一经选择,客户回应下列内容中的一个:
1. 包含预主密钥的ClientKeyExchange消息
2. 包含客户端证书的证书消息(不包含私钥)。
3. CertificateVerify消息,该消息用于提供客户端证书的明确验证。此消息仅在发送客户端证书消息时发送。通过使用其私钥对客户端进行身份验证,以签署到目前为止所有消息的哈希。收件人使用签名者的公钥验证签名,从而确保它使用客户端的私钥签名。有关更多详细信息,请参阅RFC 5246。

发布此客户端和服务器使用随机数和预主密钥生成对称密钥(或主密钥),这些密钥将用于加密和解密消息以进一步通信。
两者都回应ChangeCipherSpec表明他们已经完成了这个过程。
SSL握手现在完成,双方拥有可用于加密和解密的主密钥副本。

设计问题
我们知道服务器将可分辨的CA名称列表作为SERVER HELLO的一部分。 RFC永远不会要求区分的CA名称列表应包含根CA或中级CA证书。以下是RFC5246中定义的本节的一部分:

certificate_authorities
可接受的专有名称[X501]列表
certificate_authorities,以DER编码格式表示。这些
专有名称可以为a指定所需的可分辨名称
根CA或下级CA;因此,这个消息可以用来
描述已知的根以及所需的授权空间。如果
certificate_authorities列表是空的,然后客户端可以
发送适当的ClientCertificateType的任何证书,
除非有相反的外部安排

请参阅以下博客文章以获取有关根证书和中级CA证书的信息:
http://blogs.msdn.com/b/kaushal/archive/2013/01/10/self-signed-root-ca-and-intermediate-ca-certificates.aspx

这可能会导致一些问题,即少数系统需要根CA,而很少需要中间CA出现在SERVER HELLO中发送的列表中。这使通信方在某些场合不兼容。

这两个实现都是有争议的。一方面,服务器发送的列表不能超过一定的限制(在窗口上的大小是12,228字节)。如果超过,认证将失败。中级CA的列表总是超过根CA的列表2-3倍甚至更高。这是某些系统在“可分辨CA名称”列表中发送根CA的原因之一。另一方面,中间CA名称可以在用户提供的客户端证书中随时获得,因此在证书链验证过程中可以更轻松地使用中间CA名称,因此有些系统比以前更喜欢这一点。两者都有其优点。

我个人遇到的一个例子是Apple的Safari浏览器与IIS 7或更高版本上托管的站点进行通信,这需要客户端证书进行身份验证。 Safari期望在SERVER HELLO中列出中级CA的列表。另一方面,IIS只在该列表中发送根CA.结果,身份验证失败,因为客户端无法向服务器提供客户端证书。

解决上述问题的方法是将IIS配置为不在SERVER HELLO中发送任何CA列表。为了实现这一点,请遵循以下支持文章中描述的方法3:
https://support.microsoft.com/en-us/kb/933430/

上面的文章要求您添加一个注册表项SendTrustedIssuerList,它被设置为0。

因此,服务器不会向客户端发送任何列表,但要求它通过客户端证书。客户将出示完整的客户证书列表以供选择,并且会按预期进行。

注意:在Windows Server 2012和Windows 8中,对底层认证过程进行了更改,以便:
不再支持基于CTL的受信任发行者列表管理。
默认情况下发送受信任的颁发者列表的行为已关闭:SendTrustedIssuerList注册表项的默认值现在为0(默认情况下已关闭)而不是1。
保留与以前版本的Windows操作系统的兼容性。
进一步阅读:https://technet.microsoft.com/en-in/library/hh831771.aspx

by blast