不是您正在使用的特定工具,但如果您仍然没有答案或其他人正在尝试使用 ecdsa 和 saml,它可能会有所帮助
Perl 的 XML::Sig 模块:
安装:sudo cpan XML::Sig
测试 t/015_ecdsa_signing.t,我将包括一个修改版本,以两种不同的方式打印 XML,做你想要的。
如您所见,它针对 xmlsec1 的实现测试签名的第一个版本。第二个版本可能是不太受支持的版本。XML::Sec 也可以验证任一版本。
我不记得我是否使用 ecdsa 测试过 Perl 的 Net::SAML2,但它使用相同版本的 XML::Sig 并且可以正常工作(可能需要进行调整)。
请注意此示例签名'<foo ID="123"></foo>'
,但您只需传递 AuthnRequest,它将签署任何包含 ID=somevalue 的标签
use strict;
use warnings;
use Test::More tests => 8;
use XML::Sig;
use File::Which;
my $sig = XML::Sig->new( { digest_hash => 'sha256', sig_hash => 'sha256', key => 't/ecdsa.private.pem', cert => 't/ecdsa.public.pem' } );
isa_ok( $sig, 'XML::Sig' );
my $signed = $sig->sign('<foo ID="123"></foo>');
ok($signed, "XML Signed Sucessfully using ecdsa key");
$sig = XML::Sig->new( );
my $is_valid = $sig->verify( $signed );
ok( $is_valid == 1, "XML::Sig signed Validated using X509Certificate");
ok( (open XML, '>', 't/tmp.xml'), "File opened for write");
print XML $signed;
close XML;
SKIP: {
skip "xmlsec1 not installed", 1 unless which('xmlsec1');
my $verify_response = `xmlsec1 --verify --trusted-pem t/ecdsa.public.pem --id-attr:ID "foo" t/tmp.xml 2>&1`;
ok( $verify_response =~ m/^OK/, "ECDSA Response is verified using xmlsec1" )
or warn "calling xmlsec1 failed: '$verify_response'\n";
if ($verify_response =~ m/^OK/) {
unlink 't/tmp.xml';
} else{
print $signed;
die;
}
}
print "\n==================================\n", $signed, "\n==================================\n";
$sig = XML::Sig->new( { digest_hash => 'sha256', sig_hash => 'sha256', key => 't/ecdsa.private.pem' } );
isa_ok( $sig, 'XML::Sig' );
$signed = $sig->sign('<foo ID="123"></foo>');
ok($signed, "XML Signed Sucessfully using ecdsa key");
print "\n==================================\n", $signed, "\n==================================\n";
$sig = XML::Sig->new( );
$is_valid = $sig->verify( $signed );
ok( $is_valid == 1, "XML::Sig signed Validated using ECDSAKey");
done_testing;