有很多关于如何创建私钥/CSR/SSL (TLS) 证书的文章。 不过我想要别的东西。
我丢失了私钥(不小心删除了目录)。 我设法恢复服务器证书(由我自己的 CA 签名)。 看来我需要生成一个新的私钥,CSR。 为了减轻负担,我想使用现有证书创建 openssl 配置。 (因为我总是丢失我的 cnf,所以效果很好。)最长的方法是从证书中获取文本输出:
openssl x509 -text -noout -in ...
然后调用设置来放置配置文件... 我想要一个可以下载的工具或脚本,它会创建一个配置文件,我可以用它来生成新的 CSR (创建私钥后 - 然后使用它们生成新证书)。
有人知道这样的工具/脚本吗?
这个脚本提供了一个很好的起点。您可以根据需要扩展它以包含更多字段或自定义。
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 变量。