2017-06-12 3 views
4

Wie öffne ich eine Pem-Datei, um zu überprüfen, a) dass die Daten 'Nicht vor' und 'Nicht nach' in Ordnung sind und b) dass es eine Kette von Zertifikaten gibt PEM-Datei an eine Route Zertifizierungsstelle?Öffnen und Überprüfen einer Pem-Datei in SWI-Prolog

Ich habe versucht:

:-use_module(library(http/http_client)). 

url('http://fm4dd.com/openssl/source/PEM/certs/512b-rsa-example-cert.pem'). 

url_data(Url,D):- 
http_get(Url,D,[to(string)]). 

url_data1(Url,Certificate):- 
http_get(Url,D,[to(stream(Stream))]), 
load_certificate(Stream, Certificate), 
close(Stream). 

url_data/1 in arbeitet, dass sie die pem-Datei als String zurückgibt. Aber url_data1/1 funktioniert nicht. Es ist beabsichtigt, jedes Zertifikat als eine Liste von Begriffen zurückzugeben.

* Update *

ich habe:

url_data1(Url,Certs):- 
http_open(Url,Stream,[]), 
all_certs(Stream,Certs), 
forall(member(C,Certs),my_validate(C)), 
close(Stream). 

all_certs(Stream,[C1|Certs]):- 
catch(load_certificate(Stream,C1),_,fail), 
all_certs(Stream,Certs),!. 
all_certs(_Stream,[]). 

my_validate(C):- 
memberchk(to_be_signed(Signed),C), 
memberchk(key(Key),C), 
memberchk(signature(Signature),C), 
memberchk(signature_algorithm(A),C), 
algo_code(A,Code), 
rsa_verify(Key,Signed,Signature,[type(Code)]). 

algo_code('RSA-SHA256',sha256). 
algo_code('RSA-SHA1',sha1). 

Welche ausfällt. Was sind die richtigen Argumente?

Antwort

3

Sie können http_open/3 in Kombination mit load_certificate/2 verwenden:

 
?- url(Url), 
    http_open(Url, Stream, []), 
    load_certificate(Stream, Certificate), 
    maplist(portray_clause, Certificate). 

Nachgeben:

 
version(0). 
notbefore(1345613214). 
notafter(1503293214). 
serial('0DFA'). 
subject(['C'='JP', 'ST'='Tokyo', 'O'='Frank4DD', 'CN'='www.example.com']). 
hash("071CB94F0CC8514D024124708EE8B2687BD7D9D5"). 
signature("14B64CBB817933E671A4DA516FCB081D8D60ECBC18C7734759B1F22048BB61FAFC4DAD898DD121EBD5D8E5BAD6A636FD745083B60FC71DDF7DE52E817F45E09FE23E79EED73031C72072D9582E2AFE125A3445A119087C89475F4A95BE23214A5372DA2A052F2EC970F65BFAFDDFB431B2C14A9C062543A1E6B41E7F869B1640"). 
signature_algorithm('RSA-SHA1'). 
etc. 

Überprüfen Sie das issuer_name/1 Element des Emittenten zu erhalten. Sie können load_certificate/2 erneut verwenden, um weitere Zertifikate aus der Datei   zu lesen.

beachten, dass eine viel typische Weise die Zertifikatkette zu validieren ist, eine sichere   Verbindung herzustellen (über   HTTPS) und dann ssl_peer_certificate/2 oder ssl_peer_certificate_chain/2 auf dem   Strom zu verwenden, um das Peer-Zertifikat und das Zertifikat zu erhalten   Kette.

die Kette validieren, um die signature/1 Felder überprüfen muss, die die digitalen Signaturen der to_be_signed/1 Teile des Zertifikats enthalten, die von den jeweiligen   Emittenten unterzeichnet.

Sie können library(crypto) verwenden, um die Signaturen zu überprüfen.

+0

Danke noch einmal für die sachkundige Antwort. Ich folge nicht dem Abschnitt über die Validierung der Kette - Wenn Sie nicht sagen, ich bin ein Anfänger mit diesem! Ich nehme an, dass ich 'rsa_verify/4' benutze, wobei der Optionstyp auf den Begriff 'signature_algorithm/1' jedes Zertifikats gesetzt ist. Aber wie kann man Schlüssel, Unterschrift und Daten eingeben? Ich werde meine Frage mit dem Code, den ich geschrieben habe, und dem Fehler, den ich bekomme, aktualisieren. – user27815

+0

Bitte legen Sie eine neue Frage zur Überprüfung der Zertifikatskette an. Vielen Dank! – mat

Verwandte Themen