2017-06-12 71 views
4

如何打開Pem文件來檢查a)'Not before'和'Not after'日期是否正常,以及b)是否存在一個證書鏈pem文件到路由證書頒發機構?打開並檢查SWI-Prolog中的Pem文件

我曾嘗試:

:-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工作在它返回的PEM文件作爲一個字符串。但url_data1/1不起作用。它旨在將每個證書作爲條目列表返回。

*更新*

我:

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). 

哪些失敗。什麼是正確的論點?

回答

3

您可以結合使用http_open/3load_certificate/2

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

產量:

 
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. 

檢查issuer_name/1元素獲得發行人。您可以再次使用load_certificate/2從 文件中讀取更多證書。

注意,一個更典型的方式來驗證該證書鏈是建立安全 連接(經由  HTTPS),然後使用ssl_peer_certificate/2ssl_peer_certificate_chain/2上 流以獲得所述對等證書和證書 鏈。

要驗證該鏈,您必須驗證signature/1字段,其​​中包含由相應的 發行人簽署的to_be_signed/1部分證書的數字簽名。您可以使用library(crypto)來驗證簽名。

+0

再次感謝有見識的回答。 我不關注驗證鏈 - 如果你不能告訴我這是一個初學者!我假設我使用'rsa_verify/4',並將選項類型設置爲每個證書的'signature_algorithm/1'項中的內容。但是如何輸入密鑰,簽名和數據呢?我將用我寫的代碼和我得到的錯誤更新我的問題。 – user27815

+0

請提交一個用於驗證證書鏈的新問題。謝謝! – mat