如何在 LightSAML 中使用随机对称密钥加密断言?

How to encrypt Assertion with a random symmetric key in LightSAML?

我正在 Laravel 框架中使用 LightSAML Core 包实现 IDP。基本上,我需要向收件人发送 SAML 响应,但是我需要实施对称 非对称加密:创建断言时,我需要生成随机对称密钥和使用该密钥加密断言。然后我需要使用接收方的 public 密钥加密动态密钥,并将生成的加密动态密钥包含在响应中。我面临的问题是 (1) 生成随机对称密钥 和 (2) 用它加密断言

LightSAML docs, an Assertion is normally encrypted with the certificate of the recipient (i.e. their public key). However, in this case it needs to be a random symmetric key. Now, this answer 中所述,对称密钥不过是一组随机字节。但是,如果 LightSAML API 需要 证书文件 (不仅仅是字符串)进行加密,如何使用该随机字符串来加密断言?我是否需要从该随机对称密钥创建证书文件?

接下来,要使用接收方的 public 密钥加密动态密钥,我该怎么做?我正在考虑 openssl_public_encrypt 给它随机对称密钥字符串和纯文本收件人的 public 密钥,但是有更好的方法吗?我如何在响应中包含加密的密钥字符串?

最后,当响应签名时,应该用我的私钥签名。但是,LightSAML 不仅需要我的私钥,还需要我的 public 密钥。怎么会这样?为什么这里甚至需要我的 public 密钥?我不应该使用加密的对称密钥(即用收件人的 public 密钥加密的对称密钥)吗?

LightSAML 执行您描述的操作 - 它生成一个随机对称密钥,使用 您的 私钥对其进行加密,并使用此随机对称密钥来加密断言。你从文档中链接的是一种方便的方法,如果你提供你的私钥,它会为你完成所有这些。

对响应进行签名后,它会使用您的私钥。这是在 SP 需要签名消息时完成的,并且在传输不是 SSL / TLS 时使用。为什么 LightSAML 想要 你的 public 密钥是为了验证签名。这只是文档中有关如何签署和验证消息的示例。

流程是: - 使用 IdP 的 private 密钥签署消息 - 使用 IdP 的 public 密钥

验证 SP 上的签名

Public IdP 和 SP 之间的密钥在元数据交换期间交换。