如何在 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 算法。
我正在尝试设置
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 算法。