验证签名链 SWI-Prolog 2- 与最新版本的 Swi 不同?
Verifying a signature chain SWI-Prolog 2- different in latest version of Swi?
跟进
:-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]).
如果我调用 test/1
,则此代码在 7.5.3-1-g647ce9a 中有效,但在 7.5.9 中中断。在 7.5.9 中,调用 memberchk(to_be_signed(Signed),C1)
时 checkchain_h/1
失败。
这是在两台不同的计算机上测试的,不是同一台计算机。是否有可能导致这种差异的外部软件?
此外,据我所知,还应该有一个 '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'.
在 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'.
这是因为您使用的 OpenSSL 库版本 不同。
请参阅 load_certificate/2
的文档,了解当前在证书结构中可用的字段以及在什么条件下可用。
特别是:
With OpenSSL 1.0.2 and greater, to_be_signed/1 is also available, yielding the hexadecimal representation of the TBS (to-be-signed) portion of the certificate.
对于您在其中一台机器上使用的 OpenSSL 1.0.1,此字段不可用。
顺便说一句,请注意 OpenSSL 1.0.1 是 no longer supported!我强烈建议您升级 两台 机器上的 OpenSSL 安装。
关于您的其他问题,主题备用名称目前在证书结构中不可用。它们当然可能在未来可用!请随时关注最新版本的 SWI 文档,以了解当前可用的内容。
跟进
:-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]).
如果我调用 test/1
,则此代码在 7.5.3-1-g647ce9a 中有效,但在 7.5.9 中中断。在 7.5.9 中,调用 memberchk(to_be_signed(Signed),C1)
时 checkchain_h/1
失败。
这是在两台不同的计算机上测试的,不是同一台计算机。是否有可能导致这种差异的外部软件?
此外,据我所知,还应该有一个 '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'.
在 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'.
这是因为您使用的 OpenSSL 库版本 不同。
请参阅 load_certificate/2
的文档,了解当前在证书结构中可用的字段以及在什么条件下可用。
特别是:
With OpenSSL 1.0.2 and greater, to_be_signed/1 is also available, yielding the hexadecimal representation of the TBS (to-be-signed) portion of the certificate.
对于您在其中一台机器上使用的 OpenSSL 1.0.1,此字段不可用。
顺便说一句,请注意 OpenSSL 1.0.1 是 no longer supported!我强烈建议您升级 两台 机器上的 OpenSSL 安装。
关于您的其他问题,主题备用名称目前在证书结构中不可用。它们当然可能在未来可用!请随时关注最新版本的 SWI 文档,以了解当前可用的内容。