gpt4 book ai didi

php - 根据 PHP 中的证书验证 SAML 响应中的数字签名

转载 作者:IT王子 更新时间:2023-10-28 23:53:36 27 4
gpt4 key购买 nike

我是 SSL 证书方面的新手。所以对我到目前为止所做的事情有点谨慎。我正在创建一个应用程序,该应用程序使用 SSO 对使用 PHP 5.4 的用户进行身份验证。我有的: 一方提供的证书 (.pfx)。 POST 变量中的加密 SAML。

解密后的xml和SAML: Why is the certificate within the Signature?差不多

我需要验证响应是否来自经过验证的提供商。我在谷歌搜索时了解到我需要 .pem 而不是 .pfx,因此我使用 ssl 命令将 .pfx 文件转换为 .pem。我使用了 http://www.php.net/manual/es/function.openssl-verify.php#62526 中的代码.这是我的代码。

$encxml=$_POST['SAMLResponse'];
$xml = new SimpleXMLElement(base64_decode($encxml));
$signature = ((string)$xml->Signature->SignatureValue);
var_dump($signature);


//do I need to do something with this X509Certificate value embedded in xml??
$cert = ((string)$xml->Signature->KeyInfo->X509Data->X509Certificate);
var_dump($cert);

//Or I need
$fp = fopen("xyz.pem", "r");
$priv_key = fread($fp, 8192);
fclose($fp);
print_r($priv_key);
$ok = openssl_verify($xml, $signature, $priv_key);

那么我应该忽略嵌入在 xml 中的 X509Certificate 还是我还需要检查它... openssl_verify 就足够了吗?我在正确的道路上吗?请提供任何指导。

最佳答案

使用 xmldsig 签名的 XML语法有 3 个重要部分:

  1. Signature -> KeyInfo 包含有关从用于签署数据的私钥派生的公钥的信息
  2. Signature -> SignedInfo 包含将要使用上述私钥签名的数据;数据包含有关应如何计算验证的信息,例如:CanonicalizationMethodSignatureMethodReference
  3. Signature -> SignatureValue包含用私钥签署Signature -> SignedInfo生成的签名值

理论上,这是代码应该如何寻找 rsa-sha1 算法(由 Signature -> SignedInfo -> SignatureMethod 指定),具有以下规范化方法:Exclusive XML Canonicalization 1.0(省略注释) , 以及提供的 x509 证书:

$xmlDoc = new DOMDocument();
$xmlDoc->loadXML($xmlString);

$xpath = new DOMXPath($xmlDoc);
$xpath->registerNamespace('secdsig', 'http://www.w3.org/2000/09/xmldsig#');

// fetch Signature node from XML
$query = ".//secdsig:Signature";
$nodeset = $xpath->query($query, $xmlDoc);
$signatureNode = $nodeset->item(0);

// fetch SignedInfo node from XML
$query = "./secdsig:SignedInfo";
$nodeset = $xpath->query($query, $signatureNode);
$signedInfoNode = $nodeset->item(0);

// canonicalize SignedInfo using the method descried in
// ./secdsig:SignedInfo/secdsig:CanonicalizationMethod/@Algorithm
$signedInfoNodeCanonicalized = $signedInfoNode->C14N(true, false);

// fetch the x509 certificate from XML
$query = 'string(./secdsig:KeyInfo/secdsig:X509Data/secdsig:X509Certificate)';
$x509cert = $xpath->evaluate($query, $signatureNode);
// we have to re-wrap the certificate from XML to respect the PEM standard
$x509cert = "-----BEGIN CERTIFICATE-----\n"
. $x509cert . "\n"
. "-----END CERTIFICATE-----";
// fetch public key from x509 certificate
$publicKey = openssl_get_publickey($x509cert);

// fetch the signature from XML
$query = 'string(./secdsig:SignatureValue)';
$signature = base64_decode($xpath->evaluate($query, $signatureNode));

// verify the signature
$ok = openssl_verify($signedInfoNodeCanonicalized, $signature, $publicKey);

这个库在 php 中实现 xmldsig 方面做得很好:xmlseclibs ;可以在此处找到如何验证 xmldsig 的示例:https://github.com/robrichards/xmlseclibs/blob/master/tests/xmlsec-verify.phpt .该库还验证来自 Signature -> SignedInfo -> Reference 的摘要值,这是我在上面省略的一个步骤。

关于php - 根据 PHP 中的证书验证 SAML 响应中的数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19538561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com