This topic tells you how to configure the issuer URI and TLS for Application Single Sign-On (commonly called AppSSO).
An AuthServer entry point for its clients and their end-users is called issuer URI. AppSSO will template the issuer URI and create a TLS-enabled Ingress for it. For this purpose, your platform operator configures the domain name and template. Once you created and AuthServer you can find the actual URL in .status.issuerURI.
You can configure whether and how to obtain a TLS certificate for the issuer URI by using .spec.tls. Unless TLS is deactivated, HTTPS is enforced. For example, requests for http:// are redirected to https://. You can observe the TLS configuration in .status.tls.
If AppSSO is installed with a default issuer, you can omit AuthServer.spec.tls and a TLS certificate is obtained automatically. This is the recommended approach for TLS.
For example:
apiVersion: sso.apps.tanzu.vmware.com/v1alpha1
kind: AuthServer
metadata:
name: login
namespace: services
# ...
spec:
# ...
status:
issuerURI: https://login.services.example.com
tls:
issuerRef:
name: my-default-issuer
kind: ClusterIssuer
group: cert-manager.io
# ...
This AuthServer is reachable at its templated issuer URI https://login.services.example.com and serves a TLS certificate obtained from my-default-issuer.
Learn how to configure TLS for your AuthServer:
There are many use-cases that pertain to TLS use. To find out which scenario applies to you and how to configure it, see TLS scenario guides.
If your AuthServer obtains a certificate from a custom CA, you can enable App Operators to trust it. See Allow Workloads to trust a custom CA AuthServer for more information.
You can obtain a TLS certificate for your AuthServer by referencing a cert-manager.io/v1/Issuer or cert-manager.io/v1/ClusterIssuer. This enables AppSSO to retrieve a cert-manager.io/v1/Certificate from the issuer and apply it to the Ingress configuration.
The composition of an AuthServer and a self-signed Issuer looks as follows:
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: my-selfsigned-issuer
namespace: services
spec:
selfSigned: { }
---
apiVersion: sso.apps.tanzu.vmware.com/v1alpha1
kind: AuthServer
metadata:
name: login
namespace: services
# ...
spec:
tls:
issuerRef:
name: my-selfsigned-issuer
# 'kind: Issuer' can be omitted. It is the default.
The composition of an AuthServer and a self-signed ClusterIssuer for looks as follows:
---
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: my-selfsigned-cluster-issuer
spec:
selfSigned: { }
---
apiVersion: sso.apps.tanzu.vmware.com/v1alpha1
kind: AuthServer
metadata:
name: login
namespace: services
# ...
spec:
tls:
issuerRef:
name: my-selfsigned-cluster-issuer
kind: ClusterIssuer
Confirm that your AuthServer serves a TLS certificate from the specified issuer by visiting its {.status.issuerURI}.
For more information about cert-manager and its APIs. see cert-manager documentation.
In order to configure TLS for your AuthServer using a cert-manager.io/v1/Certificate you must know what its templated issuer URI will be. You can infer it from the AppSSO package’s domain template.
The composition of an AuthServer and a Certificate looks as follows:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: login
namespace: services
spec:
dnsNames:
- login.services.example.com
issuerRef:
name: my-cluster-issuer
kind: ClusterIssuer
secretName: login-cert
---
apiVersion: sso.apps.tanzu.vmware.com/v1alpha1
kind: AuthServer
metadata:
name: login
namespace: services
# ...
spec:
tls:
certificateRef:
name: login
Confirm that your AuthServer serves the specified Certificate by visiting its {.status.issuerURI}.
For more information about cert-manager and its APIs. see cert-manager documentation.
If you don’t want to use cert-manager.io’s APIs or you have a raw TLS certificate in a TLS Secret, you can compose it with your AuthServer by referencing it. The certificate must be for the issuer URI that will be templated for the AuthServer. You can infer it from the AppSSO package’s domain template.
The composition of an AuthServer and TLS Secret looks as follows:
apiVersion: v1
kind: Secret
metadata:
name: my-tls-cert
namespace: services
type: kubernetes.io/tls
data:
tls.key: # ...
tls.crt: # ...
---
apiVersion: sso.apps.tanzu.vmware.com/v1alpha1
kind: AuthServer
metadata:
name: login
namespace: services
# ...
spec:
tls:
secretRef:
name: my-tls-cert
If you deactivate TLS autoconfiguration, AuthServer only works over plain HTTP. You must deactivate TLS with the sso.apps.tanzu.vmware.com/allow-unsafe-issuer-uri: "" annotation.
---
apiVersion: sso.apps.tanzu.vmware.com/v1alpha1
kind: AuthServer
metadata:
name: login
namespace: services
annotations:
sso.apps.tanzu.vmware.com/allow-unsafe-issuer-uri: ""
# ...
spec:
tls:
deactivated: true
CautionDeactivating TLS is unsafe and not recommended for production.
Workloads to trust a custom CA AuthServerIf your AuthServer obtains a certificate from a custom CA, its consumers do not trust it by default. You can enable App Operators’ Workloads to trust your AuthServer by exporting a ca-certificates service binding Secret to their Namespace.
A composition of SecretTemplate and SecretExport are a way to achieve this. If your custom CA’s TLS Secret is present in the namespace my-certs, then you can provide a ca-certificates service binding Secret like so:
---
apiVersion: secretgen.carvel.dev/v1alpha1
kind: SecretTemplate
metadata:
name: ca-cert
namespace: my-certs
spec:
inputResources:
- name: my-custom-ca
ref:
apiVersion: v1
kind: Secret
name: my-custom-ca
template:
data:
ca.crt: $(.my-custom-ca.data.tls\.crt)
stringData:
type: ca-certificates
---
apiVersion: secretgen.carvel.dev/v1alpha1
kind: SecretExport
metadata:
name: ca-cert
namespace: my-certs
spec:
toNamespace: "*"
This templates a ca-certificates service binding Secret which Workload can claim to trust the custom CA. It does not contain the CA’s private key and is generally safe to share.
However, be careful, this example exports to all namespace on the cluster. If this does not comply with your policies, then adjust the target namespaces if required.
For more information about secretgen-controller and its APIs, see secretgen-controller documentation in GitHub.