证书链

证书链是一系列数字证书的集合,用于验证和建立信任关系。在公钥基础设施(PKI)中,证书链用于验证服务器证书的有效性和可信任性。

证书链由多个证书组成,每个证书都被签发者(颁发者)签名。链的顶部是服务器证书,也称为终端证书或服务器端证书。该证书包含了公钥和与之相关的信息,如域名、组织名称等。
证书链的底部是根证书,也称为根CA证书或根证书颁发机构(Root CA)。根证书是最高级别的信任锚点,它的公钥用于验证链中的其他证书。
中间证书也被包含在证书链中,它们是由根证书颁发机构签发的,并用于连接终端证书和根证书。中间证书的作用是构建信任链,确保终端证书的有效性。
验证证书链的过程是逐级验证每个证书的签名,直到达到根证书。如果每个证书的签名都有效,并且根证书是受信任的,那么整个证书链就被视为有效和可信任的。
通过验证证书链,客户端可以确保与服务器之间的通信是安全的,并且可以信任服务器的身份。这对于建立安全的网络连接和进行加密通信至关重要,尤其在涉及敏感信息的场景下,如在线银行、电子商务等。

最低的层级为一层根证书 + 一层最终用户证书
常见情况更多是这种
![](file://C:/Users/L1653/Documents/Obsidian Vault/Pasted image 20230226011452.png)

A:实现

来了解下OpenSSL,要用其来解析证书 crypto — Generic cryptographic module — pyOpenSSL 0.15.1 documentation
题目要求与提示

不必处理证书吊销列表

注释几句关键代码

# Cert Paths 引用已安装的证书颁发机构 (CA) 捆绑包  
TRUSTED_CERTS_PEM = certifi.where()

思路

  1. 思考基本逻辑
    1. 拿到网站后 传入函数 x509_cert_chain_check 接着传入 get_cert_chain 获取其证书链
    2. 接着对证书链 进行验证
    3. 视频中所出现的代码段 结合SSL的基本原理对其验证
root_cert = load_certificate(FILETYPE_PEM, root_cert_pem)  
intermediate_cert = load_certificate(FILETYPE_PEM, intermediate_cert_pem)  
leaf_cert = load_certificate(FILETYPE_PEM, leaf_cert_pem)  
  
store = X509Store()  
store.add_cert(root_cert)  
store.add_cert(intermediate_cert)  
store_ctx = X509StoreContext(store, leaf_cert)  
  
print(store_ctx.verify_certificate())  
  
store = OpenSSL.crypto.X509Store()  
store.add_cert(root_cert)  
  
# Check the chain certificate before adding it to the store  
store_ctx = OpenSSL.crypto.X509StoreContext(store, intermediate_cert)  
store_ctx.verify_certificate()  
store.add_cert(intermediate_cert)  
  
# Now check the end-entity certificate  
store_ctx = OpenSSL.crypto.X509StoreContext(store, leaf_cert)  
store_ctx.verify_certificate()

伪代码加以处理

def x509_cert_chain_check(target_domain: str) -> bool:  
    """  
    如果target_domain提供了有效的x509cert,该函数将返回true,如果没有或者出现错误,则返回false。  
    """    # TODO: Complete Me!  
    # 加载可信的CA证书  
    trusted_certs = pem.parse_file(TRUSTED_CERTS_PEM)  
  
    # Get certificate chain for the target domain  
    # 获取目标域的证书链  
    cert_chain = get_cert_chain(target_domain)  
  
    # Create a certificate store and add trusted CA certificates  
    # 创建证书存储并添加受信任的CA证书  
    store = crypto.X509Store()  
    for cert in trusted_certs:  
        cert_obj = crypto.load_certificate(crypto.FILETYPE_PEM, cert.as_bytes())  
        store.add_cert(cert_obj)  
  
    # Create a certificate store context and verify the certificate chain  
    # 创建证书存储上下文并验证证书链  
    store_ctx = crypto.X509StoreContext(store, cert_chain[-1])  
    try:  
        store_ctx.verify_certificate()  
        return True  
    except crypto.X509StoreContextError:  
        return False

这段代码主要涉及到证书验证过程,具体分析如下:

首先,使用 OpenSSL 库中的 load_certificate() 函数从 PEM 格式的证书文件中加载根证书、中间证书和叶子证书,分别赋值给 root_certintermediate_certleaf_cert

然后,创建一个空的 X509Store 对象 store,并使用 add_cert() 方法将根证书和中间证书添加到 store 中。接着,创建一个 X509StoreContext 对象 store_ctx,并将 store 和叶子证书 leaf_cert 传递给构造函数,从而创建一个证书验证的上下文。最后,调用 verify_certificate() 方法,对 leaf_cert 进行证书验证。

需要注意的是,在验证 leaf_cert 之前,代码还对中间证书 intermediate_cert 进行了验证。这是因为在实际的证书链中,中间证书也需要被验证,以保证证书链的完整性。具体来说,先使用 X509StoreContext() 对象验证中间证书,如果验证通过,则将其添加到 store 中,再使用新的 store_ctx 对象验证叶子证书。这样,如果中间证书存在问题,将不会将其添加到 store 中,从而避免了在验证叶子证书时出现问题。

总体来说,这段代码实现了对证书链的完整性和叶子证书的合法性进行验证的过程。通过验证证书,可以确保证书的合法性,保护数据传输的安全性。

B:跟进

如果SSL证书泄漏

说明私钥泄漏 所加密信息便毫无保护

  1. 更换证书(向CA重新申请)
  2. 向用户告知刷新证书
  3. 2015年有著名的 受戒礼 ssl漏洞 原因是使用RC4加密 如果是因为此原因及时避免使用(不过在早期RC4算法能减轻BEAST野兽攻击的危害)现版本以丢弃RC4
  4. 修补的角度看,下次生成证书时也要考虑是否存在上一个题目的原因(构造可能的危险数据 比如DH加密中构造公钥为1 这将使其共享密钥失效 应该在本地判断阻止生成和接收)