CA_CN="Local Keycloak Signer"
OPENSSL_CNF=/etc/pki/tls/openssl.cnf
openssl genrsa -out ca.key 4096
# Generate the root ca
openssl req -x509 \
-new -nodes \
-key ca.key \
-sha256 \
-days 1024 \
-out ca.crt \
-subj /CN="${CA_CN}" \
-reqexts SAN \
-extensions SAN \
-config <(cat ${OPENSSL_CNF} \
<(printf '[SAN]\nbasicConstraints=critical, CA:TRUE\nkeyUsage=keyCertSign, cRLSign, digitalSignature'))
DOMAIN=<your domain here>
# Generate domain key
openssl genrsa -out $DOMAIN-key.pem 2048
# Generate the certificate signing request for the domain:
openssl req -new -sha256 \
-key $DOMAIN-key.pem \
-subj "/O=Local {prod}/CN=${DOMAIN}" \
-reqexts SAN \
-config <(cat ${OPENSSL_CNF} \
<(printf "\n[SAN]\nsubjectAltName=DNS:${DOMAIN}, DNS:vm$i\nbasicConstraints=critical, CA:FALSE\nkeyUsage=digitalSignature, keyEncipherment, keyAgreement, dataEncipherment\nextendedKeyUsage=serverAuth, clientAuth")) \
-out $DOMAIN.csr
# Generate the domain certificate:
openssl x509 \
-req \
-sha256 \
-extfile <(printf "subjectAltName=DNS:${DOMAIN}, DNS:vm$i\nbasicConstraints=critical, CA:FALSE\nkeyUsage=digitalSignature, keyEncipherment, keyAgreement, dataEncipherment\nextendedKeyUsage=serverAuth, clientAuth") \
-days 365 \
-in $DOMAIN.csr \
-CA ca.crt \
-CAkey ca.key \
-CAcreateserial -out $DOMAIN.crt
certs
cp $DOMAIN.crt certs/tls.crt
cp $DOMAIN-key.pem certs/tls.key
oc create configmap certificates --from-file=certs
$DOMAIN.crt
to the master nodes directory /etc/origin/master
oc new-project keycloak
oc new-app jboss/keycloak
oc set volume dc keycloak --add --type configmap --configmap-name certificates --mount-path /etc/x509/https
oc set env dc/keycloak KEYCLOAK_USER=admin
oc set env dc/keycloak KEYCLOAK_PASSWORD=<password here>
Note Best practice is to create a secret for the credentials and reference the username and password in the above
This will redeploy keycloak. It will import the certificates into it’s keystore and will set the admin user credentials
Give this a route
oc create route passthrough keycloak --hostname=$DOMAIN --service=keycloak --port=8443
openshift
test-user
with password password
. Make sure that Temporary Password
is set to Off.openshift
and set the client protocol to openid-connect
and access type confidential
- name: rh_sso
challenge: false
login: true
mappingInfo: add
provider:
apiVersion: v1
kind: OpenIDIdentityProvider
clientID: openshift
clientSecret: g8d7f50b-d781-4c4c-baa6-adbe4b76a280
ca: $DOMAIN.crt
urls:
authorize: $DOMAIN/auth/realms/openshift/protocol/openid-connect/auth
token: $DOMAIN/auth/realms/openshift/protocol/openid-connect/token
userInfo: $DOMAIN/auth/realms/openshift/protocol/openid-connect/userinfo
logoutURL: $DOMAIN/auth/realms/openshift/protocol/openid-connect/logout
claims:
id:
- sub
preferredUsername:
- preferred_username
name:
- name
email:
- email
Note Take note where we specify the crt file in the above configuration. Note If unsure about the urls, you can get it from the system by loading:
https://$DOMAIN/auth/realms/openshift/.well-known/openid-configuration
sudo /usr/local/bin/master-restart api && sudo /usr/local/bin/master-restart controllers
testuser
and password password
kube-system
. There i found out that the certificate was for the wrong domain:Error getting access token: Post <token url>: x509: certificate is valid for <some domain>, not <your keycloak domain>