PEM证书文件解析问题:内容重复添加至自定义对象
嘿,我完全懂你这个痛点!解析多证书PEM文件时,那些带SHA、BEGIN/END标记的行被重复塞进自定义对象里,本质是因为你处理完标记行的逻辑后,没拦住程序走到else分支再添一次对吧?
给你两个简单直接的解决方案,都是从阻止重复执行添加逻辑入手:
方案1:用continue跳过后续逻辑
在处理完标记行后,直接用continue进入下一轮循环,这样就不会走到else分支重复添加了。比如:
# 假设你已经定义了CustomCertificate类和certificate_list列表 current_cert = CustomCertificate() with open("multi_certs.pem", "r") as f: for line in f: line = line.rstrip('\n') # 保留换行符的话可以去掉rstrip,看你需求 if not line.strip(): # 跳过空行,优化无效内容 continue if "SHA" in line: # 提取SHA哈希值,可根据实际格式调整strip逻辑 current_cert.sha_hash = line.strip() current_cert.pem += f"{line}\n" continue # 直接跳去下一行,不执行后面的else if "BEGIN CERTIFICATE" in line: current_cert.pem += f"{line}\n" continue if "END CERTIFICATE" in line: current_cert.pem += f"{line}\n" # 这里加上你的expiration计算逻辑,比如用cryptography库提取过期时间 # current_cert.expiration = get_cert_expiration(current_cert.pem) certificate_list.append(current_cert) current_cert = CustomCertificate() # 初始化新对象 continue # 只有非标记行才会走到这里,添加到pem内容里 current_cert.pem += f"{line}\n"
方案2:重构为互斥的elif链
把所有标记行的判断整成互斥的elif分支,这样一行只会被一个分支处理,不会触发后续的else:
current_cert = CustomCertificate() with open("multi_certs.pem", "r") as f: for line in f: line = line.rstrip('\n') if not line.strip(): continue if "SHA" in line: current_cert.sha_hash = line.strip() current_cert.pem += f"{line}\n" elif "BEGIN CERTIFICATE" in line: current_cert.pem += f"{line}\n" elif "END CERTIFICATE" in line: current_cert.pem += f"{line}\n" # 计算并赋值过期时间 # current_cert.expiration = ... certificate_list.append(current_cert) current_cert = CustomCertificate() else: # 非标记行才添加 current_cert.pem += f"{line}\n"
额外优化小提示
如果需要解析证书的过期时间,推荐用cryptography库——加载PEM证书后直接提取not_valid_after字段,比自己手动解析ASN.1格式要靠谱得多。
内容的提问来源于stack exchange,提问作者Edward S.
相关产品推荐
相关产品推荐

