首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP语言中用ECDSA (​NIST Curve P-256/​SHA-256)对SAML2.0 AuthnRequest进行签名

如何在PHP语言中用ECDSA (​NIST Curve P-256/​SHA-256)对SAML2.0 AuthnRequest进行签名
EN

Stack Overflow用户
提问于 2019-03-25 09:07:36
回答 1查看 395关注 0票数 2

我需要在​中用ECDSA (​NIST Curve P-256/​SHA-256)签署SAML2.0SHA。

为了创建SAML2.0 AuthnRequest,我使用了https://github.com/simplesamlphp/simplesamlphp

我有一把私钥

代码语言:javascript
复制
Private-Key: (256 bit)
priv:
    0d:.....
pub:
    04:....
ASN1 OID: prime256v1
NIST CURVE: P-256

为了创建签名,我使用https://github.com/phpecc/phpecc,因为https://github.com/robrichards/xmlseclibs似乎不支持NIST曲线P-256/​SHA-256

我已经准确地实现了这个例子,它是https://github.com/phpecc/phpecc/blob/HEAD/examples/creating的,但是我从request reciver那里得到了错误。

我可以从哪里获得,或者如何创建<ds:DigestValue>...</ds:DigestValue>

我做错了什么?我是否使用了错误的库?是否有一家供应商支持这种情况?

EN

回答 1

Stack Overflow用户

发布于 2021-11-06 13:14:12

不是您正在使用的特定工具,但如果您仍然没有答案,或者其他人正在尝试使用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的标记进行签名

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55330120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档