在最新版本的Swi中验证签名链SWI-Prolog 2-不同?

use*_*815 4 ssl prolog pem swi-prolog

跟进来自/sf/answers/3116723991/?noredirect=1

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


url2('https://s3.amazonaws.com/echo.api/echo-api-cert-4.pem').

get_pem(Url,Certs):-
 setup_call_cleanup(
           http_open(Url,Stream,[]),
           ssl_peer_certificate_chain(Stream,Certs),
           close(Stream)
          ).

test(Key):-
 url2(U),
 get_pem(U,[A|Certs]),
 checkcertvalid_time(A),
 checkchain([A|Certs]),
 memberchk(key(Key),A).


 checkcertvalid_time(Acert):-
%what about The domain echo-api.amazon.com is present in the Subject   Alternative Names (SANs) section of the signing certificate
 memberchk(notbefore(NotBefore),Acert),
 memberchk(notafter(NotAfter),Acert),
 get_time(NowA),
 Now is round(NowA),
 Now #>NotBefore,
 Now #<NotAfter.

checkchain(Chain):-
 length(Chain,L),
 L#>1, %Insure chain has more than one cert
 checkchain_h(Chain).

checkchain_h([_]). %Reached the root.
checkchain_h([C1,C2|Rest]):-
 memberchk(signature(Sig),C1),
 memberchk(to_be_signed(Signed),C1),
 memberchk(key(Key),C2),
 hex_bytes(Signed,Bytes),
 crypto_data_hash(Bytes,Hash,[algorithm(sha256),encoding(octet)]),
 rsa_verify(Key,Hash,Sig,[type(sha256)]),
 checkchain_h([C2|Rest]).
Run Code Online (Sandbox Code Playgroud)

如果我打电话,test/1那么这段代码在7.5.3-1-g647ce9a中有效但在7.5.9中有效.7.5.9 checkchain_h/1memberchk(to_be_signed(Signed),C1)调用时失败.

这是在两台不同的计算机上测试的.是否有可能导致这种差异的外部软件?

另外据我所知,还应该有一个'subject_alternative_name'字段,我无法看到.

更新:在7.5.9:

OpenSSL 1.0.1t  3 May 2016

?- use_module(library(ssl)), current_prolog_flag(ssl_library_version, V).
 V = 'OpenSSL 1.0.1t  3 May 2016'.
Run Code Online (Sandbox Code Playgroud)

在7.5.3-1-g647ce9a上:

OpenSSL 1.0.2g  1 Mar 2016

?- use_module(library(ssl)), current_prolog_flag(ssl_library_version, V).
V = 'OpenSSL 1.0.2g  1 Mar 2016'.
Run Code Online (Sandbox Code Playgroud)

mat*_*mat 5

这是由于您使用的OpenSSL库版本的不同.

请参阅load_certificate/2证书结构中当前可用字段以及在何种条件下的文档.

特别是:

使用OpenSSL 1.0.2和更高版本,to_be_signed/1也可用,产生证书的TBS(待签名)部分的十六进制表示.

对于您在其中一台计算机上使用的OpenSSL 1.0.1,此字段不可用.

顺便说一句,请注意不再支持 OpenSSL 1.0.1 !我强烈建议您在两台计算机上升级OpenSSL的安装.

至于您的其他问题,主题替代名称目前尚未在证书结构中提供.它们当然可以在将来使用!请密切关注最新版本的SWI文档,以便随时查看当前可用的内容.