gpt4 book ai didi

firefox - 使用相同的自签名 CA 编码多个证书?

转载 作者:太空宇宙 更新时间:2023-11-03 13:12:30 24 4
gpt4 key购买 nike

我正在编写一个拦截代理来监视从我的浏览器发送的请求。使用 https,我正在做的是: 当浏览器发出 CONNECT 请求时,代理连接到该主机并获取其证书。然后,该证书的主题和主题替代名称用于动态生成新证书,该证书呈现给浏览器以与代理建立 SSL 连接。

所有这些新证书都有一个根自签名证书作为颁发者。根证书已在 Firefox 中作为受信任导入。

然而,当我尝试连接时,我仍然收到“不受信任的连接”警告和以下详细信息:

www.google.com uses an invalid security certificate. 
The certificate is not trusted because the issuer certificate is not trusted.
(Error code: sec_error_untrusted_issuer)

我使用的浏览器是Firefox 28.0。我不太明白为什么连接结果不受信任,因为我已经安装了根证书。现在我必须为我访问的每个网站添加一个异常(exception),坦率地说这很烦人并且会减慢一切。

我正在使用 pyOpenSSL 制作证书。我用来制作根证书的代码是:

    from OpenSSL import crypto
CERT_FILE = 'myapp.pem'
KEY_FILE = 'myapp.key'
k = crypto.PKey()
k.generate_key(crypto.TYPE_RSA, 1024)

cert = crypto.X509()
cert.get_subject().O = "Myapp"
cert.get_subject().OU = 'MyApp Root CA'
cert.get_subject().CN = 'MyApp Root CA'
cert.set_serial_number(888)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(10*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(k)
cert.sign(k, 'sha1')

with open(CERT_FILE, "wt") as cf: cf.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
with open(KEY_FILE, "wt") as kf: kf.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))

然后,我使用类似的代码生成特定于域的证书。现在我正在处理一个仅使用 google 的示例,尽管我会在解决此问题后立即使用一些缓存系统。

root_cert = crypto.load_certificate(crypto.FILETYPE_PEM, 'myapp.pem') 
root_key = crypto.load_privatekey(crypto.FILETYPE_PEM, 'myapp.key')
root_issuer = root_cert.get_issuer()

def make_example_cert(pem_data):
if os.path.exists('google.pem'): return #ugly hack to avoid remaking file
#load the certificate received from google
old_cert = crypto.load_certificate(crypto.FILETYPE_PEM, pem_data)
#generate new key and certificate
pkey = crypto.PKey()
pkey.generate_key(crypto.TYPE_RSA, 1024)
new_cert = crypto.X509()
new_cert.gmtime_adj_notBefore(0)
new_cert.gmtime_adj_notAfter(10*365*24*60*60)
#set same subject of old cert
new_cert.set_subject(old_cert.get_subject())
#look for and set SNA of old cert
for i in range(old_cert.get_extension_count()):
ext = old_cert.get_extension(i)
if ext.get_short_name() == 'subjectAltName':
new_cert.add_extensions([ext])
#set root certificate as issuer
new_cert.set_issuer(root_issuer)
new_cert.set_pubkey(pkey)
new_cert.sign(root_key, 'sha1')
certfile = 'google.pem'
keyfile = 'google.key'
with open(certfile, "wt") as cf:
cf.write(crypto.dump_certificate(crypto.FILETYPE_PEM, new_cert))
with open(keyfile, "wt") as kf:
kf.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey))
#append root certificate to chain
with open(certfile, "at") as cf2:
cf2.write(crypto.dump_certificate(crypto.FILETYPE_PEM, root_cert))

return certfile, keyfile

我在这里似乎没有发现主要错误,当我正确查看创建的证书时,它有我自己的证书根作为颁发者。尽管如此,浏览器仍表示它不受信任。如果我将其添加为异常(exception),它会起作用,但对于某些网站,我什至没有该选项,我唯一能做的就是查看详细信息并单击“让我离开这里”。

问题可能出在代码中吗?还是配置浏览器的问题?

最佳答案

如果您的 CA 证书已作为受信任的 CA 导入到 Firefox 中,它应该可以工作。

证书不受信任,因为它是自签名的。”和“证书仅对 MyApp CA Root 有效”表明您显然不是提供您认为自己的服务器证书。

这可能是您的代码中的一个简单错误,导致您发送了错误的证书,或者您可能以错误的顺序发送了链:首先是 CA 证书,而最终实体证书应该是第一个(然后是它的证书) CA,按签名顺序)。

关于firefox - 使用相同的自签名 CA 编码多个证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24487040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com