Skip to content

实体与配置

ServiceProvider()IdentityProvider() 都支持两种主流方式:

  • 直接传 metadata XML
  • 传对象配置,由库生成 metadata
const sp = ServiceProvider({
metadata: readFileSync('./metadata/sp.xml')
});
const idp = IdentityProvider({
entityID: 'https://idp.example.com/metadata',
signingCert: readFileSync('./certs/idp.crt'),
privateKey: readFileSync('./certs/idp.key'),
singleSignOnService: [
{
Binding: 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
Location: 'https://idp.example.com/saml/sso'
}
]
});

实体基础默认值定义在 src/entity.ts

配置项默认值
strictSecuritytrue
allowLegacySha1false
allowCertificateUsageMismatchfalse
messageSigningOrdersign-then-encrypt
allowCreatefalse
isAssertionEncryptedfalse
requestSignatureAlgorithmRSA_SHA512
dataEncryptionAlgorithmAES_256_GCM
keyEncryptionAlgorithmRSA_OAEP_MGF1P
relayState''

一个需要特别注意的细节是:如果你把 strictSecurity 显式设成 false,而又没有手动指定 allowLegacySha1,当前实现会把 allowLegacySha1 一并放宽。

当你传入 metadata 时,metadata 不只是“给你展示一下”,它会参与实际配置回填。

例如:

  • SP 会按 metadata 回填 authnRequestsSigned
  • SP 会按 metadata 回填 wantAssertionsSigned
  • IdP 会按 metadata 回填 wantAuthnRequestsSigned
  • 两边都会优先回填 nameIDFormat

所以 metadata 驱动配置不是装饰功能,而是当前实现里最自然的配置方式。

  • metadata
  • entityID
  • nameIDFormat
  • signingCert
  • encryptCert
  • assertionConsumerService
  • singleLogoutService
  • artifactResolutionService
  • privateKey
  • privateKeyPass
  • encPrivateKey
  • encPrivateKeyPass
  • requestSignatureAlgorithm
  • dataEncryptionAlgorithm
  • keyEncryptionAlgorithm
  • keyEncryptionDigest
  • keyEncryptionMgf1
  • keyEncryptionOAEPParams
  • signatureConfig
  • transformationAlgorithms
  • strictSecurity
  • allowLegacySha1
  • allowCertificateUsageMismatch
  • authnRequestsSigned
  • wantAssertionsSigned
  • wantMessageSigned
  • wantLogoutRequestSigned
  • wantLogoutResponseSigned
  • isAssertionEncrypted
  • allowCreate
  • clockDrifts
  • loginRequestTemplate
  • logoutRequestTemplate
  • authnRequestEnhancements
  • conditionsEnhancements
  • subjectConfirmationEnhancements
  • metadataEnhancements
  • metadata
  • entityID
  • nameIDFormat
  • signingCert
  • encryptCert
  • singleSignOnService
  • singleLogoutService
  • artifactResolutionService
  • privateKey
  • privateKeyPass
  • encPrivateKey
  • encPrivateKeyPass
  • requestSignatureAlgorithm
  • dataEncryptionAlgorithm
  • keyEncryptionAlgorithm
  • keyEncryptionDigest
  • keyEncryptionMgf1
  • keyEncryptionOAEPParams
  • strictSecurity
  • allowLegacySha1
  • allowCertificateUsageMismatch
  • wantAuthnRequestsSigned
  • wantLogoutRequestSigned
  • wantLogoutResponseSigned
  • messageSigningOrder
  • isAssertionEncrypted
  • tagPrefix
  • generateID
  • loginResponseTemplate
  • logoutRequestTemplate
  • authnRequestEnhancements
  • conditionsEnhancements
  • subjectConfirmationEnhancements
  • metadataEnhancements

这是当前最推荐、也最贴合默认实现的组合:

  • 请求签名:RSA_SHA512
  • 断言加密:AES_256_GCM
  • 密钥加密:RSA_OAEP_MGF1P

算法常量来自 Constants.algorithms / urn.ts,常用分组包括:

  • RSA_SHA1
  • RSA_SHA224
  • RSA_SHA256
  • RSA_SHA384
  • RSA_SHA512
  • ECDSA_SHA256
  • ECDSA_SHA384
  • ECDSA_SHA512
  • RSA_PSS_SHA256
  • EDDSA_ED25519
  • EDDSA_ED488
  • AES_128_CBC
  • AES_192_CBC
  • AES_256_CBC
  • AES_128_GCM
  • AES_192_GCM
  • AES_256_GCM
  • AES_128_CTR
  • AES_192_CTR
  • AES_256_CTR
  • TRIPLE_DES
  • RSA_OAEP_MGF1P
  • RSA_OAEP
  • RSA_1_5
  • AES_128_KW
  • AES_192_KW
  • AES_256_KW
  • AES_128_GCM_KW
  • AES_192_GCM_KW
  • AES_256_GCM_KW

除了高层实体,库还直接导出:

  • SPMetadata
  • IdPMetadata

它们适合做这些事:

  • 从 XML metadata 解析 endpoint
  • 读取证书和 NameIDFormat
  • 生成 metadata XML
  • 导出 metadata 到文件

如果你只需要“拿现成 metadata 做接入”,通常直接把 metadata 传给高层实体即可,不一定要先自己实例化 SPMetadataIdPMetadata

  • 优先使用 metadata 驱动对端配置
  • 保持 strictSecurity: true
  • 使用默认算法组合起步
  • 明确区分 signing cert 和 encryption cert
  • 为 SP 和 IdP 都配置清晰的 endpoint 列表
  • 没有必要时关闭 strictSecurity
  • allowLegacySha1 当成默认兼容开关
  • 长期依赖 allowCertificateUsageMismatch
  • 一上来就跳过高层实体 API,直接手写 SamlLib 调用