Я пытаюсь создать запрос аутентификации 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>
Спасибо зазаранее, Кевин