过期证书验成什么
按证书模型,过期证书(nb=100、na=200)在 now=500 访问,verify 交回什么?
贯穿本节的证书模型:一张证书是 dict(cn, issuer, nb, na)——发给谁(cn)、谁签的(issuer)、有效期 [nb, na)。is_self_signed=主体与签发者同名,expired(cert, now)=不在有效期,host_ok(cert, host)=cn 与访问域名一致,trusted=签发 CA 在受信列表 {MyCA, RootCA}。verify(cert, host, now) 按先有效期、再域名、再受信的顺序,交回 过期/域名不符/不受信/ok。
# 一张证书:给谁发的(cn)、谁签的(issuer)、有效期[nb,na)、签发它的 CA
def cn_of(cert):
return cert["cn"]
def issuer_of(cert):
return cert["issuer"]
def is_self_signed(cert):
# 自己签给自己:主体和签发者是同一个名字
return cert["cn"] == cert["issuer"]
def expired(cert, now):
# 不在有效期内就算过期(含还没生效)
return not (cert["nb"] <= now < cert["na"])
def host_ok(cert, host):
# 证书上的名字要和你访问的域名对得上
return cert["cn"] == host
TRUSTED = {"MyCA", "RootCA"}
def trusted(cert):
# 签发它的 CA 在受信任列表里
return cert["issuer"] in TRUSTED
def verify(cert, host, now):
# 浏览器验证证书的顺序:先看有效期、再看域名、再看是否受信
if expired(cert, now):
return "过期"
if not host_ok(cert, host):
return "域名不符"
if not trusted(cert):
return "不受信"
return "ok"
cert = dict(cn="e.local", issuer="MyCA", nb=100, na=200)
print(verify(cert, "e.local", 500))
全部评论