我正在研究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这样的方法可以帮助解决这个问题,但是没有看到这个方法很容易实现。
答案 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;