【问题标题】:How to sign SAML 2.0 AuthnRequest with ECDSA (​NIST Curve P-256/​ SHA-256) in PHP如何在 PHP 中使用 ECDSA(NIST 曲线 P-256/SHA-256)签署 SAML 2.0 AuthnRequest
【发布时间】:2019-08-15 05:47:00
【问题描述】:

我需要在 PHP 中使用 ECDSA(​NIST Curve P-256/​SHA-256)签署 SAML 2.0 AuthnRequest。

要创建 SAML 2.0 AuthnRequest,我使用的是 https://github.com/simplesamlphp/simplesamlphp

我有一个私钥

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 Curve P-256/SHA-256

我已经完全按照https://github.com/phpecc/phpecc/blob/HEAD/examples/creating_signature.php 的方式实现了这个示例,但是我从请求接收者那里得到了错误。

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

我做错了什么? 我使用了错误的库吗? 是否有供应商支持此案例?

【问题讨论】:

    标签: php saml-2.0 elliptic-curve ecdsa xml-dsig


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-08-07
      • 2019-02-12
      • 2022-08-16
      • 2022-01-18
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 2017-02-24
      • 2021-10-29
      相关资源
      最近更新 更多