Tutorial - Use EJBCA with cert-manager
Learn how to set up EJBCA to issue certificates with the cert-manager using the EJBCA cert-manager external issuer.
cert-manager is an open-source tool for issuing certificates in Kubernetes, integrating with various Public Key Infrastructure (PKI) providers. EJBCA integrates with cert-manager as an external certificate authority, enabling native integration to seamlessly request certificates through cert-manager, issued from EJBCA.
This tutorial is intended for users who wish to issue certificates in Kubernetes that has cert-manager deployed and wants to use a world-class PKI for the certificate issuance. Whether you have standardized on EJBCA as the corporate PKI, need a PKI that runs in a container, or just want to try something new, this integration is for you.
In this tutorial, you will learn how to:
Create keys and certificate signing request (CSR) to request certificates from EJBCA for the EJBCA cert-manager external issuer
Configure a new Registration Authority (RA) role in EJBCA for the cert-manager integration
Deploy cert-manager using a Helm chart
Deploy the EJBCA cert-manager external issuer using a Helm chart
Create an issuer and cluster issuer
Issue certificates with the EJBCA cert-manager external issuer
Sorry, the widget is not supported in this export.
But you can reach it using the following URL:
Prerequisites
Before you begin, you need:
SSH Access to the Kubernetes host.
Internet access to download the cert-manager components, EJBCA cert-manager external issuer container, and helm charts.
An environment configured following the tutorial videos EJBCA - Getting started with Kubernetes.
Step 1 - Configure EJBCA for the cert-manager integration
The cert-manager RA role will allow the EJBCA cert-manager external issuer credential to connect to EJBCA using the REST API to issue and revoke certificates. Follow these steps to create a new role for the cert-manager RA:
Go to the EJBCA Administration user interface using a web browser.
In the EJBCA Admin UI, under System Functions, click Roles and Access Rules.
Next to the list of available roles, click Add.
For Role name, specify RA-cert-manager and click Add.
The Roles Management page now lists the RA-cert-manager role.To update the access rules for the role, click Access Rules for the RA-cert-manager role.
On the Edit Access Rules page, edit the following:
For Role Template, select RA Administrators.
For Authorized CAs, select My PKISubCA-G1.
For End Entity Profiles, select TLS Client Profile and TLS Server Profile.
Click Save to store the updated access rules for the role.
At the top right of the Edit Access Rules page, click Members.
Members are defined by an attribute from the certificate DN and the serial number:
Match with: Select X509:CN, Common name.
CA: Verify that Management CA is selected for the CA to match on.
Match Value: Specify the name value from the certificate, in this example: "cert-manager-ra-01". Note that this is a case-sensitive matching.
Click Add to add the user to the role.
You have now created a role for the cert-manager RA and can continue preparing to deploy the EJBCA cert-manager external issuer and cert-manager.
Step 2 - Create Key, Certificate Signing Request (CSR), and get the certificate for the RA credential
The EJBCA cert-manager external issuer requires a RA credential to connect to EJBCA for issuing and revoking certificates using the REST API. Follow these steps to create the RA credential:
Create the Key and CSR
SSH to the MicroK8s test host that has EJBCA deployed and configured.
In your terminal, enter the following to create a directory to organize all the files for this tutorial:
$
mkdir
cert-manager
Change to the cert-manager directory:
$
cd
cert-manager
Create an OpenSSL configuration file for the EJBCA cert-manager external issuer RA certificate:
$
cat
> cert-manager-ra-01.conf <<EOF
[req]
default_bits = 2048
prompt = no
encrypt_key =
yes
distinguished_name = kubelet_serving
req_extensions = v3_req
[ kubelet_serving ]
C = SE
O = Keyfactor Community
CN = cert-manager-ra-01
[ v3_req ]
keyUsage = digitalSignature
extendedKeyUsage = clientAuth
EOF
Generate the private key and create the CSR using the OpenSSL configuration file:
$ openssl req -new -newkey rsa:2048 -nodes \
-keyout cert-manager-ra-01-key.pem -sha256 \
-out cert-manager-ra-01.csr -config cert-manager-ra-01.conf
Output the contents of the cert-manager-ra-01.csr to use with an upcoming step:
$
cat
cert-manager-ra-01.csr
The output is similar to the following:
-----BEGIN CERTIFICATE REQUEST-----
MIICwDCCAagCAQAwSDELMAkGA1UEBhMCU0UxHDAaBgNVBAoME0tleWZhY3RvciBD
b21tdW5pdHkxGzAZBgNVBAMMEmNlcnQtbWFuYWdlci1yYS0wMTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAM9o0DQ051oUyTRgW8mqOYzVpnJmeUcld0Q4
Elg6OpqpWKqcIL0Avk3vsjpBQ9TTm5GUIOMgkaGVwfyiHefT8VReUD2XAouJSe+s
INiaTZV4fsEndyQ2DEPhX9Yho2oV7fFMQPJATFZ9cZm4JczKfXtt7ya0aoyYH23t
hB+ORT6eF0Eiv7bu
/kl3/KlZlg0YxZUbYqKZQq4HbYJtXgEWErLVDKrLbyrc9uF8
5y97eF2N4NmCM+EBS3Smd3UyrGqtuZFhJNF1ST3z9VQoTZBea+ZZO1j5E5fg5i8j
Zmrp82rjJWx0WlXpwC6lXL70afGDyzQjF
/YTTHA1LgsiUpbkkP8CAwEAAaAzMDEG
CSqGSIb3DQEJDjEkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMC
MA0GCSqGSIb3DQEBCwUAA4IBAQC3S
/u936GVC8ew2K9WtjhHX92/6UYtJ1VJ5wgy
KElepwl4Lsp5i+3MFIFRYlYtypM1p9wZjRRnaBcnwmAsXqoYXjoHo5TXlcDXdxcB
GRbuv25MoUCxdqWgDEqK3oui
/qD3L/3YYLNpygToaDWFPBop8vEpj8qmjcZ4CVkw
SvwELGeihJP0Ja+T+0q1NhnyjnYTXYUawxbND
/Ma9OSJHnlCkHdprgZq0JB3H2Zq
h1yYU
/qxh1HdIqmbiRzvD6OqsY/FwvMUwF23DNu5r7N6urv9/sS
+KaCZTx3T7ezp
umTihw5jwzifQRKyq0A3yW8FtQ8J1hDXCDAvolLJxlUnDfaV
-----END CERTIFICATE REQUEST-----
Submit the CSR to EJBCA to get the certificate
Go to the EJBCA RA Web user interface using a web browser.
Click Make New Request and update the following:
Select RA-Administrator for the Certificate Type.
Select Provided by user for Key-pair generation.
Paste the contents of the cert-manager-ra-01.csr from the terminal window into the CSR text field (the PEM output in the terminal window), such as:
-----BEGIN CERTIFICATE REQUEST-----
MIICwDCCAagCAQAwSDELMAkGA1UEBhMCU0UxHDAaBgNVBAoME0tleWZhY3RvciBD
b21tdW5pdHkxGzAZBgNVBAMMEmNlcnQtbWFuYWdlci1yYS0wMTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAM9o0DQ051oUyTRgW8mqOYzVpnJmeUcld0Q4
Elg6OpqpWKqcIL0Avk3vsjpBQ9TTm5GUIOMgkaGVwfyiHefT8VReUD2XAouJSe+s
INiaTZV4fsEndyQ2DEPhX9Yho2oV7fFMQPJATFZ9cZm4JczKfXtt7ya0aoyYH23t
hB+ORT6eF0Eiv7bu/kl3/KlZlg0YxZUbYqKZQq4HbYJtXgEWErLVDKrLbyrc9uF8
5y97eF2N4NmCM+EBS3Smd3UyrGqtuZFhJNF1ST3z9VQoTZBea+ZZO1j5E5fg5i8j
Zmrp82rjJWx0WlXpwC6lXL70afGDyzQjF/YTTHA1LgsiUpbkkP8CAwEAAaAzMDEG
CSqGSIb3DQEJDjEkMCIwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMC
MA0GCSqGSIb3DQEBCwUAA4IBAQC3S/u936GVC8ew2K9WtjhHX92/6UYtJ1VJ5wgy
KElepwl4Lsp5i+3MFIFRYlYtypM1p9wZjRRnaBcnwmAsXqoYXjoHo5TXlcDXdxcB
GRbuv25MoUCxdqWgDEqK3oui/qD3L/3YYLNpygToaDWFPBop8vEpj8qmjcZ4CVkw
SvwELGeihJP0Ja+T+0q1NhnyjnYTXYUawxbND/Ma9OSJHnlCkHdprgZq0JB3H2Zq
h1yYU/qxh1HdIqmbiRzvD6OqsY/FwvMUwF23DNu5r7N6urv9/sS+KaCZTx3T7ezp
umTihw5jwzifQRKyq0A3yW8FtQ8J1hDXCDAvolLJxlUnDfaV
-----END CERTIFICATE REQUEST-----
Click Upload CSR.
Enter cert-manager-ra-01 for the Username.
Click Download PEM full chain.
Return to the terminal window and open a new tab or terminal window.
In your terminal, enter the following to upload the cert-manager-ra-01.pem to the MicroK8s VM:
$
scp
cert-manager-ra-01.pem user@172.16.170.187:~
/cert-manager/cert-manager-ra-01
.crt
The certificate.pem file is renamed to .crt when uploaded to the K8’s host
Return to the original terminal window opened for connecting to the Kubernetes server.
Output the contents of the cert-manager-ra-01.crt file with the cat command to copy the ManagementCA cert PEM blob:
$
cat
cert-manager-ra-01.crt
The output is similar to the following:
Subject: CN=cert-manager-ra-
01
,O=Keyfactor Community,C=SE
Issuer: CN=ManagementCA,O=Keyfactor Community,C=SE
-----BEGIN CERTIFICATE-----
MIIEfzCCAmegAwIBAgIUdTaxyI6z9SZTQy6cM9ByquOsan4wDQYJKoZIhvcNAQEL
BQAwQjEVMBMGA1UEAwwMTWFuYWdlbWVudENBMRwwGgYDVQQKDBNLZXlmYWN0b3Ig
Q29tbXVuaXR5MQswCQYDVQQGEwJTRTAeFw0yNDAxMTExNzEyMzJaFw0yNTAxMDkx
NzEyMzFaMEgxCzAJBgNVBAYTAlNFMRwwGgYDVQQKDBNLZXlmYWN0b3IgQ29tbXVu
aXR5MRswGQYDVQQDDBJjZXJ0LW1hbmFnZXItcmEtMDEwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDEdW7YbbQnWeYCzt4eE+dKg2rZ9gWD8JIJFsPo8Qbi
aCI5otyyqXSdEki/9Z7Zsjo2nhFVG6HhsAsO02e29sJ54QERcAUEHatf1502fwWL
Or7P5e4tLd6SsNeuJ74DC8dkppCHYdsS2X9xutqJnYvuQhqnfg84mlUG3my4qAMB
G6ultKt8eCq39Be9/LTau9Ur08SWOluvf6DcpHlhtOJzfD3/UOrS4viGwy4hloau
xSCQCKMUp51ifj0rGygvNHi58qdsAV2kz1/VCzWu7A4T5paeBAlAaD9shA8aci3R
4x/KEG90gBXViZE/DJDOvxf7/Y7S04hY2ZRl7bnpZNslAgMBAAGjZzBlMB8GA1Ud
IwQYMBaAFNf+MZRDSTxfobte/gWABCwE86DSMBMGA1UdJQQMMAoGCCsGAQUFBwMC
MB0GA1UdDgQWBBTi+OUsnFKQHh1QWYIZNtIguiGJ9TAOBgNVHQ8BAf8EBAMCB4Aw
DQYJKoZIhvcNAQELBQADggIBAAo6rV5JdKRsS8Z31YDdFWRG4D4pU/j15o7wiwSe
FiVNACkYiXndoPZP+KaJVFt0FNxw/4ErGxgPLRS/XV9HgTAzCAbAAeGd2mHrMaEX
eS1G4aQZd7AOgIDZ7+qSrlBdHpb8vXG6tfFKQcCpZxZmTEcTDfZt/YGS+IHxv9oZ
NX7aLz+pOookjvsse4kS1FMYFUDlL5znzqMHLNwmUUzzsC11TiUZ7unG3k3ekkLG
F3PSEeMp+y7zmy+skvFQYVDwFywc/2fd+JJ4oFDEPAklM+L+LtmLkhyLHtZzACO0
LeSUnmVVInfQPT1uEtpL0pmbAbXspNf0nDzSxVhnr/dvN1xfKkFnTc2yvxyZ83Yu
1DzDnLgu2HsP/1veyr6E8z8iD7o61CbSt/WiBeEDYNDgs8IUWDgVn026pUoTL8/p
dtcAc+g+C0cr2ox6W1o4e2inQjYaXu2MlKkaAx4YTakqC1sXlb8NWRk8l7UUil+L
0e+mFZDxIW3i8MepgXPDa05m4b1ZoXa3EAR8e2++f8nXqJlcjoKQOLLTP64t2r1p
mrCjH+xke47uV36MaqIZ/W8Zx7CW1Cwt4wddzniySUjIfa8oB3OSvoHqx7kLfUvc
VQWumG2ETi87VSAePUI1DG4aksqTIJ6ZI87Qd/16OUP+9ivwtyPnlemWoMnLiPu7
GNPr
-----END CERTIFICATE-----
Subject: CN=ManagementCA,O=Keyfactor Community,C=SE
Issuer: CN=ManagementCA,O=Keyfactor Community,C=SE
-----BEGIN CERTIFICATE-----
MIIFdTCCA12gAwIBAgIUWpEFjDfFuGU6I5s/zCpuXrVmZIswDQYJKoZIhvcNAQEL
BQAwQjEVMBMGA1UEAwwMTWFuYWdlbWVudENBMRwwGgYDVQQKDBNLZXlmYWN0b3Ig
Q29tbXVuaXR5MQswCQYDVQQGEwJTRTAeFw0yMzAxMTgwODM0MDJaFw0zMzAxMTUw
ODM0MDFaMEIxFTATBgNVBAMMDE1hbmFnZW1lbnRDQTEcMBoGA1UECgwTS2V5ZmFj
dG9yIENvbW11bml0eTELMAkGA1UEBhMCU0UwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDIf6n+++qldacqGvWlgiPx7AnSMuremYdrRhoylF+3kJbDFiMp
KpVzEaeguionS4uXqErZAzgzcbu6huf4bRscYk04nCgXsFAMItsiEZ314oE4thv8
fbPPu4K1joeDgdHv0QhA3dkRUNorH54wOR6gLDzn6nBwePJAoKxhc/WoaONta2/O
tHeTemYZOLt+uMY+Hj3o2sMeTm3B/B/ED5BWzVMSPOCCV6qk5/cW/P2YvWfFHUja
8xqqbBuuDZHTuX4X58BsHH+o8bgZjWhdwcZb8Oe2VajFX6DpiBZcESQL+0ir0ZqG
zALBc8jADv0VZC0u1Pxj39p19Xosm46jelcH3CBD+65I+1Kg5aQ1tIpBHLvdJEuT
X6WkNPMmi0VqawxtlgshlF10kLsHm/r+dlGTQ78EA23JkgglBPovCmWSb6+KJyk/
q6dWElqrbdHwieuajb2D9s/P7RDU7h9gSf6C4nbIX1x5H/mpVCdZWDuqL0Y7tn9K
kvhh3TNXZf1TiryJkw3GDxHS88mh+pGEZsnC3hH5rLKj/JFVQtbWeu1QdhI5fFlh
PtUjIWeFHbgvMisd4qjouJfhuF2LRfpdn/u52MHTVntVGtGYNV3uUVpVR6YkFH0q
GfAqP5clv1qSF5gRANIPVQSpF0wcvTHvgWdv9bOy7a9BLvWFg46Ys4HKWQIDAQAB
o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNf+MZRDSTxfobte/gWA
BCwE86DSMB0GA1UdDgQWBBTX/jGUQ0k8X6G7Xv4FgAQsBPOg0jAOBgNVHQ8BAf8E
BAMCAYYwDQYJKoZIhvcNAQELBQADggIBAC17+M739nb2AG3bpKObDDlW+fYMdEhX
tjQcOvHIUrITKryX3lmHyWDFFgFTeTYcoxq8ywFvpvXz4pHgeFWRZYQw7cSWwH8n
JfLE+EJlpYU2yUGto/S8NPXV54dAYNsvQQncQixsIYgxsmX7yIzBt1+v3sLmQlp5
CfZRCOxj+2fa9jb/jygdQC3AAS5uT86gYz0YcB5VXQ0+jYWsL7MDwgb8ORcmiugd
uZ0kgBXd40Qg9bJhfz0N+BKWPTbS4dFst4ey5dndLp4QxWXzTt+gbmOMBpiwB6xx
H3hw/LrRBEs7hrhVIlJ76cMx/f/5wERD0qS3uPXpCCtcKDBqHFruOI/NMNEVRFwi
VxVD8w1jWYXDUyNVErU0LzqGOkyDuRwEDN8svaKn8+WdyumDB21tTWEbYPbFWc9R
2epNj8moBVcfnxwsVP5TCXk6tEEOMkCVLNC3JBUWSfGJjg/2PDEdo2cPYCXYU4Hu
eE/SnoUbRh0M34BfaHHt8S/vcEZWSkctJUmRZbTju57FKMlIHcgE5FHN5ahDAiSc
GgncvFfPKXcEPFh5bhKdhT6FzbKysCoRw16rwhzfsm4X42jvzBEOKpUcFDpRuBJs
zTk30lhAdmROkG5UTemobyKgDVw50VcFKbMk3Q5Gzs9TZ+uRAWJA7rF6MSc+cSlP
qMN+i82CAMeU
-----END CERTIFICATE-----
Select the PEM blob for the ManagementCA and copy it:
Subject: CN=ManagementCA,O=Keyfactor Community,C=SE
Issuer: CN=ManagementCA,O=Keyfactor Community,C=SE
-----BEGIN CERTIFICATE-----
MIIFdTCCA12gAwIBAgIUWpEFjDfFuGU6I5s
/zCpuXrVmZIswDQYJKoZIhvcNAQEL
BQAwQjEVMBMGA1UEAwwMTWFuYWdlbWVudENBMRwwGgYDVQQKDBNLZXlmYWN0b3Ig
Q29tbXVuaXR5MQswCQYDVQQGEwJTRTAeFw0yMzAxMTgwODM0MDJaFw0zMzAxMTUw
ODM0MDFaMEIxFTATBgNVBAMMDE1hbmFnZW1lbnRDQTEcMBoGA1UECgwTS2V5ZmFj
dG9yIENvbW11bml0eTELMAkGA1UEBhMCU0UwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDIf6n+++qldacqGvWlgiPx7AnSMuremYdrRhoylF+3kJbDFiMp
KpVzEaeguionS4uXqErZAzgzcbu6huf4bRscYk04nCgXsFAMItsiEZ314oE4thv8
fbPPu4K1joeDgdHv0QhA3dkRUNorH54wOR6gLDzn6nBwePJAoKxhc
/WoaONta2/O
tHeTemYZOLt+uMY+Hj3o2sMeTm3B
/B/ED5BWzVMSPOCCV6qk5/cW/P2YvWfFHUja
8xqqbBuuDZHTuX4X58BsHH+o8bgZjWhdwcZb8Oe2VajFX6DpiBZcESQL+0ir0ZqG
zALBc8jADv0VZC0u1Pxj39p19Xosm46jelcH3CBD+65I+1Kg5aQ1tIpBHLvdJEuT
X6WkNPMmi0VqawxtlgshlF10kLsHm
/r
+dlGTQ78EA23JkgglBPovCmWSb6+KJyk/
q6dWElqrbdHwieuajb2D9s
/P7RDU7h9gSf6C4nbIX1x5H/mpVCdZWDuqL0Y7tn9K
kvhh3TNXZf1TiryJkw3GDxHS88mh+pGEZsnC3hH5rLKj
/JFVQtbWeu1QdhI5fFlh
PtUjIWeFHbgvMisd4qjouJfhuF2LRfpdn
/u52MHTVntVGtGYNV3uUVpVR6YkFH0q
GfAqP5clv1qSF5gRANIPVQSpF0wcvTHvgWdv9bOy7a9BLvWFg46Ys4HKWQIDAQAB
o2MwYTAPBgNVHRMBAf8EBTADAQH
/MB8GA1UdIwQYMBaAFNf
+MZRDSTxfobte
/gWA
BCwE86DSMB0GA1UdDgQWBBTX
/jGUQ0k8X6G7Xv4FgAQsBPOg0jAOBgNVHQ8BAf8E
BAMCAYYwDQYJKoZIhvcNAQELBQADggIBAC17+M739nb2AG3bpKObDDlW+fYMdEhX
tjQcOvHIUrITKryX3lmHyWDFFgFTeTYcoxq8ywFvpvXz4pHgeFWRZYQw7cSWwH8n
JfLE+EJlpYU2yUGto
/S8NPXV54dAYNsvQQncQixsIYgxsmX7yIzBt1
+v3sLmQlp5
CfZRCOxj+2fa9jb
/jygdQC3AAS5uT86gYz0YcB5VXQ0
+jYWsL7MDwgb8ORcmiugd
uZ0kgBXd40Qg9bJhfz0N+BKWPTbS4dFst4ey5dndLp4QxWXzTt+gbmOMBpiwB6xx
H3hw
/LrRBEs7hrhVIlJ76cMx/f/5wERD0qS3uPXpCCtcKDBqHFruOI/NMNEVRFwi
VxVD8w1jWYXDUyNVErU0LzqGOkyDuRwEDN8svaKn8+WdyumDB21tTWEbYPbFWc9R
2epNj8moBVcfnxwsVP5TCXk6tEEOMkCVLNC3JBUWSfGJjg
/2PDEdo2cPYCXYU4Hu
eE
/SnoUbRh0M34BfaHHt8S/vcEZWSkctJUmRZbTju57FKMlIHcgE5FHN5ahDAiSc
GgncvFfPKXcEPFh5bhKdhT6FzbKysCoRw16rwhzfsm4X42jvzBEOKpUcFDpRuBJs
zTk30lhAdmROkG5UTemobyKgDVw50VcFKbMk3Q5Gzs9TZ+uRAWJA7rF6MSc+cSlP
qMN+i82CAMeU
-----END CERTIFICATE-----
Create the ManagementCA.crt file:
$ vim ManagementCA.crt
Enter the letter i to insert text.
Paste the ManagementCA PEM blob into the file:
Subject: CN=ManagementCA,O=Keyfactor Community,C=SE
Issuer: CN=ManagementCA,O=Keyfactor Community,C=SE
-----BEGIN CERTIFICATE-----
MIIFdTCCA12gAwIBAgIUWpEFjDfFuGU6I5s
/zCpuXrVmZIswDQYJKoZIhvcNAQEL
BQAwQjEVMBMGA1UEAwwMTWFuYWdlbWVudENBMRwwGgYDVQQKDBNLZXlmYWN0b3Ig
Q29tbXVuaXR5MQswCQYDVQQGEwJTRTAeFw0yMzAxMTgwODM0MDJaFw0zMzAxMTUw
ODM0MDFaMEIxFTATBgNVBAMMDE1hbmFnZW1lbnRDQTEcMBoGA1UECgwTS2V5ZmFj
dG9yIENvbW11bml0eTELMAkGA1UEBhMCU0UwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDIf6n+++qldacqGvWlgiPx7AnSMuremYdrRhoylF+3kJbDFiMp
KpVzEaeguionS4uXqErZAzgzcbu6huf4bRscYk04nCgXsFAMItsiEZ314oE4thv8
fbPPu4K1joeDgdHv0QhA3dkRUNorH54wOR6gLDzn6nBwePJAoKxhc
/WoaONta2/O
tHeTemYZOLt+uMY+Hj3o2sMeTm3B
/B/ED5BWzVMSPOCCV6qk5/cW/P2YvWfFHUja
8xqqbBuuDZHTuX4X58BsHH+o8bgZjWhdwcZb8Oe2VajFX6DpiBZcESQL+0ir0ZqG
zALBc8jADv0VZC0u1Pxj39p19Xosm46jelcH3CBD+65I+1Kg5aQ1tIpBHLvdJEuT
X6WkNPMmi0VqawxtlgshlF10kLsHm
/r
+dlGTQ78EA23JkgglBPovCmWSb6+KJyk/
q6dWElqrbdHwieuajb2D9s
/P7RDU7h9gSf6C4nbIX1x5H/mpVCdZWDuqL0Y7tn9K
kvhh3TNXZf1TiryJkw3GDxHS88mh+pGEZsnC3hH5rLKj
/JFVQtbWeu1QdhI5fFlh
PtUjIWeFHbgvMisd4qjouJfhuF2LRfpdn
/u52MHTVntVGtGYNV3uUVpVR6YkFH0q
GfAqP5clv1qSF5gRANIPVQSpF0wcvTHvgWdv9bOy7a9BLvWFg46Ys4HKWQIDAQAB
o2MwYTAPBgNVHRMBAf8EBTADAQH
/MB8GA1UdIwQYMBaAFNf
+MZRDSTxfobte
/gWA
BCwE86DSMB0GA1UdDgQWBBTX
/jGUQ0k8X6G7Xv4FgAQsBPOg0jAOBgNVHQ8BAf8E
BAMCAYYwDQYJKoZIhvcNAQELBQADggIBAC17+M739nb2AG3bpKObDDlW+fYMdEhX
tjQcOvHIUrITKryX3lmHyWDFFgFTeTYcoxq8ywFvpvXz4pHgeFWRZYQw7cSWwH8n
JfLE+EJlpYU2yUGto
/S8NPXV54dAYNsvQQncQixsIYgxsmX7yIzBt1
+v3sLmQlp5
CfZRCOxj+2fa9jb
/jygdQC3AAS5uT86gYz0YcB5VXQ0
+jYWsL7MDwgb8ORcmiugd
uZ0kgBXd40Qg9bJhfz0N+BKWPTbS4dFst4ey5dndLp4QxWXzTt+gbmOMBpiwB6xx
H3hw
/LrRBEs7hrhVIlJ76cMx/f/5wERD0qS3uPXpCCtcKDBqHFruOI/NMNEVRFwi
VxVD8w1jWYXDUyNVErU0LzqGOkyDuRwEDN8svaKn8+WdyumDB21tTWEbYPbFWc9R
2epNj8moBVcfnxwsVP5TCXk6tEEOMkCVLNC3JBUWSfGJjg
/2PDEdo2cPYCXYU4Hu
eE
/SnoUbRh0M34BfaHHt8S/vcEZWSkctJUmRZbTju57FKMlIHcgE5FHN5ahDAiSc
GgncvFfPKXcEPFh5bhKdhT6FzbKysCoRw16rwhzfsm4X42jvzBEOKpUcFDpRuBJs
zTk30lhAdmROkG5UTemobyKgDVw50VcFKbMk3Q5Gzs9TZ+uRAWJA7rF6MSc+cSlP
qMN+i82CAMeU
-----END CERTIFICATE-----
Enter :wq to save and close the file.
The EJBCA cert-manager external issuer RA credential has been created and uploaded to the K8’s server. Continue to the next step to deploy cert-manager and the EJBCA cert-manager external issuer.
Step 3 - Deploy cert-manager
To issue certificates using EJBCA and cert-manager, the cert-manager must be deployed. Using Helm and applying the Kubernetes Custom Resource Definitions (CRDs) gets cert-manager up and running quickly.
To deploy cert-manager, follow these steps:
Continue from the terminal window of the previous step.
Add the cert-manager helm repository:
$ helm repo add jetstack https:
//charts
.jetstack.io
The output is similar to the following:
"jetstack"
has been added to your repositories
Update the helm repository cache:
$ helm repo update
The output is similar to the following:
Hang tight
while
we grab the latest from your chart repositories...
...Successfully got an update from the
"hashicorp"
chart repository
...Successfully got an update from the
"jetstack"
chart repository
Update Complete. ⎈Happy Helming!⎈
Install the cert-manager Custom Resource Definitions:
$ kubectl apply -f https:
//github
.com
/cert-manager/cert-manager/releases/download/v1
.13.3
/cert-manager
.crds.yaml
The output is similar to the following:
customresourcedefinition.apiextensions.k8s.io
/certificaterequests
.cert-manager.io configured
customresourcedefinition.apiextensions.k8s.io
/certificates
.cert-manager.io configured
customresourcedefinition.apiextensions.k8s.io
/challenges
.acme.cert-manager.io configured
customresourcedefinition.apiextensions.k8s.io
/clusterissuers
.cert-manager.io configured
customresourcedefinition.apiextensions.k8s.io
/issuers
.cert-manager.io configured
customresourcedefinition.apiextensions.k8s.io
/orders
.acme.cert-manager.io configured
Deploy cert-manager using helm:
$ helm
install
\
cert-manager jetstack
/cert-manager
\
--namespace cert-manager \
--create-namespace \
--version v1.13.3
The output is similar to the following:
NAME: cert-manager
LAST DEPLOYED: Thu Jan 25 10:52:05 2024
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
cert-manager v1.13.3 has been deployed successfully!
In order to begin issuing certificates, you will need to
set
up a ClusterIssuer
or Issuer resource (
for
example, by creating a
'letsencrypt-staging'
issuer).
More information on the different types of issuers and how to configure them
can be found
in
our documentation:
https:
//cert-manager
.io
/docs/configuration/
For information on how to configure cert-manager to automatically provision
Certificates
for
Ingress resources, take a
look
at the `ingress-shim`
documentation:
https:
//cert-manager
.io
/docs/usage/ingress/
Deployment of cert-manager is now completed, you can continue to the next step to deploy the EJBCA cert-manager external issuer.
Step 4 - Deploy EJBCA cert-manager external issuer
To complete the integration, the EJBCA cert-manager external issuer container is deployed using Helm. This container is an external issuer for cert-manager which uses the EJBCA REST API to submit certificate requests and revoke certificates.
To deploy the EJBCA cert-manager external issuer, follow these steps:
Continue from the terminal window of the previous step.
Create the name space for the EJBCA cert-manager external issuer:
$ kubectl create namespace ejbca-cert-manager
The output is similar to the following:
namespace
/ejbca-cert-manager
created
Create the secret for the cert-manager-ra-01 credential:
$ kubectl -n ejbca-cert-manager create secret tls ejbca-secret --cert=cert-manager-ra-01.crt --key=cert-manager-ra-01-key.pem
The output is similar to the following:
secret
/ejbca-secret
created
Create the secret for the EJBCA TLS chain:
$ kubectl -n ejbca-cert-manager create secret generic ejbca-ca-secret --from-
file
=ca.crt=ManagementCA.crt
The output is similar to the following:
secret
/ejbca-ca-secret
created
Add the EJBCA cert-manager external issuer helm repository:
$ helm repo add ejbca-issuer https:
//keyfactor
.github.io
/ejbca-cert-manager-issuer
The output is similar to the following:
"ejbca-issuer"
has been added to your repositories
Update the helm repository cache:
$ helm repo update
The output is similar to the following:
Hang tight
while
we grab the latest from your chart repositories...
...Successfully got an update from the
"ejbca-issuer"
chart repository
...Successfully got an update from the
"hashicorp"
chart repository
...Successfully got an update from the
"jetstack"
chart repository
Update Complete. ⎈Happy Helming!⎈
Deploy the EJBCA cert-manager external issuer:
$ helm
install
ejbca-cert-manager-issuer ejbca-issuer
/ejbca-cert-manager-issuer
--namespace ejbca-cert-manager --
set
image.tag=
"1.3.2"
The output is similar to the following:
NAME: ejbca-cert-manager-issuer
LAST DEPLOYED: Thu Jan 25 08:52:16 2024
NAMESPACE: ejbca-cert-manager
STATUS: deployed
REVISION: 1
TEST SUITE: None
Create a namespace for issuing certificates with the EJBCA cert-manager external issuer:
$ kubectl create namespace pkirules
The output is similar to the following:
namespace
/pkirules
created
Create the issuer.yaml file:
cat
> issuer.yaml <<EOF
apiVersion: ejbca-issuer.keyfactor.com
/v1alpha1
kind: Issuer
metadata:
namespace: pkirules
labels:
# Customize to to your deployment, but these are optional
app.kubernetes.io
/name
: issuer
app.kubernetes.io
/instance
: pkirules-tls
app.kubernetes.io
/part-of
: ejbca-issuer
app.kubernetes.io
/created-by
: ejbca-issuer
name: pkirules-tls
spec:
hostname
:
"ejbca-internal.ejbca-k8s"
ejbcaSecretName:
"ejbca-secret"
certificateAuthorityName:
"MyPKISubCA-G1"
certificateProfileName:
"TLS Server Profile"
endEntityProfileName:
"TLS Server Profile"
caBundleSecretName: ejbca-ca-secret
EOF
Apply the issuer.yaml file to create an issuer in the pkirules namespace:
$ kubectl apply -f issuer.yaml
The output is similar to the following:
issuer.ejbca-issuer.keyfactor.com
/pkirules-tls
created
Create the clusterissuer.yaml file:
$
cat
> clusterissuer.yaml <<EOF
apiVersion: ejbca-issuer.keyfactor.com
/v1alpha1
kind: ClusterIssuer
metadata:
namespace: pkirules
labels:
# Customize to to your deployment, but these are optional
app.kubernetes.io
/name
: clusterissuer
app.kubernetes.io
/instance
: clusterissuer-pkirules
app.kubernetes.io
/part-of
: ejbca-issuer
app.kubernetes.io
/created-by
: ejbca-issuer
name: clusterissuer-pkirules
spec:
hostname
:
"ejbca-internal.ejbca-k8s"
ejbcaSecretName:
"ejbca-secret"
certificateAuthorityName:
"MyPKISubCA-G1"
certificateProfileName:
"TLS Server Profile"
endEntityProfileName:
"TLS Server Profile"
caBundleSecretName: ejbca-ca-secret
EOF
Apply the clusterissuer.yaml to create an issuer that uses EJBCA fro the Kubernetes cluster:
$ kubectl apply -f clusterissuer.yaml
The output is similar to the following:
clusterissuer.ejbca-issuer.keyfactor.com
/clusterissuer-pkirules
created
Get the issuers.ejbca-issuer.keyfactor.com:
$ kubectl -n pkirules get issuers.ejbca-issuer.keyfactor.com
The output is similar to the following:
NAME AGE
pkirules-tls 1m
Describe the issuers.ejbca-issuer.keyfactor.com:
$ kubectl -n pkirules describe issuers.ejbca-issuer.keyfactor.com
The output is similar to the following:
Name: pkirules-tls
Namespace: pkirules
Labels: app.kubernetes.io
/created-by
=ejbca-issuer
app.kubernetes.io
/instance
=pkirules-tls
app.kubernetes.io
/name
=issuer
app.kubernetes.io
/part-of
=ejbca-issuer
Annotations: <none>
API Version: ejbca-issuer.keyfactor.com
/v1alpha1
Kind: Issuer
Metadata:
Creation Timestamp: 2024-01-25T14:02:01Z
Generation: 1
Managed Fields:
API Version: ejbca-issuer.keyfactor.com
/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io
/last-applied-configuration
:
f:labels:
.:
f:app.kubernetes.io
/created-by
:
f:app.kubernetes.io
/instance
:
f:app.kubernetes.io
/name
:
f:app.kubernetes.io
/part-of
:
f:spec:
.:
f:caBundleSecretName:
f:certificateAuthorityName:
f:certificateProfileName:
f:ejbcaSecretName:
f:endEntityProfileName:
f:
hostname
:
Manager: kubectl-client-side-apply
Operation: Update
Time: 2024-01-25T14:02:01Z
API Version: ejbca-issuer.keyfactor.com
/v1alpha1
Fields Type: FieldsV1
fieldsV1:
f:status:
.:
f:conditions:
Manager: manager
Operation: Update
Subresource: status
Time: 2024-01-25T14:02:01Z
Resource Version: 601159
UID: 2f35a08b-c2f7-4612-b5be-bafd6bfaa2ad
Spec:
Ca Bundle Secret Name: ejbca-ca-secret
Certificate Authority Name: MyPKISubCA-G1
Certificate Profile Name: TLS Server Profile
Ejbca Secret Name: ejbca-secret
End Entity Profile Name: TLS Server Profile
Hostname: ejbca-internal.ejbca-k8s
Status:
Conditions:
Last Transition Time: 2024-01-25T14:02:01Z
Message: Success
Reason: ejbca-issuer.IssuerController.Reconcile
Status: True
Type: Ready
Events: <none>
You now have deployed the EJBCA cert-manager external issuer and can continue with issuing certificates.
Step 5 - Issue certificates with the EJBCA cert-manager external issuer
Now that cert-manager and the EJBCA cert-manager external issuer are deployed and configured, you can issue some certificates. Lets explore issuing a certificate manually, using a certificate object, and deploying a simple deployment that will request a certificate for an ingress.
Manual Issuance
Continue from the terminal window of the previous step.
Create an OpenSSL configuration file to generate TLS certificate CSR:
$ cat > test-cm-
01
.pkirules.conf <<EOF
[ req ]
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no
[ req_distinguished_name ]
countryName = SE
organizationName = Keyfactor Community
commonName = test-cm-
01
.pkirules
[ req_ext ]
subjectAltName =
@alt_names
[alt_names]
DNS.
1
= test-cm.pkirules
EOF
Generate an EC P-256 key using OpenSSL:
$ openssl ecparam -name prime256v1 -genkey -noout -out
test
-cm-01.pkirules.key
Generate a CSR with the EC Key and OpenSSL configuration file:
$ openssl req -new -sha256 -key
test
-cm-01.pkirules.key -out
test
-cm-01.pkirules.csr -config
test
-cm-01.pkirules.conf
Use base64 to encode the CSR and export it to a variable:
$ CSR64ECODE=
"$(base64 test-cm-01.pkirules.csr | tr -d \\n)"
Create a certificate request YAML file that is used to manually request a certificate with cert-manager:
$
cat
>
test
-cm-01.pkirules.yaml <<EOF
apiVersion: cert-manager.io
/v1
kind: CertificateRequest
metadata:
name:
test
-cm-01.pkirules
namespace: pkirules
spec:
request: $CSR64ECODE
issuerRef:
name: pkirules-tls
group: ejbca-issuer.keyfactor.com
kind: Issuer
EOF
Apply the test-cm-01.pkirules.yaml file which creates the certificate request with cert-manager:
$ kubectl apply -f
test
-cm-01.pkirules.yaml
The output is similar to the following:
certificaterequest.cert-manager.io
/test-cm-01
.pkirules created
List the certificate requests in the pkirules namespace:
$ kubectl -n pkirules get CertificateRequest
The output is similar to the following:
NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
test
-cm-01.pkirules True True pkirules-tls admin 2m18s
Describe the test-cm-01.pkirules certificate request to review the details:
$ kubectl -n pkirules describe CertificateRequest
/test-cm-01
.pkirules
The output is similar to the following:
Name:
test
-cm-01.pkirules
Namespace: pkirules
Labels: <none>
Annotations: <none>
API Version: cert-manager.io
/v1
Kind: CertificateRequest
Metadata:
Creation Timestamp: 2024-01-26T10:29:46Z
Generation: 1
Managed Fields:
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
f:conditions:
.:
k:{
"type"
:
"Approved"
}:
.:
f:lastTransitionTime:
f:message:
f:reason:
f:status:
f:
type
:
Manager: cert-manager-certificaterequests-approver
Operation: Update
Subresource: status
Time: 2024-01-26T10:29:46Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io
/last-applied-configuration
:
f:spec:
.:
f:issuerRef:
.:
f:group:
f:kind:
f:name:
f:request:
Manager: kubectl-client-side-apply
Operation: Update
Time: 2024-01-26T10:29:46Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
.:
f:ca:
f:certificate:
f:conditions:
k:{
"type"
:
"Ready"
}:
.:
f:lastTransitionTime:
f:message:
f:reason:
f:status:
f:
type
:
Manager: manager
Operation: Update
Subresource: status
Time: 2024-01-26T10:29:46Z
Resource Version: 649945
UID: 3d8fffb0-6876-4541-8df2-c8a8ab17ed19
Spec:
Groups:
system:masters
system:authenticated
Issuer Ref:
Group: ejbca-issuer.keyfactor.com
Kind: Issuer
Name: pkirules-tls
Request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQk1qQ0IyUUlCQURCSk1Rc3dDUVlEVlFRR0V3SlRSVEVjTUJvR0ExVUVDZ3dUUzJWNVptRmpkRzl5SUVOdgpiVzExYm1sMGVURWNNQm9HQTFVRUF3d1RkR1Z6ZEMxamJTMHdNUzV3YTJseWRXeGxjekJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQk5Va29xeHB3MGR5ZEQyWVdHSGN2UUNqS21ZbzdBZnVYK2NZeGpqWW5MZnEKVXpHZzkvTkxYM2VRRVlDd2pNTlQ4djNycVd2a2JmNFNmUWlJV29GSFoxMmdMakFzQmdrcWhraUc5dzBCQ1E0eApIekFkTUJzR0ExVWRFUVFVTUJLQ0VIUmxjM1F0WTIwdWNHdHBjblZzWlhNd0NnWUlLb1pJemowRUF3SURTQUF3ClJRSWdKQjArdCtySmZvNVRVYWVCcnFCU1RUYlZnTGVEeTh3Lzd1bFpNanJtTldnQ0lRRFdpNDJPcURHVVBqOHkKK3RWZmxXWTVWUWEreUQ4T1JURDZKMDZ5NHlKRWZBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
UID: admin
Username: admin
Status:
Ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNtVENDQWorZ0F3SUJBZ0lVSjBlTDlJbmxubWNDRWpxT3pPTmZOdFZ2QVRFd0NnWUlLb1pJemowRUF3UXcKU1RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4SERBYQpCZ05WQkFNTUUwMTVJRkJMU1NCU2IyOTBJRU5CSUMwZ1J6RXdIaGNOTWpNd01USXpNVFl5TkRRMVdoY05Nemd3Ck1URTVNVFl5TkRRMFdqQklNUXN3Q1FZRFZRUUdFd0pUUlRFY01Cb0dBMVVFQ2d3VFMyVjVabUZqZEc5eUlFTnYKYlcxMWJtbDBlVEViTUJrR0ExVUVBd3dTVFhrZ1VFdEpJRk4xWWlCRFFTQXRJRWN4TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRTZqUVhWWk9ha2JQNjFtdG5WVXcvVVl2RzNmQXhRdERBTjZqY0l6bzJLVXpqCmNaSzJkQ3BZUWhpZWdzQ0NLa20xYUhKYXlRNVFTb3hDcVFhUjUyYjZWYU9DQVFRd2dnRUFNQklHQTFVZEV3RUIKL3dRSU1BWUJBZjhDQVFBd0h3WURWUjBqQkJnd0ZvQVUxYzZkYUpDOWlJUzhQNzVlUTZybzB5UjRCNVV3WWdZSQpLd1lCQlFVSEFRRUVWakJVTURJR0NDc0dBUVVGQnpBQ2hpWm9kSFJ3T2k4dmJYa3VjR3RwTDJObGNuUnpMMDE1ClVFdEpVbTl2ZEVOQkxVY3hMbU55ZERBZUJnZ3JCZ0VGQlFjd0FZWVNhSFIwY0RvdkwyMTVMbkJyYVM5dlkzTncKTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTl0ZVM1d2Eya3ZZM0pzY3k5TmVWQkxTVkp2YjNSRApRUzFITVM1amNtd3dIUVlEVlIwT0JCWUVGTERsZjNaMDRpcTR1UGhZWlRQZ1lxSEtwRlB0TUE0R0ExVWREd0VCCi93UUVBd0lCaGpBS0JnZ3Foa2pPUFFRREJBTklBREJGQWlBWGN5VjdOdW1PU0RCMDVmeFBqMnRlR3RSWm1vMi8KMklIb0duY3MrNStyaVFJaEFPUEpyZEpTdTYzbFFxRXJwdks2cm1adkxobnE4ZXFHYkF6ekx0WVVseXVWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIyRENDQVg2Z0F3SUJBZ0lVQXV1TDFjL0FvRndzZnhnVXJPdmFSWGxkT1drd0NnWUlLb1pJemowRUF3UXcKU1RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4SERBYQpCZ05WQkFNTUUwMTVJRkJMU1NCU2IyOTBJRU5CSUMwZ1J6RXdJQmNOTWpNd01USXpNVFl4T0RVNFdoZ1BNakExCk16QXhNVFV4TmpFNE5UZGFNRWt4Q3pBSkJnTlZCQVlUQWxORk1Sd3dHZ1lEVlFRS0RCTkxaWGxtWVdOMGIzSWcKUTI5dGJYVnVhWFI1TVJ3d0dnWURWUVFEREJOTmVTQlFTMGtnVW05dmRDQkRRU0F0SUVjeE1Ga3dFd1lIS29aSQp6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVJTUw3a05LR0NqaktmeHd5Qi9zNHF0cEZnMi9hT1ZDZUFCeUVlRE1XCmR6SFlMTU9pZDQ5MDFaUFA1ak1HZ2hxODQreXp6TDV2Q1VYVEtCNDR6SmxVOXFOQ01FQXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVMWM2ZGFKQzlpSVM4UDc1ZVE2cm8weVI0QjVVd0RnWURWUjBQQVFILwpCQVFEQWdHR01Bb0dDQ3FHU000OUJBTUVBMGdBTUVVQ0lRQ2lGTi9vKytaK0FYa1ZVbk0yTTQydm1WVitLUGZMCnZka1JhT0g3RklJTEV3SWdFejBST1BQcFpBMlhGU2ExZG9ma0FZMWg1aUFid2c2Vk9hSTNLZm9hYlZBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
Certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akNDQW5DZ0F3SUJBZ0lVWStUTkNXdHRLc0RmcXREL0ZpZS9aRSsvYzQ4d0NnWUlLb1pJemowRUF3UXcKU0RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4R3pBWgpCZ05WQkFNTUVrMTVJRkJMU1NCVGRXSWdRMEVnTFNCSE1UQWVGdzB5TkRBeE1qWXhNREU1TkRaYUZ3MHlOVEF4Ck1qTXhNREU1TkRWYU1Fa3hDekFKQmdOVkJBWVRBbE5GTVJ3d0dnWURWUVFLREJOTFpYbG1ZV04wYjNJZ1EyOXQKYlhWdWFYUjVNUnd3R2dZRFZRUUREQk4wWlhOMExXTnRMVEF4TG5CcmFYSjFiR1Z6TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRTFTU2lyR25EUjNKMFBaaFlZZHk5QUtNcVppanNCKzVmNXhqR09OaWN0K3BUCk1hRDM4MHRmZDVBUmdMQ013MVB5L2V1cGErUnQvaEo5Q0loYWdVZG5YYU9DQVRVd2dnRXhNQjhHQTFVZEl3UVkKTUJhQUZMRGxmM1owNGlxNHVQaFlaVFBnWXFIS3BGUHRNR0VHQ0NzR0FRVUZCd0VCQkZVd1V6QXhCZ2dyQmdFRgpCUWN3QW9ZbGFIUjBjRG92TDIxNUxuQnJhUzlqWlhKMGN5OU5lVkJMU1ZOMVlrTkJMVWN4TG1OeWREQWVCZ2dyCkJnRUZCUWN3QVlZU2FIUjBjRG92TDIxNUxuQnJhUzl2WTNOd01EQUdBMVVkRVFRcE1DZUNFSFJsYzNRdFkyMHUKY0d0cGNuVnNaWE9DRTNSbGMzUXRZMjB0TURFdWNHdHBjblZzWlhNd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSApBd0V3TlFZRFZSMGZCQzR3TERBcW9DaWdKb1lrYUhSMGNEb3ZMMjE1TG5CcmFTOWpjbXh6TDAxNVVFdEpVM1ZpClEwRXRSekV1WTNKc01CMEdBMVVkRGdRV0JCVFQ4YTJEUTEwSGZCenhPc05LS3J1NVBGYU5LekFPQmdOVkhROEIKQWY4RUJBTUNCYUF3Q2dZSUtvWkl6ajBFQXdRRFNBQXdSUUlnVGhtdTdsTUFZM092Nnk3SmloWmdHMTZRNzYvdgpzVVlGanlYT1NiVEFUZVFDSVFEK2ZRbldlSWRXeVlhYU1HdElhMnVJbURFTE1PeWN1eFZKRVd3YXYvZ3hTQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
Conditions:
Last Transition Time: 2024-01-26T10:29:46Z
Message: Certificate request has been approved by cert-manager.io
Reason: cert-manager.io
Status: True
Type: Approved
Last Transition Time: 2024-01-26T10:29:46Z
Message: Signed
Reason: Issued
Status: True
Type: Ready
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal cert-manager.io 3m57s cert-manager-certificaterequests-approver Certificate request has been approved by cert-manager.io
The certificate can be obtained from the output and decoded with base64 to view:
$
echo
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5akNDQW5DZ0F3SUJBZ0lVWStUTkNXdHRLc0RmcXREL0ZpZS9aRSsvYzQ4d0NnWUlLb1pJemowRUF3UXcKU0RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4R3pBWgpCZ05WQkFNTUVrMTVJRkJMU1NCVGRXSWdRMEVnTFNCSE1UQWVGdzB5TkRBeE1qWXhNREU1TkRaYUZ3MHlOVEF4Ck1qTXhNREU1TkRWYU1Fa3hDekFKQmdOVkJBWVRBbE5GTVJ3d0dnWURWUVFLREJOTFpYbG1ZV04wYjNJZ1EyOXQKYlhWdWFYUjVNUnd3R2dZRFZRUUREQk4wWlhOMExXTnRMVEF4TG5CcmFYSjFiR1Z6TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRTFTU2lyR25EUjNKMFBaaFlZZHk5QUtNcVppanNCKzVmNXhqR09OaWN0K3BUCk1hRDM4MHRmZDVBUmdMQ013MVB5L2V1cGErUnQvaEo5Q0loYWdVZG5YYU9DQVRVd2dnRXhNQjhHQTFVZEl3UVkKTUJhQUZMRGxmM1owNGlxNHVQaFlaVFBnWXFIS3BGUHRNR0VHQ0NzR0FRVUZCd0VCQkZVd1V6QXhCZ2dyQmdFRgpCUWN3QW9ZbGFIUjBjRG92TDIxNUxuQnJhUzlqWlhKMGN5OU5lVkJMU1ZOMVlrTkJMVWN4TG1OeWREQWVCZ2dyCkJnRUZCUWN3QVlZU2FIUjBjRG92TDIxNUxuQnJhUzl2WTNOd01EQUdBMVVkRVFRcE1DZUNFSFJsYzNRdFkyMHUKY0d0cGNuVnNaWE9DRTNSbGMzUXRZMjB0TURFdWNHdHBjblZzWlhNd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSApBd0V3TlFZRFZSMGZCQzR3TERBcW9DaWdKb1lrYUhSMGNEb3ZMMjE1TG5CcmFTOWpjbXh6TDAxNVVFdEpVM1ZpClEwRXRSekV1WTNKc01CMEdBMVVkRGdRV0JCVFQ4YTJEUTEwSGZCenhPc05LS3J1NVBGYU5LekFPQmdOVkhROEIKQWY4RUJBTUNCYUF3Q2dZSUtvWkl6ajBFQXdRRFNBQXdSUUlnVGhtdTdsTUFZM092Nnk3SmloWmdHMTZRNzYvdgpzVVlGanlYT1NiVEFUZVFDSVFEK2ZRbldlSWRXeVlhYU1HdElhMnVJbURFTE1PeWN1eFZKRVd3YXYvZ3hTQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
| base64 -d
The output is similar to the following:
-----BEGIN CERTIFICATE-----
MIICyjCCAnCgAwIBAgIUY+TNCWttKsDfqtD
/Fie/ZE
+
/c48wCgYIKoZIzj0EAwQw
SDELMAkGA1UEBhMCU0UxHDAaBgNVBAoME0tleWZhY3RvciBDb21tdW5pdHkxGzAZ
BgNVBAMMEk15IFBLSSBTdWIgQ0EgLSBHMTAeFw0yNDAxMjYxMDE5NDZaFw0yNTAx
MjMxMDE5NDVaMEkxCzAJBgNVBAYTAlNFMRwwGgYDVQQKDBNLZXlmYWN0b3IgQ29t
bXVuaXR5MRwwGgYDVQQDDBN0ZXN0LWNtLTAxLnBraXJ1bGVzMFkwEwYHKoZIzj0C
AQYIKoZIzj0DAQcDQgAE1SSirGnDR3J0PZhYYdy9AKMqZijsB+5f5xjGONict+pT
MaD380tfd5ARgLCMw1Py
/eupa
+Rt
/hJ9CIhagUdnXaOCATUwggExMB8GA1UdIwQY
MBaAFLDlf3Z04iq4uPhYZTPgYqHKpFPtMGEGCCsGAQUFBwEBBFUwUzAxBggrBgEF
BQcwAoYlaHR0cDovL215LnBraS9jZXJ0cy9NeVBLSVN1YkNBLUcxLmNydDAeBggr
BgEFBQcwAYYSaHR0cDovL215LnBraS9vY3NwMDAGA1UdEQQpMCeCEHRlc3QtY20u
cGtpcnVsZXOCE3Rlc3QtY20tMDEucGtpcnVsZXMwEwYDVR0lBAwwCgYIKwYBBQUH
AwEwNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL215LnBraS9jcmxzL015UEtJU3Vi
Q0EtRzEuY3JsMB0GA1UdDgQWBBTT8a2DQ10HfBzxOsNKKru5PFaNKzAOBgNVHQ8B
Af8EBAMCBaAwCgYIKoZIzj0EAwQDSAAwRQIgThmu7lMAY3Ov6y7JihZgG16Q76
/v
sUYFjyXOSbTATeQCIQD+fQnWeIdWyYaaMGtIa2uImDELMOycuxVJEWwav
/gxSA
==
-----END CERTIFICATE-----
The certificate is ready to use from the manual request.
Certificate Kind Object Request
Create the test-cm-02.pkirules.yaml file to create a certificate with the certificate kind object:
$
cat
>
test
-cm-02.pkirules.yaml <<EOF
apiVersion: cert-manager.io
/v1
kind: Certificate
metadata:
name:
test
-cm-02.pkirules
namespace: pkirules
spec:
subject:
countries:
- SE
organizations:
- Keyfactor Community
commonName:
test
-cm-02.pkirules
#dnsNames:
#- test-cm-02.pkirules
privateKey:
algorithm: ECDSA
size: 256
secretName:
test
-cm-02
issuerRef:
name: pkirules-tls
group: ejbca-issuer.keyfactor.com
kind: Issuer
EOF
Apply the test-cm-02.pkirules.yaml file which enrolls for a certificate with cert-manager and creates a secret for the private key:
$ kubectl apply -f
test
-cm-02.pkirules.yaml
The output is similar to the following:
certificate.cert-manager.io
/test-cm-02
.pkirules created
List the certificate requests:
$ kubectl -n pkirules get CertificateRequest
The output is similar to the following:
NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
test
-cm-01.pkirules True True pkirules-tls admin 68m
test
-cm-02.pkirules-1 True True pkirules-tls system:serviceaccount:cert-manager:cert-manager 4m36s
Describe the test-cm-02.pkirules-1 certificate request:
$ kubectl -n pkirules describe CertificateRequest
test
-cm-02.pkirules-1
The output is similar to the following:
Name:
test
-cm-02.pkirules-1
Namespace: pkirules
Labels: <none>
Annotations: cert-manager.io
/certificate-name
:
test
-cm-02.pkirules
cert-manager.io
/certificate-revision
: 1
cert-manager.io
/private-key-secret-name
:
test
-cm-02.pkirules-qkncz
API Version: cert-manager.io
/v1
Kind: CertificateRequest
Metadata:
Creation Timestamp: 2024-01-26T11:33:44Z
Generation: 1
Managed Fields:
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
f:conditions:
.:
k:{
"type"
:
"Approved"
}:
.:
f:lastTransitionTime:
f:message:
f:reason:
f:status:
f:
type
:
Manager: cert-manager-certificaterequests-approver
Operation: Update
Subresource: status
Time: 2024-01-26T11:33:44Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:cert-manager.io
/certificate-name
:
f:cert-manager.io
/certificate-revision
:
f:cert-manager.io
/private-key-secret-name
:
f:ownerReferences:
.:
k:{
"uid"
:
"9298479a-3cc1-4370-9146-a1c361007c4a"
}:
f:spec:
.:
f:issuerRef:
.:
f:group:
f:kind:
f:name:
f:request:
Manager: cert-manager-certificates-request-manager
Operation: Update
Time: 2024-01-26T11:33:44Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
.:
f:ca:
f:certificate:
f:conditions:
k:{
"type"
:
"Ready"
}:
.:
f:lastTransitionTime:
f:message:
f:reason:
f:status:
f:
type
:
Manager: manager
Operation: Update
Subresource: status
Time: 2024-01-26T11:33:44Z
Owner References:
API Version: cert-manager.io
/v1
Block Owner Deletion:
true
Controller:
true
Kind: Certificate
Name:
test
-cm-02.pkirules
UID: 9298479a-3cc1-4370-9146-a1c361007c4a
Resource Version: 662225
UID: 8e9a8b60-07fa-4573-b1fe-23f3e67e2c39
Spec:
Extra:
authentication.kubernetes.io
/pod-name
:
cert-manager-55cf8685cb-tztzk
authentication.kubernetes.io
/pod-uid
:
6c69ccc4-46d3-45fd-a942-ec0df90a7ecc
Groups:
system:serviceaccounts
system:serviceaccounts:cert-manager
system:authenticated
Issuer Ref:
Group: ejbca-issuer.keyfactor.com
Kind: Issuer
Name: pkirules-tls
Request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQklUQ0J5UUlCQURCSk1Rc3dDUVlEVlFRR0V3SlRSVEVjTUJvR0ExVUVDaE1UUzJWNVptRmpkRzl5SUVOdgpiVzExYm1sMGVURWNNQm9HQTFVRUF4TVRkR1Z6ZEMxamJTMHdNaTV3YTJseWRXeGxjekJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQkdQWXFsU3hhM0xIUUhCYW9aMkVKNnVxcnNPb2xrQjV1UnBReHJPZzc1SDAKdEUzR3UvNFd5YW9jTVRqTWtPQlBjOGsxcUI0Wm52anozWFREeU5ZYmFKaWdIakFjQmdrcWhraUc5dzBCQ1E0eApEekFOTUFzR0ExVWREd1FFQXdJRm9EQUtCZ2dxaGtqT1BRUURBZ05IQURCRUFpQjE0ckp4YkRaRlhnc2tDRW42Ci9xN1FvdDF5UncyYWxFWHJ4TEcwc1FLWUN3SWdSeTRidnNtdllWQ0laTVBPd0FKWG9GaW12Zk5HZGJOSXRhb1cKNlJVMGZMRT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCg==
UID: 9ec1c31a-f7af-486c-b881-92d55dd4da1f
Username: system:serviceaccount:cert-manager:cert-manager
Status:
Ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNtVENDQWorZ0F3SUJBZ0lVSjBlTDlJbmxubWNDRWpxT3pPTmZOdFZ2QVRFd0NnWUlLb1pJemowRUF3UXcKU1RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4SERBYQpCZ05WQkFNTUUwMTVJRkJMU1NCU2IyOTBJRU5CSUMwZ1J6RXdIaGNOTWpNd01USXpNVFl5TkRRMVdoY05Nemd3Ck1URTVNVFl5TkRRMFdqQklNUXN3Q1FZRFZRUUdFd0pUUlRFY01Cb0dBMVVFQ2d3VFMyVjVabUZqZEc5eUlFTnYKYlcxMWJtbDBlVEViTUJrR0ExVUVBd3dTVFhrZ1VFdEpJRk4xWWlCRFFTQXRJRWN4TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRTZqUVhWWk9ha2JQNjFtdG5WVXcvVVl2RzNmQXhRdERBTjZqY0l6bzJLVXpqCmNaSzJkQ3BZUWhpZWdzQ0NLa20xYUhKYXlRNVFTb3hDcVFhUjUyYjZWYU9DQVFRd2dnRUFNQklHQTFVZEV3RUIKL3dRSU1BWUJBZjhDQVFBd0h3WURWUjBqQkJnd0ZvQVUxYzZkYUpDOWlJUzhQNzVlUTZybzB5UjRCNVV3WWdZSQpLd1lCQlFVSEFRRUVWakJVTURJR0NDc0dBUVVGQnpBQ2hpWm9kSFJ3T2k4dmJYa3VjR3RwTDJObGNuUnpMMDE1ClVFdEpVbTl2ZEVOQkxVY3hMbU55ZERBZUJnZ3JCZ0VGQlFjd0FZWVNhSFIwY0RvdkwyMTVMbkJyYVM5dlkzTncKTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTl0ZVM1d2Eya3ZZM0pzY3k5TmVWQkxTVkp2YjNSRApRUzFITVM1amNtd3dIUVlEVlIwT0JCWUVGTERsZjNaMDRpcTR1UGhZWlRQZ1lxSEtwRlB0TUE0R0ExVWREd0VCCi93UUVBd0lCaGpBS0JnZ3Foa2pPUFFRREJBTklBREJGQWlBWGN5VjdOdW1PU0RCMDVmeFBqMnRlR3RSWm1vMi8KMklIb0duY3MrNStyaVFJaEFPUEpyZEpTdTYzbFFxRXJwdks2cm1adkxobnE4ZXFHYkF6ekx0WVVseXVWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIyRENDQVg2Z0F3SUJBZ0lVQXV1TDFjL0FvRndzZnhnVXJPdmFSWGxkT1drd0NnWUlLb1pJemowRUF3UXcKU1RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4SERBYQpCZ05WQkFNTUUwMTVJRkJMU1NCU2IyOTBJRU5CSUMwZ1J6RXdJQmNOTWpNd01USXpNVFl4T0RVNFdoZ1BNakExCk16QXhNVFV4TmpFNE5UZGFNRWt4Q3pBSkJnTlZCQVlUQWxORk1Sd3dHZ1lEVlFRS0RCTkxaWGxtWVdOMGIzSWcKUTI5dGJYVnVhWFI1TVJ3d0dnWURWUVFEREJOTmVTQlFTMGtnVW05dmRDQkRRU0F0SUVjeE1Ga3dFd1lIS29aSQp6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVJTUw3a05LR0NqaktmeHd5Qi9zNHF0cEZnMi9hT1ZDZUFCeUVlRE1XCmR6SFlMTU9pZDQ5MDFaUFA1ak1HZ2hxODQreXp6TDV2Q1VYVEtCNDR6SmxVOXFOQ01FQXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVMWM2ZGFKQzlpSVM4UDc1ZVE2cm8weVI0QjVVd0RnWURWUjBQQVFILwpCQVFEQWdHR01Bb0dDQ3FHU000OUJBTUVBMGdBTUVVQ0lRQ2lGTi9vKytaK0FYa1ZVbk0yTTQydm1WVitLUGZMCnZka1JhT0g3RklJTEV3SWdFejBST1BQcFpBMlhGU2ExZG9ma0FZMWg1aUFid2c2Vk9hSTNLZm9hYlZBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
Certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN1RENDQWw2Z0F3SUJBZ0lVUGJYV3I5b1VIVUNzamtsZXBkY3Bva0s5V2JBd0NnWUlLb1pJemowRUF3UXcKU0RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4R3pBWgpCZ05WQkFNTUVrMTVJRkJMU1NCVGRXSWdRMEVnTFNCSE1UQWVGdzB5TkRBeE1qWXhNVEl6TkRSYUZ3MHlOVEF4Ck1qTXhNVEl6TkROYU1Fa3hDekFKQmdOVkJBWVRBbE5GTVJ3d0dnWURWUVFLREJOTFpYbG1ZV04wYjNJZ1EyOXQKYlhWdWFYUjVNUnd3R2dZRFZRUUREQk4wWlhOMExXTnRMVEF5TG5CcmFYSjFiR1Z6TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRVk5aXFWTEZyY3NkQWNGcWhuWVFucTZxdXc2aVdRSG01R2xER3M2RHZrZlMwClRjYTcvaGJKcWh3eE9NeVE0RTl6eVRXb0hobWUrUFBkZE1QSTFodG9tS09DQVNNd2dnRWZNQjhHQTFVZEl3UVkKTUJhQUZMRGxmM1owNGlxNHVQaFlaVFBnWXFIS3BGUHRNR0VHQ0NzR0FRVUZCd0VCQkZVd1V6QXhCZ2dyQmdFRgpCUWN3QW9ZbGFIUjBjRG92TDIxNUxuQnJhUzlqWlhKMGN5OU5lVkJMU1ZOMVlrTkJMVWN4TG1OeWREQWVCZ2dyCkJnRUZCUWN3QVlZU2FIUjBjRG92TDIxNUxuQnJhUzl2WTNOd01CNEdBMVVkRVFRWE1CV0NFM1JsYzNRdFkyMHQKTURJdWNHdHBjblZzWlhNd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3RXdOUVlEVlIwZkJDNHdMREFxb0NpZwpKb1lrYUhSMGNEb3ZMMjE1TG5CcmFTOWpjbXh6TDAxNVVFdEpVM1ZpUTBFdFJ6RXVZM0pzTUIwR0ExVWREZ1FXCkJCUmJDNDJRV2dBNGdwWTdBeU9HU1k2eTJOakpPakFPQmdOVkhROEJBZjhFQkFNQ0JhQXdDZ1lJS29aSXpqMEUKQXdRRFNBQXdSUUloQU9tZWNCejN3YnVxU2psei9PZlNsdDJhOXMzOTMvV05oc2pWOEJ1akRoSE5BaUJ2Y0owNQorWk45UWRmNFEzbDFRY3hmakRnWW1IeWl4SElmci91dlBHbk9Ddz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
Conditions:
Last Transition Time: 2024-01-26T11:33:44Z
Message: Certificate request has been approved by cert-manager.io
Reason: cert-manager.io
Status: True
Type: Approved
Last Transition Time: 2024-01-26T11:33:44Z
Message: Signed
Reason: Issued
Status: True
Type: Ready
Events: <none>
List the certificates created:
$ kubectl -n pkirules get certificate
The output is similar to the following:
NAME READY SECRET AGE
test
-cm-02.pkirules True
test
-cm-02 9m51s
Describe the test-cm-02.pkirules certificate:
$ kubectl -n pkirules describe certificate
test
-cm-02.pkirules
The output is similar to the following:
Name:
test
-cm-02.pkirules
Namespace: pkirules
Labels: <none>
Annotations: <none>
API Version: cert-manager.io
/v1
Kind: Certificate
Metadata:
Creation Timestamp: 2024-01-26T11:33:44Z
Generation: 1
Managed Fields:
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
f:revision:
Manager: cert-manager-certificates-issuing
Operation: Update
Subresource: status
Time: 2024-01-26T11:33:44Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
.:
f:conditions:
.:
k:{
"type"
:
"Ready"
}:
.:
f:lastTransitionTime:
f:message:
f:observedGeneration:
f:reason:
f:status:
f:
type
:
f:notAfter:
f:notBefore:
f:renewalTime:
Manager: cert-manager-certificates-readiness
Operation: Update
Subresource: status
Time: 2024-01-26T11:33:44Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:kubectl.kubernetes.io
/last-applied-configuration
:
f:spec:
.:
f:commonName:
f:issuerRef:
.:
f:group:
f:kind:
f:name:
f:privateKey:
.:
f:algorithm:
f:size:
f:secretName:
f:subject:
.:
f:countries:
f:organizations:
Manager: kubectl-client-side-apply
Operation: Update
Time: 2024-01-26T11:33:44Z
Resource Version: 662231
UID: 9298479a-3cc1-4370-9146-a1c361007c4a
Spec:
Common Name:
test
-cm-02.pkirules
Issuer Ref:
Group: ejbca-issuer.keyfactor.com
Kind: Issuer
Name: pkirules-tls
Private Key:
Algorithm: ECDSA
Size: 256
Secret Name:
test
-cm-02
Subject:
Countries:
SE
Organizations:
Keyfactor Community
Status:
Conditions:
Last Transition Time: 2024-01-26T11:33:44Z
Message: Certificate is up to
date
and has not expired
Observed Generation: 1
Reason: Ready
Status: True
Type: Ready
Not After: 2025-01-23T11:23:43Z
Not Before: 2024-01-26T11:23:44Z
Renewal Time: 2024-09-24T11:23:43Z
Revision: 1
Events: <none>
List the secrets:
$ kubectl -n pkirules get secrets
The output is similar to the following:
NAME TYPE DATA AGE
test
-cm-02 kubernetes.io
/tls
3 13m
Describe the test-cm-02 secret:
$ kubectl -n pkirules describe secrets
test
-cm-02
The output is similar to the following:
Name:
test
-cm-02
Namespace: pkirules
Labels: controller.cert-manager.io
/fao
=
true
Annotations: cert-manager.io
/alt-names
:
test
-cm-02.pkirules
cert-manager.io
/certificate-name
:
test
-cm-02.pkirules
cert-manager.io
/common-name
:
test
-cm-02.pkirules
cert-manager.io
/ip-sans
:
cert-manager.io
/issuer-group
: ejbca-issuer.keyfactor.com
cert-manager.io
/issuer-kind
: Issuer
cert-manager.io
/issuer-name
: pkirules-tls
cert-manager.io
/subject-countries
: SE
cert-manager.io
/subject-organizations
: Keyfactor Community
cert-manager.io
/uri-sans
:
Type: kubernetes.io
/tls
Data
====
ca.crt: 1660 bytes
tls.crt: 1005 bytes
tls.key: 227 bytes
The certificate can now be used, for example by mounting the secret into a container
Request Certificate for Ingress Using a Simple Deployment
Create the simple deployment YAML file to deploy a container and issue a certificate to ingress:
$
cat
> ejbca-cm-issuer-hello-world.yaml <<EOF
---
apiVersion: apps
/v1
kind: Deployment
metadata:
name: ejbca-cm-issuer-helloworld-one
namespace: pkirules
spec:
replicas: 1
selector:
matchLabels:
app: ejbca-cm-issuer-helloworld-one
template:
metadata:
labels:
app: ejbca-cm-issuer-helloworld-one
spec:
containers:
- name: ejbca-cm-issuer-helloworld-one
image: hashicorp
/http-echo
:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: helloworld
namespace: pkirules
spec:
#type: ClusterIP
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: ejbca-cm-issuer-helloworld-one
apiVersion: networking.k8s.io
/v1
kind: Ingress
metadata:
name: hellowworld-ingress
namespace: pkirules
annotations:
cert-manager.io
/issuer
:
"pkirules-tls"
cert-manager.io
/issuer-kind
:
"Issuer"
cert-manager.io
/issuer-group
:
"ejbca-issuer.keyfactor.com"
cert-manager.io
/common-name
:
"test-cm-03.pkirules"
cert-manager.io
/subject-organizations
:
"Keyfactor Community"
cert-manager.io
/subject-countries
:
"SE"
cert-manager.io
/private-key-algorithm
:
"ECDSA"
cert-manager.io
/private-key-size
:
"256"
spec:
ingressClassName: public
tls:
- hosts:
-
test
-cm-03.pkirules
secretName:
test
-cm-03.pkirules
rules:
- host:
test
-cm-03.pkirules
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: helloworld
port:
number: 80
EOF
Apply ejbca-cm-issuer-hello-world.yaml file which starts the deployment and requests a certificate for Ingress using cert-manager:
$ kubectl apply -f ejbca-cm-issuer-hello-world.yaml
The output is similar to the following:
deployment.apps
/ejbca-cm-issuer-helloworld-one
created
ingress.networking.k8s.io
/hellowworld-ingress
created
List the certificate requests:
$ kubectl -n pkirules get CertificateRequest
The output is similar to the following:
NAME APPROVED DENIED READY ISSUER REQUESTOR AGE
test
-cm-01.pkirules True True pkirules-tls admin 177m
test
-cm-02.pkirules-1 True True pkirules-tls system:serviceaccount:cert-manager:cert-manager 113m
test
-cm-03.pkirules-1 True True pkirules-tls system:serviceaccount:cert-manager:cert-manager 65s
Describe the test-cm-03.pkirules-1 certificate request:
$ kubectl -n pkirules describe CertificateRequest
test
-cm-03.pkirules-1
The output is similar to the following:
Name:
test
-cm-03.pkirules-1
Namespace: pkirules
Labels: <none>
Annotations: cert-manager.io
/certificate-name
:
test
-cm-03.pkirules
cert-manager.io
/certificate-revision
: 1
cert-manager.io
/private-key-secret-name
:
test
-cm-03.pkirules-fkdg8
API Version: cert-manager.io
/v1
Kind: CertificateRequest
Metadata:
Creation Timestamp: 2024-01-26T13:26:35Z
Generation: 1
Managed Fields:
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
f:conditions:
.:
k:{
"type"
:
"Approved"
}:
.:
f:lastTransitionTime:
f:message:
f:reason:
f:status:
f:
type
:
Manager: cert-manager-certificaterequests-approver
Operation: Update
Subresource: status
Time: 2024-01-26T13:26:35Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:cert-manager.io
/certificate-name
:
f:cert-manager.io
/certificate-revision
:
f:cert-manager.io
/private-key-secret-name
:
f:ownerReferences:
.:
k:{
"uid"
:
"9ec95bfc-a645-417c-9634-8e727bdeacf3"
}:
f:spec:
.:
f:issuerRef:
.:
f:group:
f:kind:
f:name:
f:request:
f:usages:
Manager: cert-manager-certificates-request-manager
Operation: Update
Time: 2024-01-26T13:26:35Z
API Version: cert-manager.io
/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
.:
f:ca:
f:certificate:
f:conditions:
k:{
"type"
:
"Ready"
}:
.:
f:lastTransitionTime:
f:message:
f:reason:
f:status:
f:
type
:
Manager: manager
Operation: Update
Subresource: status
Time: 2024-01-26T13:26:35Z
Owner References:
API Version: cert-manager.io
/v1
Block Owner Deletion:
true
Controller:
true
Kind: Certificate
Name:
test
-cm-03.pkirules
UID: 9ec95bfc-a645-417c-9634-8e727bdeacf3
Resource Version: 683881
UID: 347ccb7b-fb8c-4e26-97da-d22739a565cc
Spec:
Extra:
authentication.kubernetes.io
/pod-name
:
cert-manager-55cf8685cb-tztzk
authentication.kubernetes.io
/pod-uid
:
6c69ccc4-46d3-45fd-a942-ec0df90a7ecc
Groups:
system:serviceaccounts
system:serviceaccounts:cert-manager
system:authenticated
Issuer Ref:
Group: ejbca-issuer.keyfactor.com
Kind: Issuer
Name: pkirules-tls
Request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQlF6Q0I2UUlCQURCSk1Rc3dDUVlEVlFRR0V3SlRSVEVjTUJvR0ExVUVDaE1UUzJWNVptRmpkRzl5SUVOdgpiVzExYm1sMGVURWNNQm9HQTFVRUF4TVRkR1Z6ZEMxamJTMHdNeTV3YTJseWRXeGxjekJaTUJNR0J5cUdTTTQ5CkFnRUdDQ3FHU000OUF3RUhBMElBQkNJSVhlaTNnd00zc1cwZ0trOUQyQkV5U3E4NDVET29oRVhwblBWODdBbm8KUFRXeE5qMjlzaUVxN1RqR2lLTlhBUGpzRjBqcU1VNFVQbTJxWHlncmdZK2dQakE4QmdrcWhraUc5dzBCQ1E0eApMekF0TUI0R0ExVWRFUVFYTUJXQ0UzUmxjM1F0WTIwdE1ETXVjR3RwY25Wc1pYTXdDd1lEVlIwUEJBUURBZ1dnCk1Bb0dDQ3FHU000OUJBTUNBMGtBTUVZQ0lRRC9kS0E1VEpyYzZxMHhEUEhGNkJLRmppWjVJSkhWY3FDMnQ5TnAKSjQrcnRnSWhBTGxzNVpROGlJbmtHNjZ1NTNYdnUveVdIYzJDbGpCdFk3bFUvdSt2VVVKaQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
UID: 9ec1c31a-f7af-486c-b881-92d55dd4da1f
Usages:
digital signature
key encipherment
Username: system:serviceaccount:cert-manager:cert-manager
Status:
Ca: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNtVENDQWorZ0F3SUJBZ0lVSjBlTDlJbmxubWNDRWpxT3pPTmZOdFZ2QVRFd0NnWUlLb1pJemowRUF3UXcKU1RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4SERBYQpCZ05WQkFNTUUwMTVJRkJMU1NCU2IyOTBJRU5CSUMwZ1J6RXdIaGNOTWpNd01USXpNVFl5TkRRMVdoY05Nemd3Ck1URTVNVFl5TkRRMFdqQklNUXN3Q1FZRFZRUUdFd0pUUlRFY01Cb0dBMVVFQ2d3VFMyVjVabUZqZEc5eUlFTnYKYlcxMWJtbDBlVEViTUJrR0ExVUVBd3dTVFhrZ1VFdEpJRk4xWWlCRFFTQXRJRWN4TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRTZqUVhWWk9ha2JQNjFtdG5WVXcvVVl2RzNmQXhRdERBTjZqY0l6bzJLVXpqCmNaSzJkQ3BZUWhpZWdzQ0NLa20xYUhKYXlRNVFTb3hDcVFhUjUyYjZWYU9DQVFRd2dnRUFNQklHQTFVZEV3RUIKL3dRSU1BWUJBZjhDQVFBd0h3WURWUjBqQkJnd0ZvQVUxYzZkYUpDOWlJUzhQNzVlUTZybzB5UjRCNVV3WWdZSQpLd1lCQlFVSEFRRUVWakJVTURJR0NDc0dBUVVGQnpBQ2hpWm9kSFJ3T2k4dmJYa3VjR3RwTDJObGNuUnpMMDE1ClVFdEpVbTl2ZEVOQkxVY3hMbU55ZERBZUJnZ3JCZ0VGQlFjd0FZWVNhSFIwY0RvdkwyMTVMbkJyYVM5dlkzTncKTURZR0ExVWRId1F2TUMwd0s2QXBvQ2VHSldoMGRIQTZMeTl0ZVM1d2Eya3ZZM0pzY3k5TmVWQkxTVkp2YjNSRApRUzFITVM1amNtd3dIUVlEVlIwT0JCWUVGTERsZjNaMDRpcTR1UGhZWlRQZ1lxSEtwRlB0TUE0R0ExVWREd0VCCi93UUVBd0lCaGpBS0JnZ3Foa2pPUFFRREJBTklBREJGQWlBWGN5VjdOdW1PU0RCMDVmeFBqMnRlR3RSWm1vMi8KMklIb0duY3MrNStyaVFJaEFPUEpyZEpTdTYzbFFxRXJwdks2cm1adkxobnE4ZXFHYkF6ekx0WVVseXVWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIyRENDQVg2Z0F3SUJBZ0lVQXV1TDFjL0FvRndzZnhnVXJPdmFSWGxkT1drd0NnWUlLb1pJemowRUF3UXcKU1RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4SERBYQpCZ05WQkFNTUUwMTVJRkJMU1NCU2IyOTBJRU5CSUMwZ1J6RXdJQmNOTWpNd01USXpNVFl4T0RVNFdoZ1BNakExCk16QXhNVFV4TmpFNE5UZGFNRWt4Q3pBSkJnTlZCQVlUQWxORk1Sd3dHZ1lEVlFRS0RCTkxaWGxtWVdOMGIzSWcKUTI5dGJYVnVhWFI1TVJ3d0dnWURWUVFEREJOTmVTQlFTMGtnVW05dmRDQkRRU0F0SUVjeE1Ga3dFd1lIS29aSQp6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVJTUw3a05LR0NqaktmeHd5Qi9zNHF0cEZnMi9hT1ZDZUFCeUVlRE1XCmR6SFlMTU9pZDQ5MDFaUFA1ak1HZ2hxODQreXp6TDV2Q1VYVEtCNDR6SmxVOXFOQ01FQXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVMWM2ZGFKQzlpSVM4UDc1ZVE2cm8weVI0QjVVd0RnWURWUjBQQVFILwpCQVFEQWdHR01Bb0dDQ3FHU000OUJBTUVBMGdBTUVVQ0lRQ2lGTi9vKytaK0FYa1ZVbk0yTTQydm1WVitLUGZMCnZka1JhT0g3RklJTEV3SWdFejBST1BQcFpBMlhGU2ExZG9ma0FZMWg1aUFid2c2Vk9hSTNLZm9hYlZBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
Certificate: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN6RENDQW5PZ0F3SUJBZ0lVUmlhY0p1Vkk2TzhKTHNaajY1QW93aGwxNVcwd0NnWUlLb1pJemowRUF3UXcKU0RFTE1Ba0dBMVVFQmhNQ1UwVXhIREFhQmdOVkJBb01FMHRsZVdaaFkzUnZjaUJEYjIxdGRXNXBkSGt4R3pBWgpCZ05WQkFNTUVrMTVJRkJMU1NCVGRXSWdRMEVnTFNCSE1UQWVGdzB5TkRBeE1qWXhNekUyTXpWYUZ3MHlOVEF4Ck1qTXhNekUyTXpSYU1Fa3hDekFKQmdOVkJBWVRBbE5GTVJ3d0dnWURWUVFLREJOTFpYbG1ZV04wYjNJZ1EyOXQKYlhWdWFYUjVNUnd3R2dZRFZRUUREQk4wWlhOMExXTnRMVEF6TG5CcmFYSjFiR1Z6TUZrd0V3WUhLb1pJemowQwpBUVlJS29aSXpqMERBUWNEUWdBRUlnaGQ2TGVEQXpleGJTQXFUMFBZRVRKS3J6amtNNmlFUmVtYzlYenNDZWc5Ck5iRTJQYjJ5SVNydE9NYUlvMWNBK093WFNPb3hUaFErYmFwZktDdUJqNk9DQVRnd2dnRTBNQjhHQTFVZEl3UVkKTUJhQUZMRGxmM1owNGlxNHVQaFlaVFBnWXFIS3BGUHRNR0VHQ0NzR0FRVUZCd0VCQkZVd1V6QXhCZ2dyQmdFRgpCUWN3QW9ZbGFIUjBjRG92TDIxNUxuQnJhUzlqWlhKMGN5OU5lVkJMU1ZOMVlrTkJMVWN4TG1OeWREQWVCZ2dyCkJnRUZCUWN3QVlZU2FIUjBjRG92TDIxNUxuQnJhUzl2WTNOd01ETUdBMVVkRVFRc01DcUNFM1JsYzNRdFkyMHQKTURNdWNHdHBjblZzWlhPQ0UzUmxjM1F0WTIwdE1ETXVjR3RwY25Wc1pYTXdFd1lEVlIwbEJBd3dDZ1lJS3dZQgpCUVVIQXdFd05RWURWUjBmQkM0d0xEQXFvQ2lnSm9Za2FIUjBjRG92TDIxNUxuQnJhUzlqY214ekwwMTVVRXRKClUzVmlRMEV0UnpFdVkzSnNNQjBHQTFVZERnUVdCQlE1OUhCOVFnNEtYNFNNUjVMdDRPbzMybHZCeERBT0JnTlYKSFE4QkFmOEVCQU1DQmFBd0NnWUlLb1pJemowRUF3UURSd0F3UkFJZ0o1STB6UVZNVk8zdy9zSGpCdEdhTEt3Ugo2dnd1QWNQQkErTnNvc3ozbGVnQ0lCNEpOTmpXb3dmMXpKSFRiNkFXUXR4UDlIL2M4aDBiNWY0aDluN3ptVFc3Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
Conditions:
Last Transition Time: 2024-01-26T13:26:35Z
Message: Certificate request has been approved by cert-manager.io
Reason: cert-manager.io
Status: True
Type: Approved
Last Transition Time: 2024-01-26T13:26:35Z
Message: Signed
Reason: Issued
Status: True
Type: Ready
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal cert-manager.io 2m20s cert-manager-certificaterequests-approver Certificate request has been approved by cert-manager.io
Describe the ingress to see that a certificate was created:
$ kubectl -n pkirules describe ingress
/hellowworld-ingress
The output is similar to the following:
Name: hellowworld-ingress
Labels: <none>
Namespace: pkirules
Address:
127.0
.
0.1
Ingress Class:
public
Default backend: <
default
>
TLS:
test-cm-
03
.pkirules terminates test-cm-
03
.pkirules
Rules:
Host Path Backends
---- ---- --------
test-cm-
03
.pkirules
/ helloworld:
80
(<error: endpoints
"helloworld"
not found>)
Annotations: cert-manager.io/common-name: test-cm-
03
.pkirules
cert-manager.io/issuer: pkirules-tls
cert-manager.io/issuer-group: ejbca-issuer.keyfactor.com
cert-manager.io/issuer-kind: Issuer
cert-manager.io/
private
-key-algorithm: ECDSA
cert-manager.io/
private
-key-size:
256
cert-manager.io/subject-countries: SE
cert-manager.io/subject-organizations: Keyfactor Community
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreateCertificate 3m17s cert-manager-ingress-shim Successfully created Certificate
"test-cm-03.pkirules"
Normal Sync 2m19s (x2 over 3m17s) nginx-ingress-controller Scheduled
for
sync
[user
@microk8
-
01
cert-manager]$
You now have deployed certificates three different ways using the EJBCA cert-manager external issuer integration.
Next steps
In this tutorial, you learned how to configure EJBCA for the cert-manager integration and issue certificates from EJBCA natively through cert-manager. Three different issuance methods were demonstrated for this integration.
Here are some next steps we recommend:
Unable to render include or excerpt-include. Could not retrieve page.