如何在SAML响应中将X509证书用作公钥

时间:2018-03-28 20:19:23

标签: java xml saml saml-2.0 opensaml

我正在研究SP的一面。我们收到了IDP的SAML2回复。

它看起来像这里的例子:

SAML: Why is the certificate within the Signature?

现在我使用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);

在上面的代码中,凭证暂时为" null",但我需要它是证书中的公钥。知道我怎么能这样做吗?

有人告诉我,opensaml2有像KeyInfoCredentialResolver这样的方法可以帮助解决这个问题,但是没有看到这个方法很容易实现。

1 个答案:

答案 0 :(得分:0)

我能够通过以下方式解决此问题:

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;