python生成免费的ssl证书

测试SSL证书不需要验证域名权限 

执行  pip install cryptography

from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption
import datetime

#pip install cryptography

# Generate RSA key pair
key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
)

domain="你的域名"

# Create a self-signed certificate
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"Company"),
    x509.NameAttribute(NameOID.COMMON_NAME, u""+domain+""),
])
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=365)
).add_extension(
    x509.SubjectAlternativeName([x509.DNSName(u""+domain+"")]),
    critical=False,
).sign(key, hashes.SHA256())

# Write the private key and certificate to files
with open("key.pem", "wb") as f:
    f.write(key.private_bytes(
        encoding=Encoding.PEM,
        format=PrivateFormat.TraditionalOpenSSL,
        encryption_algorithm=NoEncryption()
    ))

with open("cert.pem", "wb") as f:
    f.write(cert.public_bytes(Encoding.PEM))

生成可信任的SSL证书 需要在域名服务器执行

ubutu  sudo apt-get install certbot

centos yum isntall  certbot

import subprocess

#sudo apt-get install certbot
#默认生成证书路径 /etc/letsencrypt/live/yourdomain.com/

def generate_ssl_cert(domain, email, webroot_path, cert_path):
    try:
        command = [
            "sudo", "certbot", "certonly",
            "--webroot",
            "--webroot-path", webroot_path,
            "--cert-path", cert_path,
            "--non-interactive",
            "--agree-tos",
            "--email", email,
            "-d", domain
        ]
        subprocess.run(command, check=True)
        print(f"SSL 证书已为 {domain} 生成,保存在 {cert_path} 中")
    except subprocess.CalledProcessError as e:
        print(f"生成 SSL 证书时出错: {e}")

# 示例使用
generate_ssl_cert("yourdomain.com", "yourdomain.com@163.com", "域名指向的路径", "证书生成路径/cert.pem")

NGINX配置

server {
    listen 80;
	listen 443 ssl http2;
    server_name example.com www.example.com;
	
	#强制跳转到https
	if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #证书配置
    ssl_certificate    /www/server/cert/example.com/fullchain.pem;
    ssl_certificate_key    /www/server/cert/example.com/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;
	 #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }
	access_log  /www/wwwlogs/example.log;
    error_log  /www/wwwlogs/example.error.log;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Pythonssl进行加密通信并生成证书,需要遵循以下步骤: 1. 安装openssl和pyopenssl 确保您的计算机上已经安装了openssl和pyopenssl。如果没有,请先安装它们。 2. 生成自签名证书 使用openssl生成自签名证书: ``` openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 ``` 上述命令会生成一个有效期为1年的RSA密钥对,并将其用于生成自签名证书和私钥。这些文件将保存在cert.pem和key.pem中。 3. 编写Python代码 以下是一个示例代码段,演示如何使用Pythonssl进行加密通信: ```python import ssl import socket # 加载证书 context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile="cert.pem", keyfile="key.pem") # 建立连接 conn = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname="localhost") conn.connect(("localhost", 8443)) # 发送和接收消息 conn.send(b"Hello, server!") data = conn.recv(4096) # 关闭连接 conn.shutdown(socket.SHUT_RDWR) conn.close() ``` 此代码片段假定您的服务器正在本地主机上运行,并在端口8443上侦听。您需要相应地更改主机名和端口号。在这个例子中,我们使用Pythonssl创建默认上下文,并使用load_cert_chain方法加载我们的证书和私钥。我们还使用wrap_socket方法将套接字包装在SSL上下文中,以便进行加密通信。 总的来说,使用Pythonssl进行加密通信并生成证书非常简单,只需要遵循上述步骤即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值