python中如何用openssl

python中如何用openssl

Python中如何用OpenSSL:使用PyOpenSSL库、使用cryptography库、结合系统OpenSSL库、通过命令行调用

在Python中使用OpenSSL主要有几种方式,其中最常用的包括使用PyOpenSSL库和cryptography库。这些库提供了一系列接口,使得在Python中处理SSL/TLS、证书和加密操作变得更加简单和高效。本文将深入探讨如何在Python中使用OpenSSL,包括不同库的选择和具体操作步骤。

一、使用PyOpenSSL库

1、安装PyOpenSSL

PyOpenSSL是一个基于OpenSSL的Python库,可以通过pip进行安装:

pip install pyopenssl

2、使用PyOpenSSL进行加密和解密

PyOpenSSL提供了丰富的API来进行加密和解密操作。以下是一个简单的示例,展示了如何使用PyOpenSSL进行对称加密和解密:

from OpenSSL import crypto

def generate_key():

key = crypto.PKey()

key.generate_key(crypto.TYPE_RSA, 2048)

return key

def encrypt_message(message, public_key):

encrypted = crypto.dump_privatekey(crypto.FILETYPE_PEM, public_key)

return encrypted

def decrypt_message(encrypted_message, private_key):

decrypted = crypto.load_privatekey(crypto.FILETYPE_PEM, encrypted_message)

return decrypted

示例使用

key = generate_key()

public_key = key.to_cryptography_key().public_key()

private_key = key.to_cryptography_key()

encrypted_message = encrypt_message(b"Hello, OpenSSL!", public_key)

print(f"Encrypted: {encrypted_message}")

decrypted_message = decrypt_message(encrypted_message, private_key)

print(f"Decrypted: {decrypted_message}")

二、使用cryptography库

1、安装cryptography库

cryptography库是一个功能强大的Python加密库,提供了高级和低级的接口。可以通过pip进行安装:

pip install cryptography

2、使用cryptography进行证书操作

cryptography库提供了丰富的接口用于生成和管理证书。以下是一个生成自签名证书的示例:

from cryptography import x509

from cryptography.x509.oid import NameOID

from cryptography.hazmat.primitives import hashes

from cryptography.hazmat.primitives.asymmetric import rsa

from cryptography.hazmat.primitives import serialization

import datetime

def generate_self_signed_cert():

key = rsa.generate_private_key(

public_exponent=65537,

key_size=2048,

)

subject = issuer = x509.Name([

x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),

x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"California"),

x509.NameAttribute(NameOID.LOCALITY_NAME, u"San Francisco"),

x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"My Company"),

x509.NameAttribute(NameOID.COMMON_NAME, u"mycompany.com"),

])

cert = x509.CertificateBuilder().subject_name(subject).issuer_name(issuer).public_key(

key.public_key()

).serial_number(x509.random_serial_number()).not_valid_before(

datetime.datetime.utcnow()

).not_valid_after(

datetime.datetime.utcnow() + datetime.timedelta(days=10)

).add_extension(

x509.SubjectAlternativeName([x509.DNSName(u"localhost")]),

critical=False,

).sign(key, hashes.SHA256())

return cert, key

cert, key = generate_self_signed_cert()

cert_pem = cert.public_bytes(serialization.Encoding.PEM)

key_pem = key.private_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PrivateFormat.TraditionalOpenSSL,

encryption_algorithm=serialization.NoEncryption()

)

print(cert_pem.decode('utf-8'))

print(key_pem.decode('utf-8'))

三、结合系统OpenSSL库

1、安装OpenSSL

在大多数Linux发行版上,OpenSSL已经预装。如果没有,可以通过包管理器进行安装。例如在Debian/Ubuntu系统中:

sudo apt-get install openssl

2、通过Python subprocess调用OpenSSL命令

有时候直接调用OpenSSL命令行工具可能更为方便。可以使用Python的subprocess模块来执行这些命令:

import subprocess

def generate_private_key():

command = ['openssl', 'genrsa', '-out', 'private_key.pem', '2048']

subprocess.run(command)

def generate_certificate_request():

command = [

'openssl', 'req', '-new', '-key', 'private_key.pem', '-out', 'csr.pem',

'-subj', '/C=US/ST=California/L=San Francisco/O=My Company/OU=My Unit/CN=mycompany.com'

]

subprocess.run(command)

def generate_self_signed_cert():

command = [

'openssl', 'req', '-x509', '-nodes', '-days', '365', '-key', 'private_key.pem', '-out', 'certificate.pem',

'-subj', '/C=US/ST=California/L=San Francisco/O=My Company/OU=My Unit/CN=mycompany.com'

]

subprocess.run(command)

示例使用

generate_private_key()

generate_certificate_request()

generate_self_signed_cert()

四、OpenSSL在网络通信中的应用

1、创建SSL上下文

在网络通信中,SSL/TLS是确保数据传输安全的关键。可以使用Python的内置ssl模块来创建SSL上下文:

import ssl

import socket

def create_ssl_context():

context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)

context.load_cert_chain(certfile="certificate.pem", keyfile="private_key.pem")

return context

def start_ssl_server():

context = create_ssl_context()

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:

sock.bind(('localhost', 8443))

sock.listen(5)

with context.wrap_socket(sock, server_side=True) as ssock:

conn, addr = ssock.accept()

print(f"Connection from {addr}")

data = conn.recv(1024)

conn.sendall(data)

conn.close()

start_ssl_server()

2、创建SSL客户端

同样,可以使用ssl模块来创建SSL客户端进行安全通信:

import ssl

import socket

def create_ssl_context():

context = ssl.create_default_context()

context.check_hostname = False

context.verify_mode = ssl.CERT_NONE

return context

def start_ssl_client():

context = create_ssl_context()

with socket.create_connection(('localhost', 8443)) as sock:

with context.wrap_socket(sock, server_hostname='localhost') as ssock:

ssock.sendall(b'Hello, SSL!')

data = ssock.recv(1024)

print(f"Received: {data}")

start_ssl_client()

五、OpenSSL在文件加密中的应用

1、对称加密文件

OpenSSL的对称加密功能可以用于文件加密,以下是使用AES加密文件的示例:

import subprocess

def encrypt_file(input_file, output_file, key):

command = ['openssl', 'enc', '-aes-256-cbc', '-salt', '-in', input_file, '-out', output_file, '-k', key]

subprocess.run(command)

def decrypt_file(input_file, output_file, key):

command = ['openssl', 'enc', '-d', '-aes-256-cbc', '-in', input_file, '-out', output_file, '-k', key]

subprocess.run(command)

示例使用

encrypt_file('plaintext.txt', 'encrypted.txt', 'mysecretkey')

decrypt_file('encrypted.txt', 'decrypted.txt', 'mysecretkey')

2、非对称加密文件

非对称加密也可以用于文件加密,以下是使用RSA加密文件的示例:

import subprocess

def generate_rsa_key():

command = ['openssl', 'genrsa', '-out', 'rsa_private_key.pem', '2048']

subprocess.run(command)

command = ['openssl', 'rsa', '-in', 'rsa_private_key.pem', '-pubout', '-out', 'rsa_public_key.pem']

subprocess.run(command)

def encrypt_file_with_rsa(input_file, output_file, public_key_file):

command = ['openssl', 'rsautl', '-encrypt', '-inkey', public_key_file, '-pubin', '-in', input_file, '-out', output_file]

subprocess.run(command)

def decrypt_file_with_rsa(input_file, output_file, private_key_file):

command = ['openssl', 'rsautl', '-decrypt', '-inkey', private_key_file, '-in', input_file, '-out', output_file]

subprocess.run(command)

示例使用

generate_rsa_key()

encrypt_file_with_rsa('plaintext.txt', 'encrypted_rsa.txt', 'rsa_public_key.pem')

decrypt_file_with_rsa('encrypted_rsa.txt', 'decrypted_rsa.txt', 'rsa_private_key.pem')

六、项目管理工具推荐

在进行Python开发项目时,使用合适的项目管理工具可以极大提高开发效率和项目质量。推荐使用研发项目管理系统PingCode通用项目管理软件Worktile。这两个系统提供了丰富的功能,支持项目进度管理、任务分配、协作沟通等,有助于团队更好地进行项目管理和开发流程优化。

1、PingCode

PingCode是一个专业的研发项目管理系统,特别适用于软件开发团队。它提供了需求管理、迭代管理、缺陷管理等功能,可以帮助团队高效地进行研发过程管理。

2、Worktile

Worktile是一款通用的项目管理软件,适用于各种类型的项目管理需求。它支持任务管理、时间管理、团队协作等功能,可以帮助团队更好地进行项目规划和执行。

通过使用以上介绍的OpenSSL库和工具,结合合适的项目管理系统,可以极大提高Python开发项目的安全性和管理效率。

相关问答FAQs:

1. 如何在Python中使用OpenSSL进行加密和解密?

OpenSSL是一个强大的加密工具包,可以在Python中使用。您可以使用Python的ssl模块来调用OpenSSL的功能。首先,您需要安装OpenSSL库。然后,您可以使用ssl模块中的函数来创建SSL上下文、加载证书和密钥,并使用它们进行加密和解密操作。

2. 如何使用Python中的OpenSSL生成自签名证书?

生成自签名证书可以让您在开发和测试环境中使用加密功能。您可以使用Python的ssl模块和OpenSSL生成自签名证书。首先,您需要生成一个私钥和一个自签名的证书请求。然后,使用这些请求生成自签名证书。最后,您可以使用生成的证书进行加密和解密操作。

3. 如何使用Python中的OpenSSL进行HTTPS请求?

在Python中使用OpenSSL进行HTTPS请求可以确保通信的安全性。您可以使用Python的ssl模块和OpenSSL来发送HTTPS请求。首先,您需要创建一个SSL上下文,加载证书和密钥。然后,使用这个SSL上下文来发送HTTPS请求。您可以使用Python的requests库来发送带有SSL上下文的HTTPS请求,并获取响应数据。

文章包含AI辅助创作,作者:Edit2,如若转载,请注明出处:https://docs.pingcode.com/baike/742832

(0)
Edit2Edit2
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部