如何在 simplesamlphp 中为 idp 设置不同的摘要算法和签名算法

How do I set different digest algorithm and signature algorithm for an idp in simplesamlphp

我正在尝试设置

DigestMethod 算法到

http://www.w3.org/2001/04/xmlenc#sha256

和 SignatureMethod 算法到

http://www.w3.org/2000/09/xmldsig#rsa-sha1

我设置了

'metadata.sign.algorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'

'signature.algorithm' => 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'

我从更新日志中看到 metadata.sign.algorithm 作为摘要算法被引入。然而,摘要算法和签名算法似乎都取自值signature.algorithm。我正在使用 SimpleSamlP v1.18.4.

在此先感谢您的帮助。

我发现 https://github.com/simplesamlphp/simplesamlphp/blob/simplesamlphp-1.18/lib/SimpleSAML/Metadata/Signer.php use metadata.sign.algorithm for signing metadata and signature.algorithm used by https://github.com/simplesamlphp/simplesamlphp/blob/simplesamlphp-1.18/modules/saml/lib/Message.php 可以签署来自服务提供商 (SP) 的任何消息。

你是否在配置中设置了metadata.sign.algorithm的所有相关配置?

'metadata.sign.enable' => false,
'metadata.sign.privatekey' => null,
'metadata.sign.privatekey_pass' => null,
'metadata.sign.certificate' => null,
'metadata.sign.algorithm' => null,

摘要算法将基于签名算法,至少在 simpleSAMLphp 1.18.4 中这是开箱即用的。如果将 signature.algorithm 设置为 http://www.w3.org/2001/04/xmldsig-more#rsa-sha256,您将获得 http://www.w3.org/2001/04/xmlenc#sha256 作为摘要算法。这是您最好的选择。

更详细:

底层的 XML 数字签名规范并未说明摘要算法(DigestMethod 元素)必须依赖于或派生自签名算法(SignatureMethod 元素)。在实践中,许多 XML 数字签名库 基于签名算法的摘要算法作为默认选项。一些库允许操纵这些默认值,而另一些则不允许。 simpleSAMLphp 使用 xmlseclibs 中的 XMLSecurityKey 来计算签名。这是来自 xmlseclibs 3.0.4 的 XMLSecurityKey 的构造函数,simpleSAMLphp 1.18.4 依赖于:

   case (self::RSA_SHA256):
                $this->cryptParams['library'] = 'openssl';
                $this->cryptParams['method'] = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256';
                $this->cryptParams['padding'] = OPENSSL_PKCS1_PADDING;
                $this->cryptParams['digest'] = 'SHA256';
                if (is_array($params) && ! empty($params['type'])) {
                    if ($params['type'] == 'public' || $params['type'] == 'private') {
                        $this->cryptParams['type'] = $params['type'];
                        break;
                    }
                }

如您所见,如果它将 RSA-SHA256 视为签名算法,则会将摘要算法设置为 SHA256。 digest/signature 算法可以在构造后更改,但 simpleSAMLphp 不会那么远。

SAML 有一个 profile that allows algorithms (including signature and digest) to be declared in metadata. The lower-level saml PHP library apparently supports 这个配置文件。如果您不害怕使用这个库来实现您自己的实现,您可以试一试。

看起来 SimpleSamlPHP 不允许这样做。但是我在 SAML2 库中修补了 Utils.php 以使其正常工作

diff --git a/src/SAML2/Utils.php b/src/SAML2/Utils.php
index e894a3e..4894f84 100644
--- a/src/SAML2/Utils.php
+++ b/src/SAML2/Utils.php
@@ -339,6 +339,11 @@ class Utils
                 $type = XMLSecurityDSig::SHA1;
         }

+        // Patch to get SimpleSAMLPHP to return different
+        // algorithms for signature and digest
+        // to address Login.gov logout issue.
+        $type = XMLSecurityDSig::SHA256;
+
         $objXMLSecDSig->addReferenceList(
             [$root],
             $type,

我在配置中将签名算法设置为 SHA1,并通过 composer 应用了这个补丁,让摘要使用 SHA256 算法。