Как использовать сертификат X509 в качестве открытого ключа в ответе SAML

Я работаю над SP. У нас есть ответ SAML2 от IDP.

Это выглядит примерно так:

SAML: почему сертификат находится внутри подписи?

Теперь я использую OpenSaml2 для анализа и обработки данных в этом XML-файле.

Мне нужно вытащить сертификат из ответа и использовать его как учетные данные.

До сих пор я делал это:

Response response = (Response) xmlObject;
SAMLSignatureProfileValidator profileValidator = new 
SAMLSignatureProfileValidator();
Signature signature = response.getSignature();
Credential credential = null;
profileValidator.validate(signature);
SignatureValidator validator = new SignatureValidator(credential);
validator.validate(signature);

В приведенном выше коде учетные данные временно "нулевые", но мне нужно, чтобы это был открытый ключ, который находится в сертификате. Есть идеи, как я могу это сделать?

Было сказано, что у opensaml2 есть такие методы, как KeyInfoCredentialResolver, чтобы помочь с этим, но не видели простой реализации этого.


person hal9000    schedule 28.03.2018    source источник


Ответы (1)


Я смог решить эту проблему, используя что-то вроде:

X509Certificate certificate = signature.getKeyInfo().getX509Datas().get(0).getX509Certificates().get(0);

        if (certificate != null) {
            //Converts org.opensaml.xml.signature.X509Certificate to java.security.cert.Certificate
            String lexicalXSDBase64Binary = certificate.getValue();
            byte[] decoded = DatatypeConverter.parseBase64Binary(lexicalXSDBase64Binary);

            try {
                CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
                Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(decoded));
                return cert;
person hal9000    schedule 30.03.2018