Создание учетных данных для использования с SAML в CFML - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь создать запрос аутентификации SAML в CFML (Railo) с OpenSAML и застрял в момент создания объекта сертификата для установки открытого ключа.

Я нашел соевый код, который работал хорошос закрытым ключом, но использование аналогичного кода с сертификатом открытого ключа не работает.Сбой при вызове keyFactory.generatePublic () с: «java.security.InvalidKeyException: IOException: ошибка разбора algid, а не последовательность».

Означает ли это, что мне нужен другой формат для моего открытого ключа иличто у меня keySpec установлен неправильно?Я пытался использовать PKCS8EncodedKeySpec и RSAPublicKeySpec, но ни один из них тоже не работает.Сертификат, который я использую, представляет собой самозаверяющий сертификат, созданный с помощью утилит OpenSSL и созданный в формате .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>

Спасибо зазаранее, Кевин

1 Ответ

0 голосов
/ 28 августа 2018

В случае, если кто-то еще должен решить эту проблему.Следующее, кажется, делает то, что мне нужно:

    <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)>
...