Python 3.x 将一个文件中的openssl生成的rsa公钥与另一个文件中的多个公钥进行比较的最佳方法是什么?

Python 3.x 将一个文件中的openssl生成的rsa公钥与另一个文件中的多个公钥进行比较的最佳方法是什么?,python-3.x,pki,Python 3.x,Pki,我有一个文件a.crt,其中有一个公钥。我需要比较/检查B.crt中是否存在A.crt pub键,这是一个包含多个公钥的合并文件 A.crt -----BEGIN PUBLIC KEY----- AAAAAAAAAAAAAAAAAAAAAAAAAAAAA -----END PUBLIC KEY----- -----BEGIN PUBLIC KEY----- AAAAAAAAAAAAAAAAAAAAAAAAAAAAA -----END PUBLIC KEY----- -----BEGIN PUB

我有一个文件
a.crt
,其中有一个公钥。我需要比较/检查
B.crt
中是否存在A.crt pub键,这是一个包含多个公钥的合并文件

A.crt

-----BEGIN PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
BBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-----END PUBLIC KEY-----

B.crt

-----BEGIN PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
BBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
-----END PUBLIC KEY-----

用例:

我们希望在python中实现一个密钥轮换脚本,该脚本从提供给服务器的合并公钥文件中删除过时的公钥

计划

  • A.crt
    文件加载到varA中
  • B.crt
    文件加载到varB中
  • 尝试使用正则表达式拆分字符串[Im未成功]
    (----开始公钥------.*----结束公钥------)
  • 比较VarB中是否存在VarA并将其删除

  • 请建议该方法是否合适或其他更好的处理方法。

    您可以编写这样一个简单的解析器来读取这样的所有公钥

    import io
    
    txt = '''-----BEGIN PUBLIC KEY-----
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    -----END PUBLIC KEY-----
    -----BEGIN PUBLIC KEY-----
    BBBBBBBBBBBBBBBBBBBBBBBBBBBBB
    -----END PUBLIC KEY-----
    -----BEGIN PUBLIC KEY-----
    
    CCCCCCCCCCCCCCCCCCCCCCCCCCCCC
    -----END PUBLIC KEY-----'''
    
    
    
    start_str = '-----BEGIN PUBLIC KEY-----'
    stop_str = '-----END PUBLIC KEY-----'
    
    pk = []
    found = False
    with io.StringIO(txt) as f:  # can be replaced by with open(file, 'r') as f
        for line in f:
            line = line.strip()
            if line == start_str:
                found = True
                continue
            if line == stop_str:
                found = False
                continue
    
            if found and line:
                pk.append(line)
    
    print(pk)  # --> ['AAAAAAAAAAAAAAAAAAAAAAAAAAAAA', 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBB', 'CCCCCCCCCCCCCCCCCCCCCCCCCCCCC']
    

    您也可以使用
    crypto
    库来读取RSA,但我不确定它是否支持多个密钥。参见示例。

    请注意,
    openssl
    必须在文件中查找密钥。但如果您想硬编码此项,并删除原始文件中的密钥,这将是我在您的计划中执行步骤3的方法:

    def订阅密钥(旧文件、新文件):
    打开(旧的_文件,'w')作为密钥_文件:
    对于新文件中的行:
    key_file.write(行)
    def检查密钥(密钥,文件):
    打开(文件“r”)作为密钥文件:
    varB=key_file.readlines()#读取文件
    对于索引,枚举中的行(varB):
    如果line.strip()='----开始RSA私钥------':
    cur_idx=索引
    cur_key=''开始挂载key
    elif line.strip()='----结束RSA私钥------':
    如果键==当前键:#比较键
    del varB[cur_idx:(索引+1)]
    订阅密钥(文件,varB)#订阅旧文件
    返回真值
    其他:
    cur_key+=line.strip()#将字符串附加到mount key
    返回错误
    打印(检查键(varA,“B.crt”))
    
    如果文件按行分割,则不需要使用正则表达式。只要用一个键在每一行上循环,并检查varA是否匹配它。@ArthurPereira
    B.crt
    是一个多行文件,其中每个键也是多行的。我试过使用分割线,但不起作用。