【问题标题】:Creating a credential for use with SAML in CFML在 CFML 中创建用于 SAML 的凭证
【发布时间】:2019-01-30 23:30:50
【问题描述】:

我正在尝试使用 OpenSAML 在 CFML (Railo) 中创建 SAML 身份验证请求,但在创建证书对象以设置公钥时遇到了问题。

我发现某些代码可以很好地与私钥一起使用,但使用与公钥证书类似的代码不起作用。它在调用 keyFactory.generatePublic() 时失败:“java.security.InvalidKeyException: IOException: algid parse error, not a sequence”。

这是否意味着我的公钥需要不同的格式,或者我的 keySpec 设置错误?我曾尝试使用 PKCS8EncodedKeySpec 和 RSAPublicKeySpec,但这些都不起作用。我使用的证书是使用 OpenSSL utils 制作的自签名证书,并以 .crt 格式创建。

我的代码:

    <cfset local.rawKey = replace( arguments.privateKey, "-----BEGIN PRIVATE KEY-----", "" )>
    <cfset local.rawKey = replace( local.rawKey, "-----END PRIVATE KEY-----", "" )>
    <cfset local.rawKey = trim(local.rawKey)>

    <cfset local.keyBytes   = binaryDecode(local.rawKey, "base64")>
    <cfset local.keySpec    = createObject("java", "java.security.spec.PKCS8EncodedKeySpec")>
    <cfset local.keyFactory = createObject("java", "java.security.KeyFactory").getInstance("RSA")>
    <cfset local.privateKey = keyFactory.generatePrivate(local.keySpec.init(local.keyBytes))>

    <cfset local.rawCert = replace( arguments.certificate, "-----BEGIN CERTIFICATE-----", "" )>
    <cfset local.rawCert = replace( local.rawCert, "-----END CERTIFICATE-----", "" )>
    <cfset local.rawCert = trim(local.rawCert)>

    <cfset local.keyBytes    = binaryDecode(local.rawCert, "base64")>
    <cfset local.keySpec     = createObject("java", "java.security.spec.PKCS8EncodedKeySpec")>
    <cfset local.keyFactory  = createObject("java", "java.security.KeyFactory").getInstance("RSA")>
    <cfset local.certificate = keyFactory.generatePublic(local.keySpec.init(local.keyBytes))>

    <cfset local.credential = _create( "org.opensaml.xml.security.x509.BasicX509Credential" )>

    <cfset local.credential.setPrivateKey( local.privateKey )>
    <cfset local.credential.setEntityCertificate( local.certificate )>

    <cfreturn credential>
</cffunction>

提前致谢,凯文

【问题讨论】:

  • 以防万一其他人必须解决此问题。以下似乎可以满足我的需要:

标签: certificate saml x509


【解决方案1】:

以防其他人必须解决此问题。以下似乎可以满足我的需要:

    <cfset local.certBytes    = binaryDecode(local.rawCert, "base64")>
    <cfset local.certStream   = createObject("java", "java.io.ByteArrayInputStream").init(local.certBytes)>
    <cfset local.certFactory  = createObject("java", "java.security.cert.CertificateFactory").getInstance("X.509")>
    <cfset local.certificate = local.certFactory.generateCertificate(local.certStream)>

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2014-06-13
    • 2017-03-13
    • 2020-12-07
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多