您的位置:首页 > 其它

TLS/SSL 协议详解 (24) CFCA蛋疼的事

2017-09-08 09:05 399 查看
(要看懂这篇文章需要知道证书链是如何验证的)

你永远无法想象中国的证书机构管理证书如此随意,颁发证书如此毫无章法,我举个真实例子:

CFCA 颁发过这么恶心的证书链

1:

他们首先生成2个根证书

root1.cer,root2.cer

两个根证书,即两个根证书subject不同,一个叫root1另一个叫root2。

2:

然后生成一个ca.key私钥公钥,生成ca1和ca2,分别由root1和root2签名。注意,由于是由ca.key生成的,所以ca1和ca2公钥一样。这个很常见。其次,生成时,ca1和ca2 subject 名字一样,都叫ca test,甚至连sequence 都一样。。

3:

奇葩的事情出现了,用ca.key私钥签发了一个user证书,至于是ca1还是ca2签发的,无关紧要,因为光看user,其颁发者就是“ca test”,都是被ca.key私钥签名。故ca1和ca2都能用来验证user。

4:考虑这个使用场景,客户端有user,有ca1,服务器配置ca2,root2。

显然,服务器发送certificate request时,发送的subject 就是 ca test,也可以是 ca test+root2,客户端收到这个request,选择本地证书,发现有一个证书是由ca test颁发的,至少名字上对上了。然后发送时又发现本地也有名字叫做ca test的证书,这个证书也可以验证user,所以

客户端发过来的证书就是ca1  +  user。

然鹅,ca1的颁发者不是root2,而是root1,导致服务器无法验证。原因呢?

一般像openssl验证客户端证书时,先从客户端的证书中整理出一个链,然后再在本地(服务器)中网这个链上挂上级证书,挂到根证书为止。

cfca这种情况,由于客户端发送过来的证书是能组成链的,所以服务器收到后,会去找ca1的根证书root1,然而服务器没有root1,导致Unknown CA的发生。

这两个ca证书我放在这了,奇文共欣赏。



 

有2个CA证书,都叫CFCA TEST CA ,一个由CFCA RCA颁发,一个由CFCA RSA RCA颁发。

这两个CA就签名和issuer不同,其他的包括sequence、公钥、私钥都相同。故其中一个CA签发

的证书,都能被另一个CA签发的证书验证。

如果本地有这么几个证书 user + CFCA TEST CA + CFCA TEST CA,本地那么根本不知道user到底是哪个CFCA TEST CA颁发的。。。

 

 

-----BEGIN CERTIFICATE-----

MIICezCCAeSgAwIBAgIEPPyMXjANBgkqhkiG9w0BAQUFADAgMQswCQYDVQQGEwJD

TjERMA8GA1UEChMIQ0ZDQSBSQ0EwHhcNMDQwODEwMDgzNjM3WhcNMTQwNzI1MTYw

MDAwWjAkMQswCQYDVQQGEwJDTjEVMBMGA1UEChMMQ0ZDQSBURVNUIENBMIGfMA0G

CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYrs50M7hq8y0LzFjfN3UPQzGiBg1kLinP

qJcSx7oRXey15WpLLMLthcfp9Gn/7uXmtNL6athr91YXzrB3Rcp53U3zqScGE9h2

ktFQ3SNdZP6c/VSQ+27pAVxWRUC+F6pmUsno+jd1mftYjhKRV8yvCRpSV6HDzhLK

83xbkoCfiQIDAQABo4G9MIG6MEIGA1UdHwQ7MDkwN6A1oDOkMTAvMQswCQYDVQQG

EwJDTjERMA8GA1UEChMIQ0ZDQSBSQ0ExDTALBgNVBAMTBENSTDEwCwYDVR0PBAQD

AgEGMB8GA1UdIwQYMBaAFACaNPJR+VMUYXRucqEG3seBcBu8MB0GA1UdDgQWBBRG

ctwlcp8CTlWDtYD5C9vpk7P0RTAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQM

MAobBFY2LjADAgSQMA0GCSqGSIb3DQEBBQUAA4GBAJ69l0Y1K+ayEvojzBHfzozM

f0a0aQMaEbiil+RJQ8lvwWHZOeaRTcJOxyiPoQ5DZqhEusXavFPX4J/mE3H5PCnV

5tF7tSO7vEguhs8m2IXxrOZCpKmCJVevNdV9x0m9eD629NVJGf683raMx39Ft4HQ

FaLT+EXbnSAWvYemPyOW

-----END CERTIFICATE-----

-----BEGIN CERTIFICATE-----

MIIDADCCAeigAwIBAgIEPPyMXjANBgkqhkiG9w0BAQUFADAkMQswCQYDVQQGEwJD

TjEVMBMGA1UEChMMQ0ZDQSBSU0EgUkNBMB4XDTA0MDgxMDA4MzYzN1oXDTI5MTIz

MTE2MDAwMFowJDELMAkGA1UEBhMCQ04xFTATBgNVBAoTDENGQ0EgVEVTVCBDQTCB

nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2K7OdDO4avMtC8xY3zd1D0MxogYN

ZC4pz6iXEse6EV3steVqSyzC7YXH6fRp/+7l5rTS+mrYa/dWF86wd0XKed1N86kn

BhPYdpLRUN0jXWT+nP1UkPtu6QFcVkVAvheqZlLJ6Po3dZn7WI4SkVfMrwkaUleh

w84SyvN8W5KAn4kCAwEAAaOBvTCBujAfBgNVHSMEGDAWgBS5E3ghYE2YclPVZkTa

Ef5kQ4azXjAZBgkqhkiG9n0HQQAEDDAKGwRWNi4wAwIEkDAMBgNVHRMEBTADAQH/

MEIGA1UdHwQ7MDkwN6A1oDOkMTAvMQswCQYDVQQGEwJDTjERMA8GA1UEChMIQ0ZD

QSBSQ0ExDTALBgNVBAMTBENSTDEwCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBRGctwl

cp8CTlWDtYD5C9vpk7P0RTANBgkqhkiG9w0BAQUFAAOCAQEAuuR+PmQ8IXv9c81T

9jeftX//gTsATxPdJXMdBv+wBOnaV1oewJRpY5QraEfj8xVm7AG/MOUbe5uwkYvB

1+t9iHpCdIGIHG9/1ufJyYU7EwGtDSRFf3bh2ekJRSqsyqEPlEiLifAgfO4pAre3

Y1qtj3ffM6pUh3yEOd5D15xBLW71cMx4tZs2Hrz90idKs2MfYwepurBc8lDiNQJT

4hoBOFeg1GUqsyd00z3+IFl2Rs20+uX0xy4B6pgqRJ8KByrB5PHg3kD69JDLNyPu

3xywGB3jWxT7Nz7Nt9zZoreJe8aQv2Wavqv/frCmGk6Wy33SS6y150WAj4thYIAR

Y+kCRg==

-----END CERTIFICATE-----

其实其中一个CA证书过期了,双向认证时,浏览器理论上不会携带这个证书,然而,还是带了,ie和google都带了(火狐就正常)。

其次作为CA机构,假设一个CA过期了,想重新颁发,可以,但是至少相同root颁发吧,而且Not before填写和老的ca一样是不是太假?

如果不是因为一个CA过期了而颁发另一个CA,只是同时同地用2个root颁发了一模一样的2个CA,作甚?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: