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,作甚?
你永远无法想象中国的证书机构管理证书如此随意,颁发证书如此毫无章法,我举个真实例子:
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,作甚?
相关文章推荐
- SSL/TLS 协议详解
- TLS/SSL 协议详解(13) certificate request
- TLS/SSL 协议详解(14) server hello done
- HTTPS协议详解(四):TLS/SSL握手过程
- SSL/TLS 协议详解
- TLS/SSL 协议详解 (22)TLS1.3
- SSL/TLS 协议详解
- SSL/TLS 协议详解
- TLS/SSL 协议详解(1) 前言
- TLS/SSL 协议详解 (23) HTTPS实际应用碰到的问题
- HTTPS协议详解(四):TLS/SSL握手过程
- TLS/SSL 协议详解 (2) SSL有关的密码学原理
- TLS/SSL 协议详解(15) client certificate
- SSL/TLS 协议详解
- TLS/SSL 协议详解 (25) https双向认证及常见问题总结
- SSL/TLS 协议详解
- TLS/SSL 协议详解(6) SSL 数字证书的一些细节1
- TLS/SSL 协议详解 (16) client key exchange
- SSL/TLS 协议详解