使用现有证书制作 openssl 配置文件

问题描述 投票:0回答:1

有很多关于如何创建私钥/CSR/SSL (TLS) 证书的文章。 不过我想要别的东西。

我丢失了私钥(不小心删除了目录)。 我设法恢复服务器证书(由我自己的 CA 签名)。 看来我需要生成一个新的私钥,CSR。 为了减轻负担,我想使用现有证书创建 openssl 配置。 (因为我总是丢失我的 cnf,所以效果很好。)最长的方法是从证书中获取文本输出:

openssl x509 -text -noout -in ...

然后调用设置来放置配置文件... 我想要一个可以下载的工具或脚本,它会创建一个配置文件,我可以用它来生成新的 CSR (创建私钥后 - 然后使用它们生成新证书)。

有人知道这样的工具/脚本吗?

configuration openssl ssl-certificate private-key csr
1个回答
0
投票

这个脚本提供了一个很好的起点。您可以根据需要扩展它以包含更多字段或自定义。

import subprocess

def get_certificate_info(cert_path):
    """Extracts information from the certificate using openssl."""
    cmd = f"openssl x509 -in {cert_path} -text -noout"
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    if result.returncode != 0:
        raise Exception(f"Failed to read certificate: {result.stderr}")
    return result.stdout

def parse_certificate_info(cert_text):
    """Parses the certificate text to extract required fields."""
    lines = cert_text.split('\n')
    config = {
        'countryName': '',
        'stateOrProvinceName': '',
        'localityName': '',
        'organizationName': '',
        'organizationalUnitName': '',
        'commonName': '',
        'emailAddress': ''
    }
    
    for line in lines:
        if 'Country Name' in line:
            config['countryName'] = line.split(': ')[1]
        elif 'State or Province Name' in line:
            config['stateOrProvinceName'] = line.split(': ')[1]
        elif 'Locality Name' in line:
            config['localityName'] = line.split(': ')[1]
        elif 'Organization Name' in line:
            config['organizationName'] = line.split(': ')[1]
        elif 'Organizational Unit Name' in line:
            config['organizationalUnitName'] = line.split(': ')[1]
        elif 'Common Name' in line:
            config['commonName'] = line.split(': ')[1]
        elif 'emailAddress' in line:
            config['emailAddress'] = line.split(': ')[1]
    return config

def create_openssl_config(config, output_path):
    """Creates an OpenSSL configuration file from the parsed certificate info."""
    config_text = f"""
[ req ]
default_bits       = 2048
default_keyfile    = privkey.pem
distinguished_name = req_distinguished_name
prompt = no

[ req_distinguished_name ]
countryName            = {config['countryName']}
stateOrProvinceName    = {config['stateOrProvinceName']}
localityName           = {config['localityName']}
organizationName       = {config['organizationName']}
organizationalUnitName = {config['organizationalUnitName']}
commonName             = {config['commonName']}
emailAddress           = {config['emailAddress']}
"""
    with open(output_path, 'w') as f:
        f.write(config_text)

def main():
    cert_path = "server.crt"  # path to your existing certificate
    output_path = "openssl.cnf"  # path to output OpenSSL configuration file

    cert_text = get_certificate_info(cert_path)
    config = parse_certificate_info(cert_text)
    create_openssl_config(config, output_path)
    print(f"OpenSSL configuration file created at {output_path}")

if __name__ == "__main__":
    main()

这个脚本: 使用 openssl x509 -text -noout 从现有证书中提取信息。 解析证书文本以提取 OpenSSL 配置所需的字段。 使用解析的证书信息创建 OpenSSL 配置文件。 您可以通过将其保存到文件(例如generate_openssl_config.py)并执行来运行该脚本。确保您的系统上安装了 Python 和 OpenSSL。此脚本假定证书文件名为 server.crt。根据需要调整 cert_path 变量。

© www.soinside.com 2019 - 2024. All rights reserved.