因此,我们得到了一个公共 X509 证书,我需要使用它来签署 SAML 断言
这是我目前拥有的:
BasicX509Credential credential = new BasicX509Credential();
credential.setEntityCertificate(getPublicCertificate());
credential.setPrivateKey(null);
// SIGNING
SecurityConfiguration config = Configuration.getGlobalSecurityConfiguration();
Signature signature = (Signature) Configuration.getBuilderFactory().getBuilder(Signature.DEFAULT_ELEMENT_NAME).buildObject(Signature.DEFAULT_ELEMENT_NAME);
signature.setSignatureAlgorithm(SignatureConstants.ALGO_ID_SIGNATURE_RSA_SHA256);
signature.setSigningCredential(credential);
SecurityHelper.prepareSignatureParams(signature, credential, config, null);
assertion.setSignature(signature);
// END SIGNING
AssertionMarshaller marshaller = new AssertionMarshaller();
Element plaintextElement = marshaller.marshall(assertion);
Signer.signObject(signature);
但是,当调用Signer.signObject(signature)
时,它会引发NullPointerException
,因为凭据对象中没有私钥。由于我们获得了 X509 证书,因此我们显然只能访问公钥。私钥应该设置为什么?谢谢!
您需要私钥才能签名。签名生成始终需要私钥,验证受信任的公钥(执行签名的一方(。
因此,也许除了getPublicCertificate
之外,您还可以调用一种方法,或者私钥以其他方式传递。
从公钥中生成私钥当然是不可能的;如果可能的话,私钥的使用很少,而且它们不会非常私密。