Imported certificate loading
This commit is contained in:
parent
cac7356abb
commit
b8b32fe189
1 changed files with 50 additions and 0 deletions
50
TPs/TP05/sig_fich.py
Normal file
50
TPs/TP05/sig_fich.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
from cryptography import x509
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
def cert_load(fname):
|
||||||
|
""" lê certificado de ficheiro """
|
||||||
|
with open(fname, "rb") as fcert:
|
||||||
|
cert = x509.load_pem_x509_certificate(fcert.read())
|
||||||
|
return cert
|
||||||
|
|
||||||
|
def cert_validtime(cert, now=None):
|
||||||
|
""" valida que 'now' se encontra no período
|
||||||
|
de validade do certificado. """
|
||||||
|
if now is None:
|
||||||
|
now = datetime.datetime.now(tz=datetime.timezone.utc)
|
||||||
|
if now < cert.not_valid_before_utc or now > cert.not_valid_after_utc:
|
||||||
|
raise x509.verification.VerificationError("Certificate is not valid at this time")
|
||||||
|
|
||||||
|
def cert_validsubject(cert, attrs=[]):
|
||||||
|
""" verifica atributos do campo 'subject'. 'attrs'
|
||||||
|
é uma lista de pares '(attr,value)' que condiciona
|
||||||
|
os valores de 'attr' a 'value'. """
|
||||||
|
print(cert.subject)
|
||||||
|
for attr in attrs:
|
||||||
|
if cert.subject.get_attributes_for_oid(attr[0])[0].value != attr[1]:
|
||||||
|
raise x509.verification.VerificationError("Certificate subject does not match expected value")
|
||||||
|
|
||||||
|
def cert_validexts(cert, policy=[]):
|
||||||
|
""" valida extensões do certificado. 'policy' é uma lista de pares '(ext,pred)' onde 'ext' é o OID de uma extensão e 'pred'
|
||||||
|
o predicado responsável por verificar o conteúdo dessa extensão. """
|
||||||
|
for check in policy:
|
||||||
|
ext = cert.extensions.get_extension_for_oid(check[0]).value
|
||||||
|
if not check[1](ext):
|
||||||
|
raise x509.verification.VerificationError("Certificate extensions does not match expected value")
|
||||||
|
|
||||||
|
def valida_certALICE(ca_cert):
|
||||||
|
try:
|
||||||
|
cert = cert_load("ALICE.crt")
|
||||||
|
# obs: pressupõe que a cadeia de certifica só contém 2 níveis
|
||||||
|
cert.verify_directly_issued_by(ca_cert)
|
||||||
|
# verificar período de validade...
|
||||||
|
cert_validtime(cert)
|
||||||
|
# verificar identidade... (e.g.)
|
||||||
|
cert_validsubject(cert, [(x509.NameOID.COMMON_NAME, "ALICE")])
|
||||||
|
# verificar aplicabilidade... (e.g.)
|
||||||
|
#cert_validexts(cert, [(x509.ExtensionOID.EXTENDED_KEY_USAGE, lambda e: x509.oid.ExtendedKeyUsageOID.CLIENT_AUTH in e)])
|
||||||
|
#print("Certificate is valid!")
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
#print("Certificate is invalid!")
|
||||||
|
return False
|
Loading…
Reference in a new issue