我花了很长时间才弄清楚,但我仍然很惊讶我找不到任何关于此的文档。关键是看看mitmproxy 是如何创建这个文件的。
我创建了自己的简化版他们的技术。这是您mitmproxy-ca.pem
使用 python 生成自己的自定义文件的方式:
import datetime
from cryptography import x509
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.x509 import ExtendedKeyUsageOID, NameOID
KEY_SIZE = 2048
CA_EXPIRY = datetime.timedelta(days=10 * 365)
ORGANIZATION = "anything"
CN = "anything"
def create_ca():
now = datetime.datetime.now()
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=KEY_SIZE,
)
name = x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, CN),
x509.NameAttribute(NameOID.ORGANIZATION_NAME, ORGANIZATION)
])
builder = x509.CertificateBuilder()
builder = builder.serial_number(x509.random_serial_number())
builder = builder.subject_name(name)
builder = builder.not_valid_before(now - datetime.timedelta(days=2))
builder = builder.not_valid_after(now + CA_EXPIRY)
builder = builder.issuer_name(name)
builder = builder.public_key(private_key.public_key())
builder = builder.add_extension(x509.BasicConstraints(
ca=True, path_length=None), critical=True)
builder = builder.add_extension(x509.ExtendedKeyUsage(
[ExtendedKeyUsageOID.SERVER_AUTH]), critical=False)
builder = builder.add_extension(
x509.KeyUsage(
digital_signature=False,
content_commitment=False,
key_encipherment=False,
data_encipherment=False,
key_agreement=False,
key_cert_sign=True,
crl_sign=True,
encipher_only=False,
decipher_only=False,
), critical=True)
builder = builder.add_extension(x509.SubjectKeyIdentifier.from_public_key(
private_key.public_key()), critical=False)
cert = builder.sign(private_key=private_key,
algorithm=hashes.SHA256())
return private_key, cert
现在您已经生成了密钥和正确配置的证书,您可以将它们组合起来并将其写入.pem
文件:
key, ca = create_ca() # to run the function above
key = key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=serialization.NoEncryption(),
)
ca = ca.public_bytes(serialization.Encoding.PEM)
pem_content = key+ca
with open("mitmproxy-ca.pem", "wb") as w:
w.write(pem_content)
您应该将此mitmproxy-ca.pem
文件放在一个目录中,然后使用 mitmproxy--set confdir=/certdir
选项引用该目录。
您可能还希望将证书分发给客户端,以便他们可以安装它。您应该只分发证书。像这样:
key, ca = create_ca() # from earlier, do not repeat
with open("cert_to_install.pem", "wb") as w:
w.write(ca)
需要明确的是,这是您安装在 iPhone/Android 手机或计算机上的文件。
奖励:
要验证您的mitmproxy-ca.pem
文件是否可用,mitmproxy 文档建议您使用以下命令进行验证:
openssl x509 -noout -text -in mitmproxy-ca.pem
输出应包含:
X509v3 extensions:
X509v3 Key Usage: critical
Certificate Sign
X509v3 Basic Constraints: critical
CA:TRUE