【问题标题】:Opening and checking a Pem file in SWI-Prolog在 SWI-Prolog 中打开和检查 Pem 文件
【发布时间】:2017-06-12 10:26:46
【问题描述】:

我如何打开 Pem 文件以检查 a) 'Not before' 和 'Not after' 日期是否正常,以及 b) 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).

失败了。正确的论点是什么?

【问题讨论】:

    标签: ssl prolog swi-prolog pem


    【解决方案1】:

    您可以将http_open/3load_certificate/2 结合使用:

    ?- 网址(网址), http_open(网址,流,[]), load_certificate(流,证书), 地图列表(肖像子句,证书)。

    产量:

    版本(0)。 之前(1345613214)。 之后(1503293214)。 串行('0DFA')。 主题(['C'='JP','ST'='东京','O'='Frank4DD','CN'='www.example.com'])。 哈希(“071CB94F0CC8514D024124708EE8B2687BD7D9D5”)。 签名( “14B64CBB817933E671A4DA516FCB081D8D60ECBC18C7734759B1F22048BB61FAFC4DAD898DD121EBD5D8E5BAD6A636FD745083B60FC71DDF7DE52E817F45E09FE23E79EED73031C72072D9582E2AFE125A3445A119087C89475F4A95BE23214A5372DA2A052F2EC970F65BFAFDDFB431B2C14A9C062543A1E6B41E7F869B1640”)。 签名算法('RSA-SHA1')。 等等

    检查issuer_name/1 元素以获取颁发者。您可以再次使用 load_certificate/2 从文件中读取更多证书。

    请注意,验证证书链的更典型方法是建立安全连接(通过 HTTPS),然后在流上使用 ssl_peer_certificate/2ssl_peer_certificate_chain/2 来获取对等证书和证书链。

    要验证链,您必须验证 signature/1 字段,其中包含证书的 to_be_signed/1 部分的数字签名,由各自的颁发者签名。

    您可以使用library(crypto) 来验证签名。

    【讨论】:

    • 再次感谢知识渊博的回答。我不遵循验证链的部分 - 如果你不能告诉我我是这个的初学者!我假设我使用rsa_verify/4 并将选项类型设置为在每个证书的signature_algorithm/1 术语中找到的内容。但是如何输入密钥、签名和数据呢?我会用我写的代码和我得到的错误来更新我的问题。
    • 请提交一个新问题以验证证书链。谢谢!
    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多