Merge pull request #1626 from dbarentine/master
KEYCLOAK-1861 Allow setting of signature algorithm when signing SAML …
This commit is contained in:
commit
2865a3c047
5 changed files with 40 additions and 0 deletions
|
@ -250,6 +250,7 @@ public class SAMLEndpoint {
|
||||||
builder.relayState(relayState);
|
builder.relayState(relayState);
|
||||||
if (config.isWantAuthnRequestsSigned()) {
|
if (config.isWantAuthnRequestsSigned()) {
|
||||||
builder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
|
builder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
|
||||||
|
.signatureAlgorithm(provider.getSignatureAlgorithm())
|
||||||
.signDocument();
|
.signDocument();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.keycloak.models.UserSessionModel;
|
||||||
import org.keycloak.protocol.saml.SAML2AuthnRequestBuilder;
|
import org.keycloak.protocol.saml.SAML2AuthnRequestBuilder;
|
||||||
import org.keycloak.protocol.saml.SAML2LogoutRequestBuilder;
|
import org.keycloak.protocol.saml.SAML2LogoutRequestBuilder;
|
||||||
import org.keycloak.protocol.saml.SAML2NameIDPolicyBuilder;
|
import org.keycloak.protocol.saml.SAML2NameIDPolicyBuilder;
|
||||||
|
import org.keycloak.protocol.saml.SignatureAlgorithm;
|
||||||
import org.keycloak.saml.common.constants.GeneralConstants;
|
import org.keycloak.saml.common.constants.GeneralConstants;
|
||||||
import org.keycloak.saml.common.constants.JBossSAMLURIConstants;
|
import org.keycloak.saml.common.constants.JBossSAMLURIConstants;
|
||||||
import org.keycloak.saml.common.exceptions.ConfigurationException;
|
import org.keycloak.saml.common.exceptions.ConfigurationException;
|
||||||
|
@ -110,6 +111,7 @@ public class SAMLIdentityProvider extends AbstractIdentityProvider<SAMLIdentityP
|
||||||
KeyPair keypair = new KeyPair(publicKey, privateKey);
|
KeyPair keypair = new KeyPair(publicKey, privateKey);
|
||||||
|
|
||||||
authnRequestBuilder.signWith(keypair);
|
authnRequestBuilder.signWith(keypair);
|
||||||
|
authnRequestBuilder.signatureAlgorithm(getSignatureAlgorithm());
|
||||||
authnRequestBuilder.signDocument();
|
authnRequestBuilder.signDocument();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +198,7 @@ public class SAMLIdentityProvider extends AbstractIdentityProvider<SAMLIdentityP
|
||||||
.relayState(userSession.getId());
|
.relayState(userSession.getId());
|
||||||
if (getConfig().isWantAuthnRequestsSigned()) {
|
if (getConfig().isWantAuthnRequestsSigned()) {
|
||||||
logoutBuilder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
|
logoutBuilder.signWith(realm.getPrivateKey(), realm.getPublicKey(), realm.getCertificate())
|
||||||
|
.signatureAlgorithm(getSignatureAlgorithm())
|
||||||
.signDocument();
|
.signDocument();
|
||||||
}
|
}
|
||||||
return logoutBuilder;
|
return logoutBuilder;
|
||||||
|
@ -245,4 +248,13 @@ public class SAMLIdentityProvider extends AbstractIdentityProvider<SAMLIdentityP
|
||||||
"</EntityDescriptor>\n";
|
"</EntityDescriptor>\n";
|
||||||
return Response.ok(descriptor, MediaType.APPLICATION_XML_TYPE).build();
|
return Response.ok(descriptor, MediaType.APPLICATION_XML_TYPE).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SignatureAlgorithm getSignatureAlgorithm() {
|
||||||
|
String alg = getConfig().getSignatureAlgorithm();
|
||||||
|
if (alg != null) {
|
||||||
|
SignatureAlgorithm algorithm = SignatureAlgorithm.valueOf(alg);
|
||||||
|
if (algorithm != null) return algorithm;
|
||||||
|
}
|
||||||
|
return SignatureAlgorithm.RSA_SHA256;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,14 @@ public class SAMLIdentityProviderConfig extends IdentityProviderModel {
|
||||||
getConfig().put("wantAuthnRequestsSigned", String.valueOf(wantAuthnRequestsSigned));
|
getConfig().put("wantAuthnRequestsSigned", String.valueOf(wantAuthnRequestsSigned));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSignatureAlgorithm() {
|
||||||
|
return getConfig().get("signatureAlgorithm");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSignatureAlgorithm(String signatureAlgorithm) {
|
||||||
|
getConfig().put("signatureAlgorithm", signatureAlgorithm);
|
||||||
|
}
|
||||||
|
|
||||||
public String getEncryptionPublicKey() {
|
public String getEncryptionPublicKey() {
|
||||||
return getConfig().get("encryptionPublicKey");
|
return getConfig().get("encryptionPublicKey");
|
||||||
}
|
}
|
||||||
|
|
|
@ -693,10 +693,17 @@ module.controller('RealmIdentityProviderCtrl', function($scope, $filter, $upload
|
||||||
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
$scope.signatureAlgorithms = [
|
||||||
|
"RSA_SHA1",
|
||||||
|
"RSA_SHA256",
|
||||||
|
"RSA_SHA512",
|
||||||
|
"DSA_SHA1"
|
||||||
|
];
|
||||||
if (instance && instance.alias) {
|
if (instance && instance.alias) {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
$scope.identityProvider.config.nameIDPolicyFormat = $scope.nameIdFormats[0].format;
|
$scope.identityProvider.config.nameIDPolicyFormat = $scope.nameIdFormats[0].format;
|
||||||
|
$scope.identityProvider.config.signatureAlgorithm = $scope.signatureAlgorithms[1];
|
||||||
$scope.identityProvider.updateProfileFirstLoginMode = "off";
|
$scope.identityProvider.updateProfileFirstLoginMode = "off";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,6 +135,18 @@
|
||||||
</div>
|
</div>
|
||||||
<kc-tooltip> Indicates whether the identity provider expects signed a AuthnRequest.</kc-tooltip>
|
<kc-tooltip> Indicates whether the identity provider expects signed a AuthnRequest.</kc-tooltip>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group" data-ng-show="identityProvider.config.wantAuthnRequestsSigned == 'true'">
|
||||||
|
<label class="col-md-2 control-label" for="signatureAlgorithm">Signature Algorithm</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<div>
|
||||||
|
<select class="form-control" id="signatureAlgorithm"
|
||||||
|
ng-model="identityProvider.config.signatureAlgorithm"
|
||||||
|
ng-options="alg for alg in signatureAlgorithms">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<kc-tooltip>The signature algorithm to use to sign documents.</kc-tooltip>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-md-2 control-label" for="forceAuthn">Force Authentication</label>
|
<label class="col-md-2 control-label" for="forceAuthn">Force Authentication</label>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
|
|
Loading…
Reference in a new issue