-The Kubernetes Orchestrator allows for the remote management of certificate stores defined in a Kubernetes cluster. The following types of Kubernetes resources are supported: kubernetes secrets of `kubernetes.io/tls` or `Opaque` and kubernetes certificates `certificates.k8s.io/v1`
+## Overview
-#### Integration status: Production - Ready for use in production environments.
+The Kubernetes Orchestrator allows for the remote management of certificate stores defined in a Kubernetes cluster.
+The following types of Kubernetes resources are supported: kubernetes secrets of `kubernetes.io/tls` or `Opaque` and
+kubernetes certificates `certificates.k8s.io/v1`
+
+The certificate store types that can be managed in the current version are:
+- `K8SCert` - Kubernetes certificates of type `certificates.k8s.io/v1`
+- `K8SSecret` - Kubernetes secrets of type `Opaque`
+- `K8STLSSecret` - Kubernetes secrets of type `kubernetes.io/tls`
+- `K8SCluster` - This allows for a single store to manage a k8s cluster's secrets or type `Opaque` and `kubernetes.io/tls`.
+ This can be thought of as a container of `K8SSecret` and `K8STLSSecret` stores across all k8s namespaces.
+- `K8SNS` - This allows for a single store to manage a k8s namespace's secrets or type `Opaque` and `kubernetes.io/tls`.
+ This can be thought of as a container of `K8SSecret` and `K8STLSSecret` stores for a single k8s namespace.
+- `K8SJKS` - Kubernetes secrets of type `Opaque` that contain one or more Java Keystore(s). These cannot be managed at the
+ cluster or namespace level as they should all require unique credentials.
+- `K8SPKCS12` - Kubernetes secrets of type `Opaque` that contain one or more PKCS12(s). These cannot be managed at the
+ cluster or namespace level as they should all require unique credentials.
+
+This orchestrator extension makes use of the Kubernetes API by using a service account
+to communicate remotely with certificate stores. The service account must have the correct permissions
+in order to perform the desired operations. For more information on the required permissions, see the
+[service account setup guide](#service-account-setup).
-## About the Keyfactor Universal Orchestrator Extension
+The Kubernetes Universal Orchestrator extension implements 7 Certificate Store Types. Depending on your use case, you may elect to use one, or all of these Certificate Store Types. Descriptions of each are provided below.
-This repository contains a Universal Orchestrator Extension which is a plugin to the Keyfactor Universal Orchestrator. Within the Keyfactor Platform, Orchestrators are used to manage “certificate stores” — collections of certificates and roots of trust that are found within and used by various applications.
+- [K8SCert](#K8SCert)
-The Universal Orchestrator is part of the Keyfactor software distribution and is available via the Keyfactor customer portal. For general instructions on installing Extensions, see the “Keyfactor Command Orchestrator Installation and Configuration Guide” section of the Keyfactor documentation. For configuration details of this specific Extension see below in this readme.
+- [K8SCluster](#K8SCluster)
-The Universal Orchestrator is the successor to the Windows Orchestrator. This Orchestrator Extension plugin only works with the Universal Orchestrator and does not work with the Windows Orchestrator.
+- [K8SJKS](#K8SJKS)
-## Support for Kubernetes Orchestrator Extension
+- [K8SNS](#K8SNS)
-Kubernetes Orchestrator Extension is supported by Keyfactor for Keyfactor customers. If you have a support issue, please open a support ticket via the Keyfactor Support Portal at https://support.keyfactor.com
+- [K8SPKCS12](#K8SPKCS12)
-###### To report a problem or suggest a new feature, use the **[Issues](../../issues)** tab. If you want to contribute actual bug fixes or proposed enhancements, use the **[Pull requests](../../pulls)** tab.
+- [K8SSecret](#K8SSecret)
----
+- [K8STLSSecr](#K8STLSSecr)
----
+## Compatibility
+This integration is compatible with Keyfactor Universal Orchestrator version 12.4 and later.
+## Support
+The Kubernetes Universal Orchestrator extension is community open source and there is **no SLA**. Keyfactor will address issues as resources become available.
-## Keyfactor Version Supported
+> To report a problem or suggest a new feature, use the **[Issues](../../issues)** tab. If you want to contribute bug fixes or additional enhancements, use the **[Pull requests](../../pulls)** tab.
-The minimum version of the Keyfactor Universal Orchestrator Framework needed to run this version of the extension is 10.x
-## Platform Specific Notes
+## Requirements & Prerequisites
-The Keyfactor Universal Orchestrator may be installed on either Windows or Linux based platforms. The certificate operations supported by a capability may vary based what platform the capability is installed on. The table below indicates what capabilities are supported based on which platform the encompassing Universal Orchestrator is running.
-| Operation | Win | Linux |
-|-----|-----|------|
-|Supports Management Add|✓ |✓ |
-|Supports Management Remove|✓ |✓ |
-|Supports Create Store|✓ |✓ |
-|Supports Discovery|✓ |✓ |
-|Supports Reenrollment| | |
-|Supports Inventory|✓ |✓ |
+Before installing the Kubernetes Universal Orchestrator extension, we recommend that you install [kfutil](https://github.com/Keyfactor/kfutil). Kfutil is a command-line tool that simplifies the process of creating store types, installing extensions, and instantiating certificate stores in Keyfactor Command.
-## PAM Integration
+### Kubernetes API Access
+This orchestrator extension makes use of the Kubernetes API by using a service account
+to communicate remotely with certificate stores. The service account must exist and have the appropriate permissions.
+The service account token can be provided to the extension in one of two ways:
+- As a raw JSON file that contains the service account credentials
+- As a base64 encoded string that contains the service account credentials
-This orchestrator extension has the ability to connect to a variety of supported PAM providers to allow for the retrieval of various client hosted secrets right from the orchestrator server itself. This eliminates the need to set up the PAM integration on Keyfactor Command which may be in an environment that the client does not want to have access to their PAM provider.
+#### Service Account Setup
+To set up a service account user on your Kubernetes cluster to be used by the Kubernetes Orchestrator Extension. For full
+information on the required permissions, see the [service account setup guide](./scripts/kubernetes/README.md).
-The secrets that this orchestrator extension supports for use with a PAM Provider are:
-| Name | Description |
-|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| ServerUsername | Must be set to `kubeconfig` if used. If you do not set it to `kubeconfig` the `ServerPassword` will be ignored. |
-| ServerPassword | Must be set if `ServerUsername` is provided. The service account credentials for the Universal Orchestrator to use. Must be in `kubeconfig` format. For more information review [Kubernetes service account](https://github.com/Keyfactor/kubernetes-orchestrator/blob/main/scripts/kubernetes/README.md) docs and scripts. |
-
+## Certificate Store Types
-It is not necessary to use a PAM Provider for all of the secrets available above. If a PAM Provider should not be used, simply enter in the actual value to be used, as normal.
+To use the Kubernetes Universal Orchestrator extension, you **must** create the Certificate Store Types required for your use-case. This only needs to happen _once_ per Keyfactor Command instance.
-If a PAM Provider will be used for one of the fields above, start by referencing the [Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam). The GitHub repo for the PAM Provider to be used contains important information such as the format of the `json` needed. What follows is an example but does not reflect the `json` values for all PAM Providers as they have different "instance" and "initialization" parameter names and values.
+The Kubernetes Universal Orchestrator extension implements 7 Certificate Store Types. Depending on your use case, you may elect to use one, or all of these Certificate Store Types.
-General PAM Provider Configuration
-
+### K8SCert
+Click to expand details
-### Example PAM Provider Setup
+The `K8SCert` store type is used to manage Kubernetes certificates of type `certificates.k8s.io/v1`.
-To use a PAM Provider to resolve a field, in this example the __Server Password__ will be resolved by the `Hashicorp-Vault` provider, first install the PAM Provider extension from the [Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam) on the Universal Orchestrator.
+**NOTE**: only `inventory` and `discovery` of these resources is supported with this extension. To provision these certs use the
+[k8s-csr-signer](https://github.com/Keyfactor/k8s-csr-signer).
-Next, complete configuration of the PAM Provider on the UO by editing the `manifest.json` of the __PAM Provider__ (e.g. located at extensions/Hashicorp-Vault/manifest.json). The "initialization" parameters need to be entered here:
-~~~ json
- "Keyfactor:PAMProviders:Hashicorp-Vault:InitializationInfo": {
- "Host": "http://127.0.0.1:8200",
- "Path": "v1/secret/data",
- "Token": "xxxxxx"
- }
-~~~
-After these values are entered, the Orchestrator needs to be restarted to pick up the configuration. Now the PAM Provider can be used on other Orchestrator Extensions.
-### Use the PAM Provider
-With the PAM Provider configured as an extenion on the UO, a `json` object can be passed instead of an actual value to resolve the field with a PAM Provider. Consult the [Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam) for the specific format of the `json` object.
+#### Supported Operations
-To have the __Server Password__ field resolved by the `Hashicorp-Vault` provider, the corresponding `json` object from the `Hashicorp-Vault` extension needs to be copied and filed in with the correct information:
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | 🔲 Unchecked |
+| Remove | 🔲 Unchecked |
+| Discovery | ✅ Checked |
+| Reenrollment | 🔲 Unchecked |
+| Create | 🔲 Unchecked |
-~~~ json
-{"Secret":"my-kv-secret","Key":"myServerPassword"}
-~~~
+#### Store Type Creation
-This text would be entered in as the value for the __Server Password__, instead of entering in the actual password. The Orchestrator will attempt to use the PAM Provider to retrieve the __Server Password__. If PAM should not be used, just directly enter in the value for the field.
-
-
-
-
-
-
----
-
-
-## Table of Contents
-- [Keyfactor Version Supported](#keyfactor-version-supported)
-- [Platform Specific Notes](#platform-specific-notes)
-- [PAM Integration](#pam-integration)
-- [Overview](#overview)
- * [K8SCert](#k8scert)
- * [K8SSecret](#k8ssecret)
- * [K8STLSSecret](#k8stlssecret)
- * [K8SJKS](#k8sjks)
-- [Versioning](#versioning)
-- [Security Considerations](#security-considerations)
- * [Service Account Setup](#service-account-setup)
-- [Kubernetes Orchestrator Extension Installation](#kubernetes-orchestrator-extension-installation)
-- [Certificate Store Types](#certificate-store-types)
- * [Configuration Information](#configuration-information)
- + [Note about StorePath](#note-about-storepath)
- + [Common Values](#common-values)
- - [UI Basic Tab](#ui-basic-tab)
- - [UI Advanced Tab](#ui-advanced-tab)
- - [Custom Fields Tab](#custom-fields-tab)
- - [Kube Secret Types](#kube-secret-types)
- - [Entry Parameters Tab:](#entry-parameters-tab-)
- * [K8SSecret Store Type](#k8ssecret-store-type)
- + [kfutil Create K8SSecret Store Type](#kfutil-create-k8ssecret-store-type)
- + [UI Configuration](#ui-configuration)
- - [UI Basic Tab](#ui-basic-tab-1)
- - [UI Advanced Tab](#ui-advanced-tab-1)
- - [UI Custom Fields Tab](#ui-custom-fields-tab)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab-)
- * [K8STLSSecr Store Type](#k8stlssecr-store-type)
- + [kfutil Create K8STLSSecr Store Type](#kfutil-create-k8stlssecr-store-type)
- + [UI Configuration](#ui-configuration-1)
- - [UI Basic Tab](#ui-basic-tab-2)
- - [UI Advanced Tab](#ui-advanced-tab-2)
- - [UI Custom Fields Tab](#ui-custom-fields-tab-1)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab--1)
- * [K8SPKCS12 Store Type](#k8spkcs12-store-type)
- + [kfutil Create K8SPKCS12 Store Type](#kfutil-create-k8spkcs12-store-type)
- + [UI Configuration](#ui-configuration-2)
- - [UI Basic Tab](#ui-basic-tab-3)
- - [UI Advanced Tab](#ui-advanced-tab-3)
- - [UI Custom Fields Tab](#ui-custom-fields-tab-2)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab--2)
- * [K8SJKS Store Type](#k8sjks-store-type)
- + [Storepath Patterns](#storepath-patterns)
- + [Alias Patterns](#alias-patterns)
- + [kfutil Create K8SJKS Store Type](#kfutil-create-k8sjks-store-type)
- + [UI Configuration](#ui-configuration-3)
- - [UI Basic Tab](#ui-basic-tab-4)
- - [UI Advanced Tab](#ui-advanced-tab-4)
- - [UI Custom Fields Tab](#ui-custom-fields-tab-3)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab--3)
- * [K8SCluster Store Type](#k8scluster-store-type)
- + [Storepath Patterns](#storepath-patterns-1)
- + [Alias Patterns](#alias-patterns-1)
- + [kfutil Create K8SCluster Store Type](#kfutil-create-k8scluster-store-type)
- + [UI Configuration](#ui-configuration-4)
- - [UI Basic Tab](#ui-basic-tab-5)
- - [UI Advanced Tab](#ui-advanced-tab-5)
- - [UI Custom Fields Tab](#ui-custom-fields-tab-4)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab--4)
- * [K8SNS Store Type](#k8sns-store-type)
- + [Storepath Patterns](#storepath-patterns-2)
- + [Alias Patterns](#alias-patterns-2)
- + [kfutil Create K8SNS Store Type](#kfutil-create-k8sns-store-type)
- + [UI Configuration](#ui-configuration-5)
- - [UI Basic Tab](#ui-basic-tab-6)
- - [UI Advanced Tab](#ui-advanced-tab-6)
- - [UI Custom Fields Tab](#ui-custom-fields-tab-5)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab--5)
- * [K8SCert Store Type](#k8scert-store-type)
- + [UI Configuration](#ui-configuration-6)
- - [UI Basic Tab](#ui-basic-tab-7)
- - [UI Advanced Tab](#ui-advanced-tab-7)
- - [UI Custom Fields Tab](#ui-custom-fields-tab-6)
- - [UI Entry Parameters Tab:](#ui-entry-parameters-tab--6)
-- [Creating Certificate Stores and Scheduling Discovery Jobs](#creating-certificate-stores-and-scheduling-discovery-jobs)
-- [Certificate Discovery](#certificate-discovery)
- * [K8SNS Discovery](#k8sns-discovery)
- * [K8SPKCS12 and K8SJKS Discovery](#k8spkcs12-and-k8sjks-discovery)
-- [Certificate Inventory](#certificate-inventory)
-- [Certificate Management](#certificate-management)
- * [K8STLSSecr & K8SSecret](#k8stlssecr---k8ssecret)
- + [Opaque & tls secret w/o ca.crt](#opaque---tls-secret-w-o-cacrt)
- + [Opaque & tls secret w/ ca.crt](#opaque---tls-secret-w--cacrt)
- + [Opaque & tls secret w/o private key](#opaque---tls-secret-w-o-private-key)
- * [K8SJKS & K8SPKCS12](#k8sjks---k8spkcs12)
-- [Development](#development)
-- [License](#license)
-
-
-## Keyfactor Version Supported
-
-The minimum version of the Keyfactor Universal Orchestrator Framework needed to run this version of the extension is 10.1
-
-| Keyfactor Version | Universal Orchestrator Framework Version | Supported |
-|-------------------|------------------------------------------|--------------|
-| 10.2.1 | 10.1, 10.2 | ✓ |
-| 10.1.1 | 10.1, 10.2 | ✓ |
-| 10.0.0 | 10.1, 10.2 | ✓ |
-| 9.10.1 | Not supported on KF 9.X.X | x |
-| 9.5.0 | Not supported on KF 9.X.X | x |
-
-## Platform Specific Notes
-
-The Keyfactor Universal Orchestrator may be installed on either Windows or Linux based platforms.
-The certificate operations supported by a capability may vary based what platform the capability is installed on.
-See the store type specific sections below for more details on specific cababilities based on Kubernetes resource type.
-
-## PAM Integration
-
-This orchestrator extension has the ability to connect to a variety of supported PAM providers to
-allow for the retrieval of various client hosted secrets right from the orchestrator server itself.
-This eliminates the need to set up the PAM integration on Keyfactor Command which may be in an
-environment that the client does not want to have access to their PAM provider.
-
-The secrets that this orchestrator extension supports for use with a PAM Provider are:
-
-| Name | Description |
-|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| ServerPassword | This is a raw JSON file that contains service account credentials to interact with the Kubernetes APIs. See the service account setup guide for permission details. |
-| ServerUsername | This is a static value that must be set to `kubeconfig`. |
-
-
-It is not necessary to implement all of the secrets available to be managed by a PAM provider.
-For each value that you want managed by a PAM provider, simply enter the key value inside your
-specific PAM provider that will hold this value into the corresponding field when setting up
-the certificate store, discovery job, or API call.
-
-Setting up a PAM provider for use involves adding an additional section to the manifest.json
-file for this extension as well as setting up the PAM provider you will be using. Each of
-these steps is specific to the PAM provider you will use and are documented in the specific
-GitHub repo for that provider. For a list of Keyfactor supported PAM providers, please
-reference the [Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam).
-
----
-
-
-## Overview
-The Kubernetes Orchestrator Extension is an integration that can remotely manage certificate
-resources in a Kubernetes cluster. The certificate store types that can be managed in the
-current version are:
-- K8SCert - Kubernetes certificates of type `certificates.k8s.io/v1`
-- K8SSecret - Kubernetes secrets of type `Opaque`
-- K8STLSSecret - Kubernetes secrets of type `kubernetes.io/tls`
-- K8SCluster - This allows for a single store to manage a k8s cluster's secrets or type `Opaque` and `kubernetes.io/tls`.
-This can be thought of as a container of `K8SSecret` and `K8STLSSecret` stores across all k8s namespaces.
-- K8SNS - This allows for a single store to manage a k8s namespace's secrets or type `Opaque` and `kubernetes.io/tls`.
-This can be thought of as a container of `K8SSecret` and `K8STLSSecret` stores for a single k8s namespace.
-- K8SJKS - Kubernetes secrets of type `Opaque` that contain one or more Java Keystore(s). These cannot be managed at the
-cluster or namespace level as they should all require unique credentials.
-- K8SPKCS12 - Kubernetes secrets of type `Opaque` that contain one or more PKCS12(s). These cannot be managed at the
-cluster or namespace level as they should all require unique credentials.
-
-This orchestrator extension makes use of the Kubernetes API by using a service account
-to communicate remotely with certificate stores. The service account must have the correct permissions
-in order to perform the desired operations. For more information on the required permissions, see the
-[service account setup guide](#service-account-setup).
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8SCert kfutil details
-### K8SCert
-The K8SCert store type is used to manage Kubernetes certificates of type `certificates.k8s.io/v1`.
-To provision these certs use the [k8s-csr-signer](https://github.com/Keyfactor/k8s-csr-signer)
-documentation for more information.
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8SCert
+ kfutil store-types create K8SCert
+ ```
-### K8SSecret
-The K8SSecret store type is used to manage Kubernetes secrets of type `Opaque`. These secrets can have any
-arbitrary fields, but except for the `tls.crt` and `tls.key` fields, these are reserved for the `kubernetes.io/tls`
-secret type.
-**NOTE**: The orchestrator will only manage the fields named `certificates` and `private_keys` in the
-secret. Any other fields will be ignored.
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8SCert store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8SCert details
+
+ Create a store type called `K8SCert` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8SCert | Display name for the store type (may be customized) |
+ | Short Name | K8SCert | Short display name for the store type |
+ | Capability | K8SCert | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | 🔲 Unchecked | Indicates that the Store Type supports Management Add |
+ | Supports Remove | 🔲 Unchecked | Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | ✅ Checked | Check the box. Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | 🔲 Unchecked | Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | 🔲 Unchecked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Forbidden | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Forbidden | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | KubeNamespace | KubeNamespace | The K8S namespace to use to manage the K8S secret object. | String | default | 🔲 Unchecked |
+ | KubeSecretName | KubeSecretName | The name of the K8S secret object. | String | | 🔲 Unchecked |
+ | KubeSecretType | KubeSecretType | This defaults to and must be `csr` | String | cert | ✅ Checked |
+
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
+
+### K8SCluster
+
+Click to expand details
+
+
+The `K8SCluster` store type allows for a single store to manage a k8s cluster's secrets or type `Opaque` and `kubernetes.io/tls`.
+
+
+
+
+#### Supported Operations
+
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | ✅ Checked |
+| Remove | ✅ Checked |
+| Discovery | 🔲 Unchecked |
+| Reenrollment | 🔲 Unchecked |
+| Create | ✅ Checked |
+
+#### Store Type Creation
+
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8SCluster kfutil details
+
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8SCluster
+ kfutil store-types create K8SCluster
+ ```
+
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8SCluster store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8SCluster details
+
+ Create a store type called `K8SCluster` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8SCluster | Display name for the store type (may be customized) |
+ | Short Name | K8SCluster | Short display name for the store type |
+ | Capability | K8SCluster | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | ✅ Checked | Check the box. Indicates that the Store Type supports Management Add |
+ | Supports Remove | ✅ Checked | Check the box. Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | 🔲 Unchecked | Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | ✅ Checked | Check the box. Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | 🔲 Unchecked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Required | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Optional | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | SeparateChain | Separate Certificate Chain | Whether to store the certificate chain separately from the certificate. | Bool | false | 🔲 Unchecked |
+ | IncludeCertChain | Include Certificate Chain | Whether to include the certificate chain in the certificate. | Bool | true | 🔲 Unchecked |
-### K8STLSSecret
-The K8STLSSecret store type is used to manage Kubernetes secrets of type `kubernetes.io/tls`. These secrets
-must have the `tls.crt` and `tls.key` fields and may only contain a single key and single certificate.
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
### K8SJKS
-The K8SJKS store type is used to manage Kubernetes secrets of type `Opaque`. These secrets
+
+Click to expand details
+
+
+The `K8SJKS` store type is used to manage Kubernetes secrets of type `Opaque`. These secrets
must have a field that ends in `.jks`. The orchestrator will inventory and manage using a *custom alias* of the following
pattern: `/`. For example, if the secret has a field named `mykeystore.jks` and
the keystore contains a certificate with an alias of `mycert`, the orchestrator will manage the certificate using the
-alias `mykeystore.jks/mycert`.
+alias `mykeystore.jks/mycert`. *NOTE* *This store type cannot be managed at the `cluster` or `namespace` level as they
+should all require unique credentials.*
+
+
+
+
+#### Supported Operations
+
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | ✅ Checked |
+| Remove | ✅ Checked |
+| Discovery | ✅ Checked |
+| Reenrollment | 🔲 Unchecked |
+| Create | ✅ Checked |
+
+#### Store Type Creation
+
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8SJKS kfutil details
+
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8SJKS
+ kfutil store-types create K8SJKS
+ ```
+
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8SJKS store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8SJKS details
+
+ Create a store type called `K8SJKS` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8SJKS | Display name for the store type (may be customized) |
+ | Short Name | K8SJKS | Short display name for the store type |
+ | Capability | K8SJKS | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | ✅ Checked | Check the box. Indicates that the Store Type supports Management Add |
+ | Supports Remove | ✅ Checked | Check the box. Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | ✅ Checked | Check the box. Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | ✅ Checked | Check the box. Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | ✅ Checked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Required | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Optional | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | KubeNamespace | KubeNamespace | The K8S namespace to use to manage the K8S secret object. | String | default | 🔲 Unchecked |
+ | KubeSecretName | KubeSecretName | The name of the K8S secret object. | String | | 🔲 Unchecked |
+ | KubeSecretType | KubeSecretType | This defaults to and must be `jks` | String | jks | ✅ Checked |
+ | CertificateDataFieldName | CertificateDataFieldName | | String | .jks | ✅ Checked |
+ | PasswordFieldName | PasswordFieldName | | String | password | 🔲 Unchecked |
+ | PasswordIsK8SSecret | Password Is K8S Secret | | Bool | false | 🔲 Unchecked |
+ | StorePasswordPath | StorePasswordPath | | String | | 🔲 Unchecked |
+
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
+
+### K8SNS
+
+Click to expand details
+
+
+The `K8SNS` store type is used to manage Kubernetes secrets of type `kubernetes.io/tls` and/or type `Opaque` in a single
+Keyfactor Command certificate store using an alias pattern of
+
+
+
+
+#### Supported Operations
+
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | ✅ Checked |
+| Remove | ✅ Checked |
+| Discovery | ✅ Checked |
+| Reenrollment | 🔲 Unchecked |
+| Create | ✅ Checked |
+
+#### Store Type Creation
+
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8SNS kfutil details
+
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8SNS
+ kfutil store-types create K8SNS
+ ```
+
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8SNS store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8SNS details
+
+ Create a store type called `K8SNS` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8SNS | Display name for the store type (may be customized) |
+ | Short Name | K8SNS | Short display name for the store type |
+ | Capability | K8SNS | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | ✅ Checked | Check the box. Indicates that the Store Type supports Management Add |
+ | Supports Remove | ✅ Checked | Check the box. Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | ✅ Checked | Check the box. Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | ✅ Checked | Check the box. Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | 🔲 Unchecked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Required | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Optional | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | KubeNamespace | Kube Namespace | | String | default | 🔲 Unchecked |
+ | SeparateChain | Separate Certificate Chain | Whether to store the certificate chain separately from the certificate. | Bool | false | 🔲 Unchecked |
+ | IncludeCertChain | Include Certificate Chain | Whether to include the certificate chain in the certificate. | Bool | true | 🔲 Unchecked |
+
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
### K8SPKCS12
-The K8SPKCS12 store type is used to manage Kubernetes secrets of type `Opaque`. These secrets
-must have a field that ends in `.p12`, `.pkcs12`, `.pfx`. The orchestrator will inventory and manage using a
-*custom alias* of the following pattern: `/`. For example, if the secret has a
-field named `mykeystore.p12` and the keystore contains a certificate with an alias of `mycert`, the orchestrator will
-manage the certificate using the alias `mykeystore.p12/mycert`.
-
-## Versioning
-
-The version number of a the Kubernetes Orchestrator Extension can be verified by right clicking on the
-`Kyefactor.Orchestrators.K8S.dll` file in the `///Extensions/Kubernetes` installation folder,
-selecting Properties, and then clicking on the Details tab.
-
-## Security Considerations
-For the Kubernetes Orchestrator Extension to be able to communicate with a Kubernetes cluster, it must
-be able to authenticate with the cluster. This is done by providing the extension with a service account
-token that has the appropriate permissions to perform the desired operations. The service account token
-can be provided to the extension in one of two ways:
-- As a raw JSON file that contains the service account credentials
-- As a base64 encoded string that contains the service account credentials
-### Service Account Setup
-To set up a service account user on your Kubernetes cluster to be used by the Kubernetes Orchestrator Extension, use the following example as a guide:
-```yaml
-apiVersion: v1
-kind: ServiceAccount
-metadata:
- name: keyfactor
- namespace: keyfactor
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRole
-metadata:
- name: keyfactor
-rules:
-- apiGroups: ["certificates.k8s.io"]
- resources: ["certificatesigningrequests"]
- verbs: ["create", "get", "list", "watch", "update", "patch", "delete"]
-- apiGroups: [""]
- resources: ["secrets"]
- verbs: ["create", "get", "list", "watch", "update", "patch", "delete"]
-- apiGroups: [""]
- resources: ["namespaces"]
- verbs: ["get", "list", "watch"]
----
-apiVersion: rbac.authorization.k8s.io/v1
-kind: ClusterRoleBinding
-metadata:
- name: keyfactor
-roleRef:
- apiGroup: rbac.authorization.k8s.io
- kind: ClusterRole
- name: keyfactor
-subjects:
-- kind: ServiceAccount
- name: keyfactor
- namespace: keyfactor
-```
-
-## Kubernetes Orchestrator Extension Installation
-1. Create the certificate store types you wish to manage. Please refer to the individual sections
- devoted to each supported store type under "Certificate Store Types" later in this README.
-2. Stop the Keyfactor Universal Orchestrator Service for the orchestrator you plan to install this
- extension to run on.
-3. In the Keyfactor Orchestrator installation folder (by convention usually
- C:\Program Files\Keyfactor\Keyfactor Orchestrator), find the "Extensions" folder. Underneath that,
- create a new folder named "Kubernetes". You may choose to use a different name if you wish.
-4. Download the latest version of the Kubernetes orchestrator extension from
- [GitHub](https://github.com/Keyfactor/kubernetes-orchestrator). Click on the "Latest" release
- link on the right hand side of the main page and download the first zip file.
-5. Copy the contents of the download installation zip file to the folder created in Step 3.
-6. (Optional) If you decide to create one or more certificate store types with short names different
- than the suggested values (please see the individual certificate store type sections in "Certificate
- Store Types" later in this README for more information regarding certificate store types), edit the
- manifest.json file in the folder you created in step 3, and modify each "ShortName" in each
- "Certstores.{ShortName}.{Operation}" line with the ShortName you used to create the respective
- certificate store type. If you created it with the suggested values, this step can be skipped.
-7. Modify the config.json file (See the "Configuration File Setup" section later in this README)
-8. Start the Keyfactor Universal Orchestrator Service.
-9. Create the certificate store types you wish to manage. Please refer to the individual sections
- devoted to each supported store type under [Certificate Store Types](#certificate-store-types) later in this README.
-10. (Optional) Run certificate discovery jobs to populate the certificate stores with existing
- certificates. See the [Certificate Store Discovery](#certificate-store-discovery) section later in this README for more
- information.
+Click to expand details
+
+
+The `K8SPKCS12` store type is used to manage Kubernetes secrets of type `Opaque`. These secrets
+must have a field that ends in `.pkcs12`. The orchestrator will inventory and manage using a *custom alias* of the following
+pattern: `/`. For example, if the secret has a field named `mykeystore.pkcs12` and
+the keystore contains a certificate with an alias of `mycert`, the orchestrator will manage the certificate using the
+alias `mykeystore.pkcs12/mycert`. *NOTE* *This store type cannot be managed at the `cluster` or `namespace` level as they
+should all require unique credentials.*
+
+
+
+
+#### Supported Operations
+
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | ✅ Checked |
+| Remove | ✅ Checked |
+| Discovery | ✅ Checked |
+| Reenrollment | 🔲 Unchecked |
+| Create | ✅ Checked |
+
+#### Store Type Creation
+
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8SPKCS12 kfutil details
+
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8SPKCS12
+ kfutil store-types create K8SPKCS12
+ ```
+
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8SPKCS12 store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8SPKCS12 details
+
+ Create a store type called `K8SPKCS12` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8SPKCS12 | Display name for the store type (may be customized) |
+ | Short Name | K8SPKCS12 | Short display name for the store type |
+ | Capability | K8SPKCS12 | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | ✅ Checked | Check the box. Indicates that the Store Type supports Management Add |
+ | Supports Remove | ✅ Checked | Check the box. Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | ✅ Checked | Check the box. Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | ✅ Checked | Check the box. Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | ✅ Checked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Required | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Optional | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | KubeSecretType | Kube Secret Type | This defaults to and must be `pkcs12` | String | pkcs12 | ✅ Checked |
+ | CertificateDataFieldName | CertificateDataFieldName | | String | .p12 | ✅ Checked |
+ | PasswordFieldName | Password Field Name | | String | password | 🔲 Unchecked |
+ | PasswordIsK8SSecret | Password Is K8S Secret | | Bool | false | 🔲 Unchecked |
+ | KubeNamespace | Kube Namespace | | String | default | 🔲 Unchecked |
+ | KubeSecretName | Kube Secret Name | | String | | 🔲 Unchecked |
+ | StorePasswordPath | StorePasswordPath | | String | | 🔲 Unchecked |
+
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
+
+### K8SSecret
+
+Click to expand details
+
+
+The `K8SSecret` store type is used to manage Kubernetes secrets of type `Opaque`.
+
+
+
+
+#### Supported Operations
+
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | ✅ Checked |
+| Remove | ✅ Checked |
+| Discovery | ✅ Checked |
+| Reenrollment | 🔲 Unchecked |
+| Create | ✅ Checked |
+
+#### Store Type Creation
+
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8SSecret kfutil details
+
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8SSecret
+ kfutil store-types create K8SSecret
+ ```
+
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8SSecret store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8SSecret details
+
+ Create a store type called `K8SSecret` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8SSecret | Display name for the store type (may be customized) |
+ | Short Name | K8SSecret | Short display name for the store type |
+ | Capability | K8SSecret | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | ✅ Checked | Check the box. Indicates that the Store Type supports Management Add |
+ | Supports Remove | ✅ Checked | Check the box. Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | ✅ Checked | Check the box. Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | ✅ Checked | Check the box. Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | 🔲 Unchecked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Forbidden | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Optional | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | KubeNamespace | KubeNamespace | The K8S namespace to use to manage the K8S secret object. | String | | 🔲 Unchecked |
+ | KubeSecretName | KubeSecretName | The name of the K8S secret object. | String | | 🔲 Unchecked |
+ | KubeSecretType | KubeSecretType | This defaults to and must be `secret` | String | secret | ✅ Checked |
+ | SeparateChain | Separate Certificate Chain | Whether to store the certificate chain separately from the certificate. | Bool | false | 🔲 Unchecked |
+ | IncludeCertChain | Include Certificate Chain | Whether to include the certificate chain in the certificate. | Bool | true | 🔲 Unchecked |
+
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
+
+### K8STLSSecr
+
+Click to expand details
+
+
+The `K8STLSSecret` store type is used to manage Kubernetes secrets of type `kubernetes.io/tls`
+
+
+
+
+#### Supported Operations
+
+| Operation | Is Supported |
+|--------------|------------------------------------------------------------------------------------------------------------------------|
+| Add | ✅ Checked |
+| Remove | ✅ Checked |
+| Discovery | ✅ Checked |
+| Reenrollment | 🔲 Unchecked |
+| Create | ✅ Checked |
+
+#### Store Type Creation
+
+##### Using kfutil:
+`kfutil` is a custom CLI for the Keyfactor Command API and can be used to create certificate store types.
+For more information on [kfutil](https://github.com/Keyfactor/kfutil) check out the [docs](https://github.com/Keyfactor/kfutil?tab=readme-ov-file#quickstart)
+ Click to expand K8STLSSecr kfutil details
+
+ ##### Using online definition from GitHub:
+ This will reach out to GitHub and pull the latest store-type definition
+ ```shell
+ # K8STLSSecr
+ kfutil store-types create K8STLSSecr
+ ```
+
+ ##### Offline creation using integration-manifest file:
+ If required, it is possible to create store types from the [integration-manifest.json](./integration-manifest.json) included in this repo.
+ You would first download the [integration-manifest.json](./integration-manifest.json) and then run the following command
+ in your offline environment.
+ ```shell
+ kfutil store-types create --from-file integration-manifest.json
+ ```
+
+
+
+#### Manual Creation
+Below are instructions on how to create the K8STLSSecr store type manually in
+the Keyfactor Command Portal
+ Click to expand manual K8STLSSecr details
+
+ Create a store type called `K8STLSSecr` with the attributes in the tables below:
+
+ ##### Basic Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Name | K8STLSSecr | Display name for the store type (may be customized) |
+ | Short Name | K8STLSSecr | Short display name for the store type |
+ | Capability | K8STLSSecr | Store type name orchestrator will register with. Check the box to allow entry of value |
+ | Supports Add | ✅ Checked | Check the box. Indicates that the Store Type supports Management Add |
+ | Supports Remove | ✅ Checked | Check the box. Indicates that the Store Type supports Management Remove |
+ | Supports Discovery | ✅ Checked | Check the box. Indicates that the Store Type supports Discovery |
+ | Supports Reenrollment | 🔲 Unchecked | Indicates that the Store Type supports Reenrollment |
+ | Supports Create | ✅ Checked | Check the box. Indicates that the Store Type supports store creation |
+ | Needs Server | ✅ Checked | Determines if a target server name is required when creating store |
+ | Blueprint Allowed | 🔲 Unchecked | Determines if store type may be included in an Orchestrator blueprint |
+ | Uses PowerShell | 🔲 Unchecked | Determines if underlying implementation is PowerShell |
+ | Requires Store Password | 🔲 Unchecked | Enables users to optionally specify a store password when defining a Certificate Store. |
+ | Supports Entry Password | 🔲 Unchecked | Determines if an individual entry within a store can have a password. |
+
+ The Basic tab should look like this:
+
+ 
+
+ ##### Advanced Tab
+ | Attribute | Value | Description |
+ | --------- | ----- | ----- |
+ | Supports Custom Alias | Forbidden | Determines if an individual entry within a store can have a custom Alias. |
+ | Private Key Handling | Optional | This determines if Keyfactor can send the private key associated with a certificate to the store. Required because IIS certificates without private keys would be invalid. |
+ | PFX Password Style | Default | 'Default' - PFX password is randomly generated, 'Custom' - PFX password may be specified when the enrollment job is created (Requires the Allow Custom Password application setting to be enabled.) |
+
+ The Advanced tab should look like this:
+
+ 
+
+ > For Keyfactor **Command versions 24.4 and later**, a Certificate Format dropdown is available with PFX and PEM options. Ensure that **PFX** is selected, as this determines the format of new and renewed certificates sent to the Orchestrator during a Management job. Currently, all Keyfactor-supported Orchestrator extensions support only PFX.
+
+ ##### Custom Fields Tab
+ Custom fields operate at the certificate store level and are used to control how the orchestrator connects to the remote target server containing the certificate store to be managed. The following custom fields should be added to the store type:
+
+ | Name | Display Name | Description | Type | Default Value/Options | Required |
+ | ---- | ------------ | ---- | --------------------- | -------- | ----------- |
+ | ServerUsername | Server Username | This should be no value or `kubeconfig` | Secret | None | 🔲 Unchecked |
+ | ServerPassword | Server Password | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json | Secret | None | ✅ Checked |
+ | KubeNamespace | KubeNamespace | The K8S namespace to use to manage the K8S secret object. | String | | 🔲 Unchecked |
+ | KubeSecretName | KubeSecretName | The name of the K8S secret object. | String | | 🔲 Unchecked |
+ | KubeSecretType | KubeSecretType | This defaults to and must be `tls_secret` | String | tls_secret | ✅ Checked |
+ | SeparateChain | Separate Certificate Chain | Whether to store the certificate chain separately from the certificate. | Bool | false | 🔲 Unchecked |
+ | IncludeCertChain | Include Certificate Chain | Whether to include the certificate chain in the certificate. | Bool | true | 🔲 Unchecked |
+
+ The Custom Fields tab should look like this:
+
+ 
+
+
+
+
+
+## Installation
+
+1. **Download the latest Kubernetes Universal Orchestrator extension from GitHub.**
+
+ Navigate to the [Kubernetes Universal Orchestrator extension GitHub version page](https://github.com/Keyfactor/k8s-orchestrator/releases/latest). Refer to the compatibility matrix below to determine whether the `net6.0` or `net8.0` asset should be downloaded. Then, click the corresponding asset to download the zip archive.
+
+ | Universal Orchestrator Version | Latest .NET version installed on the Universal Orchestrator server | `rollForward` condition in `Orchestrator.runtimeconfig.json` | `k8s-orchestrator` .NET version to download |
+ | --------- | ----------- | ----------- | ----------- |
+ | Older than `11.0.0` | | | `net6.0` |
+ | Between `11.0.0` and `11.5.1` (inclusive) | `net6.0` | | `net6.0` |
+ | Between `11.0.0` and `11.5.1` (inclusive) | `net8.0` | `Disable` | `net6.0` |
+ | Between `11.0.0` and `11.5.1` (inclusive) | `net8.0` | `LatestMajor` | `net8.0` |
+ | `11.6` _and_ newer | `net8.0` | | `net8.0` |
+
+ Unzip the archive containing extension assemblies to a known location.
+
+ > **Note** If you don't see an asset with a corresponding .NET version, you should always assume that it was compiled for `net6.0`.
+
+2. **Locate the Universal Orchestrator extensions directory.**
+
+ * **Default on Windows** - `C:\Program Files\Keyfactor\Keyfactor Orchestrator\extensions`
+ * **Default on Linux** - `/opt/keyfactor/orchestrator/extensions`
+
+3. **Create a new directory for the Kubernetes Universal Orchestrator extension inside the extensions directory.**
+
+ Create a new directory called `k8s-orchestrator`.
+ > The directory name does not need to match any names used elsewhere; it just has to be unique within the extensions directory.
+
+4. **Copy the contents of the downloaded and unzipped assemblies from __step 2__ to the `k8s-orchestrator` directory.**
+
+5. **Restart the Universal Orchestrator service.**
+
+ Refer to [Starting/Restarting the Universal Orchestrator service](https://software.keyfactor.com/Core-OnPrem/Current/Content/InstallingAgents/NetCoreOrchestrator/StarttheService.htm).
+
+
+6. **(optional) PAM Integration**
+
+ The Kubernetes Universal Orchestrator extension is compatible with all supported Keyfactor PAM extensions to resolve PAM-eligible secrets. PAM extensions running on Universal Orchestrators enable secure retrieval of secrets from a connected PAM provider.
+
+ To configure a PAM provider, [reference the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam) to select an extension and follow the associated instructions to install it on the Universal Orchestrator (remote).
+
+
+> The above installation steps can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/InstallingAgents/NetCoreOrchestrator/CustomExtensions.htm?Highlight=extensions).
+
+
+
+## Defining Certificate Stores
+
+The Kubernetes Universal Orchestrator extension implements 7 Certificate Store Types, each of which implements different functionality. Refer to the individual instructions below for each Certificate Store Type that you deemed necessary for your use case from the installation section.
+
+K8SCert (K8SCert)
+
+
+### Store Creation
+
+#### Manually with the Command UI
+
+Click to expand details
+
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
+
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
+
+2. **Add a Certificate Store.**
+
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
+
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8SCert" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SCert` certificates. Specifically, one with the `K8SCert` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | KubeSecretName | The name of the K8S secret object. |
+ | KubeSecretType | This defaults to and must be `csr` |
+
+
-## Certificate Store Types
-When setting up the certificate store types you wish the Kubernetes Orchestrator Extension to
-manage, there are some common settings that will be the same for all supported types.
-To create a new Certificate Store Type in Keyfactor Command, first click on settings
-`(the gear icon on the top right) => Certificate Store Types => Add`. Alternatively,
-there are cURL scripts for all of the currently implemented certificate store types
-in the Certificate Store Type cURL Scripts folder in this repo if you wish to automate
-the creation of the desired store types.
-
-### Configuration Information
-Below is a table of the common values that should be used for all certificate store types.
-
-#### Note about StorePath
-A Keyfactor Command certificate store `StorePath` for the K8S orchestrator extension can follow the following formats:
-
-| Pattern | Description |
-|-----------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|
-| `secretName` | The name of the secret to use. This assumes `KubeNamespace` is defined or `default` and will be the `secret` or `cert` name on k8s. |
-| `namespace/secretName` | If `KubeNamespace` or `KubeSecretName` are not set, then the path will be split by `/` and the values will be parsed according to the pattern. |
-| `clusterName/namespace/secretName` | Same as above, clusterName is purely informational |
-| `clusterName/namespace/secretType/secretName` | Considered a `full` path, this is what discovery will return as `StorePath` |
-
-#### Common Values
-##### UI Basic Tab
-| Field Name | Required | Description | Value |
-|-------------------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|
-| Name | ✓ | The display name you wish to use for the new Certificate Store Type. | Depends on store type. |
-| ShortName | ✓ | The short name you wish to use for the new Certificate Store Type. | Depends on store type. |
-| Custom Capability | ✓ | Whether or not the certificate store type supports custom capabilities. | Checked [x] |
-| Supported Job Types | ✓ | The job types supported by the certificate store type. | Depends on store type. |
-| Needs Server | ✓ | Must be set to true or checked. NOTE: If using this `ServerUsername` must be equal to `kubeconfig` and `ServerPassword` will be the kubeconfig file in JSON format | Checked [x] |
-| Blueprint Allowed | | Checked if you wish to make use of blueprinting. Please refer to the Keyfactor Command Reference Guide for more details on this feature. | Unchecked [ ] |
-| Uses PowerShell | | Whether or not the certificate store type uses PowerShell. | Unchecked [ ] |
-| Requires Store Password | | Whether or not the certificate store type requires a password. | Unchecked [ ] |
-| Supports Entry Password | | Whether or not the certificate store type supports entry passwords. | Unchecked [ ] |
-
-##### UI Advanced Tab
-| Field Name | Required | Description | Value |
-|-----------------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------|------------------------|
-| Store Path Type | | The type of path the certificate store type uses. | Freeform |
-| Supports Custom Alias | | Whether or not the certificate store type supports custom aliases. | Depends on store type. |
-| Private Key Handling | | Whether or not the certificate store type supports private key handling. | Depends on store type. |
-| PFX Password Style | | The password style used by the certificate store type. | Default |
-
-##### Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|------------------|---------------------------|--------|----------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | | This field overrides implied `Store Path` value. The Kubernetes namespace the store will reside. This will override the value parsed from `storepath`. |
-| KubeSecretName | Kube Secret Name | String | | | This field overrides implied `Store Path` value. The Kubernetes secret or certificate resource name. |
-| KubeSecretType | Kube Secret Type | String | ✓ | | Must be one of the following `secret`, `secret_tls` or `cert`. See [kube-secret-types](#kube-secret-types). |
-| IncludeCertChain | Include Certificate Chain | Bool | | `true` | Will default to `true` if not set. Set this to `false` if you do not want certificate chains deployed. |
-| SeparateChain | SeparateChain | Bool | | `false` | Will default to `false` if not set. Set this to `true` if you want to deploy certificate chain to the `ca.crt` field for `Opaque` and `tls` secrets. |
-
-##### Kube Secret Types
-- `secret` - A generic secret of type `Opaque`. Must contain a key of one of the following values: [ `cert`, `certficate`, `certs`,`certificates` ] to be inventoried.
-- `tls_secret` - A secret of type `kubernetes.io/tls`. Must contain the following keys: [ `tls.crt`, `tls.key` ] to be inventoried.
-- `cert` - A certificate `certificates.k8s.io/v1` resource. Must contain the following keys: [ `csr`, `cert` ] to be inventoried.
-
-##### Entry Parameters Tab:
-- See specific certificate store type instructions below
-
-### K8SSecret Store Type
-
-#### kfutil Create K8SSecret Store Type
-
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
-kfuti
-```bash
-kfutil login
-kfutil store-types create --name K8SSecret
-```
-
-#### UI Configuration
-
-##### UI Basic Tab
-| Field Name | Required | Value |
-|-------------------------|----------|-------------------------------------------|
-| Name | ✓ | `K8SSecret` |
-| ShortName | ✓ | `K8SSecret` |
-| Custom Capability | ✓ | Checked [x] + `K8SSecret` |
-| Supported Job Types | ✓ | Inventory, Add, Remove, Create, Discovery |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
-
-**NOTE:** If using PAM, `server_username` must be equal to `kubeconfig` and `server_password` will be the kubeconfig file in JSON format.
-
-
-
-##### UI Advanced Tab
-| Field Name | Value |
-|-----------------------|-----------|
-| Store Path Type | Freeform |
-| Supports Custom Alias | Forbidden |
-| Private Key Handling | Optional |
-| PFX Password Style | Default |
-
-
-
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|------------------|---------------------------|--------|----------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | `default` | The K8S namespace the `Opaque` secret lives. This will override any value inferred in the `Store Path` |
-| KubeSecretName | Kube Secret Name | String | ✓ | | The name of the K8S `Opaque` secret. This will override any value inferred in the `Store Path` |
-| KubeSecretType | Kube Secret Type | String | ✓ | `secret` | |
-| IncludeCertChain | Include Certificate Chain | Bool | | `true` | Will default to `true` if not set. If set to `false` only leaf cert will be deployed. |
-| SeparateChain | SeparateChain | Bool | | `false` | Will default to `false` if not set. `true` will deploy leaf cert to `tls.crt` and the rest of the cert chain to `ca.crt`. If set to `false` the full chain is deployed to `tls.crt` |
-
-
-
-##### UI Entry Parameters Tab:
-Empty
-
-### K8STLSSecr Store Type
-
-#### kfutil Create K8STLSSecr Store Type
-
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
-
-```bash
-kfutil login
-kfutil store-types create --name K8STLSSecr
-```
-
-#### UI Configuration
-
-##### UI Basic Tab
-| Field Name | Required | Value |
-|-------------------------|----------|-------------------------------------------|
-| Name | ✓ | `K8STLSSecr` |
-| ShortName | ✓ | `K8STLSSecr` |
-| Custom Capability | ✓ | Checked [x] + `K8STLSSecr` |
-| Supported Job Types | ✓ | Inventory, Add, Remove, Create, Discovery |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
-
-
-
-##### UI Advanced Tab
-| Field Name | Required | Value |
-|-----------------------|----------|-----------|
-| Store Path Type | | Freeform |
-| Supports Custom Alias | | Forbidden |
-| Private Key Handling | | Optional |
-| PFX Password Style | | Default |
-
-
-
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|------------------|----------------------------|--------|----------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | | The K8S namespace the `tls` secret lives. This will override any value inferred in the `Store Path` |
-| KubeSecretName | Kube Secret Name | String | | | The name of the K8S `tls` secret. This will override any value inferred in the `Store Path` |
-| KubeSecretType | Kube Secret Type | String | ✓ | `tls_secret` | |
-| IncludeCertChain | Include Certificate Chain | Bool | | `true` | If set to `false` only leaf cert will be deployed. |
-| SeparateChain | SeparateChain | Bool | | `true` | `true` will deploy leaf cert to `tls.crt` and the rest of the cert chain to `ca.crt`. If set to `false` the full chain is deployed to `tls.crt` |
-
-
-
-
-##### UI Entry Parameters Tab:
-Empty
-
-### K8SPKCS12 Store Type
-
-#### kfutil Create K8SPKCS12 Store Type
-
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
-
-```bash
-kfutil login
-kfutil store-types create --name K8SPKCS12
-```
-
-#### UI Configuration
-
-##### UI Basic Tab
-| Field Name | Required | Value |
-|---------------------------|----------|-------------------------------------------|
-| Name | ✓ | `K8SPKCS12` |
-| ShortName | ✓ | `K8SPKCS12` |
-| Custom Capability | ✓ | Checked [x] + `K8SPKCS12` |
-| Supported Job Types | ✓ | Inventory, Add, Remove, Create, Discovery |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password** | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
-
-**NOTE:** `Requires Store Password` is required if pkcs12 password is not being sourced from a separate secret in the
-K8S cluster.
-
-
-
-##### UI Advanced Tab
-| Field Name | Value |
-|-----------------------|----------|
-| Store Path Type | Freeform |
-| Supports Custom Alias | Required |
-| Private Key Handling | Optional |
-| PFX Password Style | Default |
-
+#### Using kfutil CLI
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|--------------------------|-----------------------------|--------|----------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | | K8S namespace the PKCS12 secret lives. This will override any value inferred in the `Store Path` |
-| KubeSecretName | Kube Secret Name | String | | | The K8S secret name that contains PKCS12 data. This will override any value inferred in the `Store Path` |
-| KubeSecretType | Kube Secret Type | String | ✓ | `pkcs12` | This must be set to `pkcs12`. |
-| CertificateDataFieldName | Certificate Data Field Name | String | ✓ | `.p12` | The K8S secret field name to source the PKCS12 data from. You can provide an extension `.p12` or `.pfx` for a secret with a key `example.p12` |
-| PasswordFieldName | Password Field Name | String | | `password` | If sourcing the PKCS12 password from a K8S secret this is the field it will look for the password in. |
-| PasswordIsK8SSecret | Password Is K8S Secret | Bool | | `false` | If you want to use the PKCS12 secret or a separate secret specific in `KubeSecretPasswordPath` set this to `true` |
-| StorePasswordPath | Kube Secret Password Path | String | | | Source PKCS12 password from a separate K8S secret. Pattern: `namespace_name/secret_name` |
-
-
-
-
-##### UI Entry Parameters Tab:
-Empty
-
-### K8SJKS Store Type
-
-#### Storepath Patterns
-- `namespace_name/secret_name`
-- `namespace_name/secrets/secret_name`
-- `cluster_name/namespace_name/secrets/secret_name`
-
-#### Alias Patterns
-- `k8s_secret_field_name/keystore_alias`
-
-#### kfutil Create K8SJKS Store Type
-
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
-
-```bash
-kfutil login
-kfutil store-types create --name K8SJKS
-```
-
-#### UI Configuration
-
-##### UI Basic Tab
-| Field Name | Required | Value |
-|---------------------------|----------|-------------------------------------------|
-| Name | ✓ | `K8SJKS` |
-| ShortName | ✓ | `K8SJKS` |
-| Custom Capability | ✓ | Checked [x] + `K8SJKS` |
-| Supported Job Types | ✓ | Inventory, Add, Remove, Create, Discovery |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password** | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
+Click to expand details
-**NOTE:** `Requires Store Password` is required if pkcs12 password is not being sourced from a separate secret in the
-K8S cluster.
+1. **Generate a CSV template for the K8SCert certificate store**
-
+ ```shell
+ kfutil stores import generate-template --store-type-name K8SCert --outpath K8SCert.csv
+ ```
+2. **Populate the generated CSV file**
-##### UI Advanced Tab
-| Field Name | Value |
-|-----------------------|----------|
-| Store Path Type | Freeform |
-| Supports Custom Alias | Required |
-| Private Key Handling | Optional |
-| PFX Password Style | Default |
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
-
-
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|--------------------------|-----------------------------|--------|----------|---------------|--------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | | K8S namespace the JKS secret lives. This will override any value inferred in the `Store Path`. |
-| KubeSecretName | Kube Secret Name | String | | | The K8S secret name that contains JKS data. This will override any value inferred in the `Store Path`. |
-| KubeSecretType | Kube Secret Type | String | ✓ | `jks` | |
-| CertificateDataFieldName | Certificate Data Field Name | String | ✓ | `.jks` | The K8S secret field name to source the JKS data from |
-| PasswordFieldName | Password Field Name | String | ✓ | `password` | If sourcing the JKS password from a K8S secret this is the field it will look for the password in. |
-| PasswordIsK8SSecret | Password Is K8S Secret | Bool | | `false` | If you want to use the JKS secret or a separate secret specific in `` set this to `true` |
-| StorePasswordPath | Kube Secret Password Path | String | | | Source JKS password from a separate K8S secret. Pattern: `namespace_name/secret_name` |
-
-
-
-
-##### UI Entry Parameters Tab:
-Empty
-
-### K8SCluster Store Type
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8SCert" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SCert` certificates. Specifically, one with the `K8SCert` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | Properties.KubeSecretName | The name of the K8S secret object. |
+ | Properties.KubeSecretType | This defaults to and must be `csr` |
-#### Storepath Patterns
-- `cluster_name`
+3. **Import the CSV file to create the certificate stores**
-#### Alias Patterns
-- `namespace_name/secrets/secret_type/secret_name`
-
-#### kfutil Create K8SCluster Store Type
-
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
+ ```shell
+ kfutil stores import csv --store-type-name K8SCert --file K8SCert.csv
+ ```
-```bash
-kfutil login
-kfutil store-types create --name K8SCluster
-```
+
-#### UI Configuration
-##### UI Basic Tab
-| Field Name | Required | Value |
-|-------------------------|----------|---------------------------------|
-| Name | ✓ | `K8SCluster` |
-| ShortName | ✓ | `K8SCluster` |
-| Custom Capability | ✓ | Checked [x] + `K8SCluster` |
-| Supported Job Types | ✓ | Inventory, Add, Remove, Create |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
-
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
-##### UI Advanced Tab
-| Field Name | Value |
-|-----------------------|----------|
-| Store Path Type | Freeform |
-| Supports Custom Alias | Required |
-| Private Key Handling | Optional |
-| PFX Password Style | Default |
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
-
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|------------------|---------------------------|--------|----------|----------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
-| IncludeCertChain | Include Certificate Chain | Bool | | `true` | Will default to `true` if not set. If set to `false` only leaf cert will be deployed. |
-| SeparateChain | Separate Chain | Bool | | `false` | Will default to `false` if not set. Set this to `true` if you want to deploy certificate chain to the `ca.crt` field for `Opaque` and `tls` secrets. |
-
-
-
-##### UI Entry Parameters Tab:
-Empty
-
-### K8SNS Store Type
-
-**NOTE**: This store type will only inventory K8S secrets that contain the keys `tls.crt` and `tls.key`.
-
-#### Storepath Patterns
-- `namespace_name`
-- `cluster_name/namespace_name`
-
-#### Alias Patterns
-- `secrets/secret_type/secret_name`
-#### kfutil Create K8SNS Store Type
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
-```bash
-kfutil login
-kfutil store-types create --name K8SNS
-```
+
-#### UI Configuration
+K8SCluster (K8SCluster)
-##### UI Basic Tab
-| Field Name | Required | Value |
-|-------------------------|----------|--------------------------------|
-| Name | ✓ | `K8SNS` |
-| ShortName | ✓ | `K8SNS` |
-| Custom Capability | ✓ | Checked [x] + `K8SNS` |
-| Supported Job Types | ✓ | Inventory, Add, Remove, Create |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
+In order for certificates of type `Opaque` and/or `kubernetes.io/tls` to be inventoried in `K8SCluster` store types, they must
+have specific keys in the Kubernetes secret.
+- Required keys: `tls.crt` or `ca.crt`
+- Additional keys: `tls.key`
-
+### Storepath Patterns
+- ``
-##### UI Advanced Tab
-| Field Name | Value |
-|-----------------------|----------|
-| Store Path Type | Freeform |
-| Supports Custom Alias | Required |
-| Private Key Handling | Optional |
-| PFX Password Style | Default |
+### Alias Patterns
+- `/secrets//`
-
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|------------------|---------------------------|--------|----------|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | | K8S namespace to manage. This will override any value inferred in the `Store Path`. |
-| IncludeCertChain | Include Certificate Chain | Bool | | `true` | Will default to `true` if not set. If set to `false` only leaf cert will be deployed. |
-| SeparateChain | Separate Chain | Bool | | `false` | Will default to `false` if not set. Set this to `true` if you want to deploy certificate chain to the `ca.crt` field for `Opaque` and `tls` secrets. |
+### Store Creation
-
-
-##### UI Entry Parameters Tab:
-Empty
-
-### K8SCert Store Type
+#### Manually with the Command UI
-The following commands can be used with [kfutil](https://github.com/Keyfactor/kfutil). Please refer to the kfutil documentation for more information on how to use the tool to interact w/ Keyfactor Command.
-
-```bash
-kfutil login
-kfutil store-types create --name K8SCert
-```
-
-#### UI Configuration
+Click to expand details
-##### UI Basic Tab
-| Field Name | Required | Value |
-|-------------------------|----------|--------------------------|
-| Name | ✓ | `K8SCert` |
-| ShortName | ✓ | `K8SCert` |
-| Custom Capability | ✓ | Checked [x] + `K8SCert` |
-| Supported Job Types | ✓ | Inventory, Discovery |
-| Needs Server | ✓ | Checked [x] |
-| Blueprint Allowed | | Unchecked [ ] |
-| Uses PowerShell | | Unchecked [ ] |
-| Requires Store Password | | Unchecked [ ] |
-| Supports Entry Password | | Unchecked [ ] |
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
-
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
-##### UI Advanced Tab
-| Field Name | Required | Value |
-|-----------------------|----------|------------|
-| Store Path Type | | Freeform |
-| Supports Custom Alias | | Forbidden |
-| Private Key Handling | | Forbidden |
-| PFX Password Style | | Default |
+2. **Add a Certificate Store.**
-
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
-##### UI Custom Fields Tab
-| Name | Display Name | Type | Required | Default Value | Description |
-|--------------------|---------------------------|--------|----------|---------------|--------------------------------------------------------------------------------------------------------|
-| KubeNamespace | Kube Namespace | String | | | The K8S namespace the `cert` resource lives. This will override any value inferred in the `Store Path` |
-| KubeSecretName | Kube Secret Name | String | | | The K8S `cert` name. This will override any value inferred in the `Store Path`. |
-| KubeSecretType | Kube Secret Type | String | ✓ | `cert` | |
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8SCluster" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SCluster` certificates. Specifically, one with the `K8SCluster` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | IncludeCertChain | Whether to include the certificate chain in the certificate. |
-
-##### UI Entry Parameters Tab:
-Empty
-
-## Creating Certificate Stores and Scheduling Discovery Jobs
-
-Please refer to the Keyfactor Command Reference Guide for information on creating
-certificate stores and scheduling Discovery jobs in Keyfactor Command.
-
-## Certificate Discovery
-**NOTE:** To use disovery jobs, you must have the story type created in Keyfactor Command and the `needs_server` checkbox MUST be checked.
-Otherwise you will not be able to provide credentials to the discovery job.
+
+
+
+
+#### Using kfutil CLI
+
+Click to expand details
+
+1. **Generate a CSV template for the K8SCluster certificate store**
+
+ ```shell
+ kfutil stores import generate-template --store-type-name K8SCluster --outpath K8SCluster.csv
+ ```
+2. **Populate the generated CSV file**
+
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8SCluster" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SCluster` certificates. Specifically, one with the `K8SCluster` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | Properties.IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+3. **Import the CSV file to create the certificate stores**
+
+ ```shell
+ kfutil stores import csv --store-type-name K8SCluster --file K8SCluster.csv
+ ```
+
+
+
+
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
+
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
+
+
+
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
+
+
+
+
+K8SJKS (K8SJKS)
+
+In order for certificates of type `Opaque` to be inventoried as `K8SJKS` store types, they must have specific keys in
+the Kubernetes secret.
+- Valid Keys: `*.jks`
+
+### Storepath Patterns
+- `/`
+- `/secrets/`
+- `//secrets/`
+
+### Alias Patterns
+- `/`
+
+Example: `test.jks/load_balancer` where `test.jks` is the field name on the `Opaque` secret and `load_balancer` is
+the certificate alias in the `jks` data store.
+
+
+### Store Creation
+
+#### Manually with the Command UI
+
+Click to expand details
+
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
+
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
+
+2. **Add a Certificate Store.**
+
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
+
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8SJKS" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Store Password | Password to use when reading/writing to store |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SJKS` certificates. Specifically, one with the `K8SJKS` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | KubeSecretName | The name of the K8S secret object. |
+ | KubeSecretType | This defaults to and must be `jks` |
+ | CertificateDataFieldName | |
+ | PasswordFieldName | |
+ | PasswordIsK8SSecret | |
+ | StorePasswordPath | |
+
+
+
+
+
+#### Using kfutil CLI
+
+Click to expand details
+
+1. **Generate a CSV template for the K8SJKS certificate store**
+
+ ```shell
+ kfutil stores import generate-template --store-type-name K8SJKS --outpath K8SJKS.csv
+ ```
+2. **Populate the generated CSV file**
+
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8SJKS" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Store Password | Password to use when reading/writing to store |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SJKS` certificates. Specifically, one with the `K8SJKS` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | Properties.KubeSecretName | The name of the K8S secret object. |
+ | Properties.KubeSecretType | This defaults to and must be `jks` |
+ | Properties.CertificateDataFieldName | |
+ | Properties.PasswordFieldName | |
+ | Properties.PasswordIsK8SSecret | |
+ | Properties.StorePasswordPath | |
+
+3. **Import the CSV file to create the certificate stores**
+
+ ```shell
+ kfutil stores import csv --store-type-name K8SJKS --file K8SJKS.csv
+ ```
+
+
+
+
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
+
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | StorePassword | Password to use when reading/writing to store |
+
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
+
+
+
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
+
+
+
+
+K8SNS (K8SNS)
+
+In order for certificates of type `Opaque` and/or `kubernetes.io/tls` to be inventoried in `K8SNS` store types, they must
+have specific keys in the Kubernetes secret.
+- Required keys: `tls.crt` or `ca.crt`
+- Additional keys: `tls.key`
+
+### Storepath Patterns
+- ``
+- `/`
+
+### Alias Patterns
+- `secrets//`
+
+
+### Store Creation
+
+#### Manually with the Command UI
+
+Click to expand details
+
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
+
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
+
+2. **Add a Certificate Store.**
+
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
+
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8SNS" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SNS` certificates. Specifically, one with the `K8SNS` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | KubeNamespace | |
+ | SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+
+
+
+
+#### Using kfutil CLI
+
+Click to expand details
+
+1. **Generate a CSV template for the K8SNS certificate store**
+
+ ```shell
+ kfutil stores import generate-template --store-type-name K8SNS --outpath K8SNS.csv
+ ```
+2. **Populate the generated CSV file**
+
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8SNS" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SNS` certificates. Specifically, one with the `K8SNS` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.KubeNamespace | |
+ | Properties.SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | Properties.IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+3. **Import the CSV file to create the certificate stores**
+
+ ```shell
+ kfutil stores import csv --store-type-name K8SNS --file K8SNS.csv
+ ```
+
+
+
+
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
+
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
+
+
+
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
+
+
+
+
+K8SPKCS12 (K8SPKCS12)
+
+In order for certificates of type `Opaque` to be inventoried as `K8SPKCS12` store types, they must have specific keys in
+the Kubernetes secret.
+- Valid Keys: `*.pfx`, `*.pkcs12`, `*.p12`
+
+### Storepath Patterns
+- `/`
+- `/secrets/`
+- `//secrets/`
+
+### Alias Patterns
+- `/`
+
+Example: `test.pkcs12/load_balancer` where `test.pkcs12` is the field name on the `Opaque` secret and `load_balancer` is
+the certificate alias in the `pkcs12` data store.
+
+
+### Store Creation
+
+#### Manually with the Command UI
+
+Click to expand details
+
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
+
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
+
+2. **Add a Certificate Store.**
+
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
+
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8SPKCS12" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Store Password | Password to use when reading/writing to store |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SPKCS12` certificates. Specifically, one with the `K8SPKCS12` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | KubeSecretType | This defaults to and must be `pkcs12` |
+ | CertificateDataFieldName | |
+ | PasswordFieldName | |
+ | PasswordIsK8SSecret | |
+ | KubeNamespace | |
+ | KubeSecretName | |
+ | StorePasswordPath | |
+
+
+
+
+
+#### Using kfutil CLI
+
+Click to expand details
+
+1. **Generate a CSV template for the K8SPKCS12 certificate store**
+
+ ```shell
+ kfutil stores import generate-template --store-type-name K8SPKCS12 --outpath K8SPKCS12.csv
+ ```
+2. **Populate the generated CSV file**
+
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8SPKCS12" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Store Password | Password to use when reading/writing to store |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SPKCS12` certificates. Specifically, one with the `K8SPKCS12` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.KubeSecretType | This defaults to and must be `pkcs12` |
+ | Properties.CertificateDataFieldName | |
+ | Properties.PasswordFieldName | |
+ | Properties.PasswordIsK8SSecret | |
+ | Properties.KubeNamespace | |
+ | Properties.KubeSecretName | |
+ | Properties.StorePasswordPath | |
+
+3. **Import the CSV file to create the certificate stores**
+
+ ```shell
+ kfutil stores import csv --store-type-name K8SPKCS12 --file K8SPKCS12.csv
+ ```
+
+
+
+
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
+
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | StorePassword | Password to use when reading/writing to store |
+
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
+
+
+
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
+
+
+
+
+K8SSecret (K8SSecret)
+
+In order for certificates of type `Opaque` to be inventoried as `K8SSecret` store types, they must have specific keys in
+the Kubernetes secret.
+- Required keys: `tls.crt` or `ca.crt`
+- Additional keys: `tls.key`
+
+
+### Store Creation
+
+#### Manually with the Command UI
+
+Click to expand details
+
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
+
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
+
+2. **Add a Certificate Store.**
+
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
+
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8SSecret" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SSecret` certificates. Specifically, one with the `K8SSecret` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | KubeSecretName | The name of the K8S secret object. |
+ | KubeSecretType | This defaults to and must be `secret` |
+ | SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+
+
+
+
+#### Using kfutil CLI
+
+Click to expand details
+
+1. **Generate a CSV template for the K8SSecret certificate store**
+
+ ```shell
+ kfutil stores import generate-template --store-type-name K8SSecret --outpath K8SSecret.csv
+ ```
+2. **Populate the generated CSV file**
+
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8SSecret" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8SSecret` certificates. Specifically, one with the `K8SSecret` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | Properties.KubeSecretName | The name of the K8S secret object. |
+ | Properties.KubeSecretType | This defaults to and must be `secret` |
+ | Properties.SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | Properties.IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+3. **Import the CSV file to create the certificate stores**
+
+ ```shell
+ kfutil stores import csv --store-type-name K8SSecret --file K8SSecret.csv
+ ```
+
+
+
+
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
+
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
+
+
+
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
+
+
+
+
+K8STLSSecr (K8STLSSecr)
+
+In order for certificates of type `kubernetes.io/tls` to be inventoried, they must have specific keys in
+the Kubernetes secret.
+- Required keys: `tls.crt` and `tls.key`
+- Optional keys: `ca.crt`
+
+
+### Store Creation
+
+#### Manually with the Command UI
+
+Click to expand details
+
+1. **Navigate to the _Certificate Stores_ page in Keyfactor Command.**
+
+ Log into Keyfactor Command, toggle the _Locations_ dropdown, and click _Certificate Stores_.
+
+2. **Add a Certificate Store.**
+
+ Click the Add button to add a new Certificate Store. Use the table below to populate the **Attributes** in the **Add** form.
+
+ | Attribute | Description |
+ | --------- |---------------------------------------------------------|
+ | Category | Select "K8STLSSecr" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8STLSSecr` certificates. Specifically, one with the `K8STLSSecr` capability. |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | KubeSecretName | The name of the K8S secret object. |
+ | KubeSecretType | This defaults to and must be `tls_secret` |
+ | SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+
+
+
+
+#### Using kfutil CLI
+
+Click to expand details
+
+1. **Generate a CSV template for the K8STLSSecr certificate store**
+
+ ```shell
+ kfutil stores import generate-template --store-type-name K8STLSSecr --outpath K8STLSSecr.csv
+ ```
+2. **Populate the generated CSV file**
+
+ Open the CSV file, and reference the table below to populate parameters for each **Attribute**.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | Category | Select "K8STLSSecr" or the customized certificate store name from the previous step. |
+ | Container | Optional container to associate certificate store with. |
+ | Client Machine | |
+ | Store Path | |
+ | Orchestrator | Select an approved orchestrator capable of managing `K8STLSSecr` certificates. Specifically, one with the `K8STLSSecr` capability. |
+ | Properties.ServerUsername | This should be no value or `kubeconfig` |
+ | Properties.ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+ | Properties.KubeNamespace | The K8S namespace to use to manage the K8S secret object. |
+ | Properties.KubeSecretName | The name of the K8S secret object. |
+ | Properties.KubeSecretType | This defaults to and must be `tls_secret` |
+ | Properties.SeparateChain | Whether to store the certificate chain separately from the certificate. |
+ | Properties.IncludeCertChain | Whether to include the certificate chain in the certificate. |
+
+3. **Import the CSV file to create the certificate stores**
+
+ ```shell
+ kfutil stores import csv --store-type-name K8STLSSecr --file K8STLSSecr.csv
+ ```
+
+
+
+
+#### PAM Provider Eligible Fields
+Attributes eligible for retrieval by a PAM Provider on the Universal Orchestrator
+
+If a PAM provider was installed _on the Universal Orchestrator_ in the [Installation](#Installation) section, the following parameters can be configured for retrieval _on the Universal Orchestrator_.
+
+ | Attribute | Description |
+ | --------- | ----------- |
+ | ServerUsername | This should be no value or `kubeconfig` |
+ | ServerPassword | The credentials to use to connect to the K8S cluster API. This needs to be in `kubeconfig` format. Example: https://github.com/Keyfactor/k8s-orchestrator/tree/main/scripts/kubernetes#example-service-account-json |
+
+Please refer to the **Universal Orchestrator (remote)** usage section ([PAM providers on the Keyfactor Integration Catalog](https://keyfactor.github.io/integrations-catalog/content/pam)) for your selected PAM provider for instructions on how to load attributes orchestrator-side.
+> Any secret can be rendered by a PAM provider _installed on the Keyfactor Command server_. The above parameters are specific to attributes that can be fetched by an installed PAM provider running on the Universal Orchestrator server itself.
+
+
+
+
+> The content in this section can be supplemented by the [official Command documentation](https://software.keyfactor.com/Core-OnPrem/Current/Content/ReferenceGuide/Certificate%20Stores.htm?Highlight=certificate%20store).
+
+
+
+
+## Discovering Certificate Stores with the Discovery Job
+**NOTE:** To use discovery jobs, you must have the story type created in Keyfactor Command and the `needs_server`
+checkbox *MUST* be checked, if you do not select `needs_server` you will not be able to provide credentials to the
+discovery job and it will fail.
The Kubernetes Orchestrator Extension supports certificate discovery jobs. This allows you to populate the certificate stores with existing certificates. To run a discovery job, follow these steps:
1. Click on the "Locations > Certificate Stores" menu item.
2. Click the "Discover" tab.
3. Click the "Schedule" button.
4. Configure the job based on storetype. **Note** the "Server Username" field must be set to `kubeconfig` and the "Server Password" field is the `kubeconfig` formatted JSON file containing the service account credentials. See the "Service Account Setup" section earlier in this README for more information on setting up a service account.
- 
- 
- 
- 
+ 
+ 
+ 
+ 
5. Click the "Save" button and wait for the Orchestrator to run the job. This may take some time depending on the number of certificates in the store and the Orchestrator's check-in schedule.
-### K8SNS Discovery
+
+
+K8SJKS
+
+
+### K8SJKS Discovery Job
+
+For discovery of `K8SJKS` stores toy can use the following params to filter the certificates that will be discovered:
+- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all
+namespaces. *This cannot be left blank.*
+- `File name patterns to match` - comma separated list of K8S secret keys to search for PKCS12 or JKS data. Will use
+the following keys by default: `tls.pfx`,`tls.pkcs12`,`pfx`,`pkcs12`,`tls.jks`,`jks`.
+
+
+
+K8SNS
+
+
+### K8SNS Discovery Job
+
For discovery of K8SNS stores toy can use the following params to filter the certificates that will be discovered:
-- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all namespaces. *This cannot be left blank.*
-
-### K8SPKCS12 and K8SJKS Discovery
-For discovery of K8SPKCS12 and K8SJKS stores toy can use the following params to filter the certificates that will be discovered:
-- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all namespaces. *This cannot be left blank.*
-- `File name patterns to match` - comma separated list of K8S secret keys to search for PKCS12 or JKS data. Will use the following keys by default: `tls.pfx`,`tls.pkcs12`,`pfx`,`pkcs12`,`tls.jks`,`jks`.
-
-## Certificate Inventory
-In order for certificates to be inventoried by the Keyfactor k8s-orchestrator, they must have specific keys and values
-in the Kubernetes Secret. The following table shows the required keys and values for each type of certificate store.
-
-| Store Type | Valid Secret Keys |
-|------------|--------------------------------|
-| K8STLSSecr | `tls.crt`,`tls.key`, `ca.crt` |
-| K8SSecret | `tls.crt`,`tls.crts`, `ca.crt` |
-| K8SCert | `cert`, `csr` |
-| K8SPKCS12 | `*.pfx`,`*.pkcs12`, `*.p12` |
-| K8SJKS | `*.jks` |
-| K8SNS | `tls.crt`,`tls.crts`, `ca.crt` |
-| K8SCluster | `tls.crt`,`tls.crts`, `ca.crt` |
-
-## Certificate Management
-Management add/remove/create operations will attempt to write back to the Kubernetes Secret.
-The following table shows the keys that the orchestrator will write back to the Kubernetes Secret for
-each type of certificate store.
-
-| Store Type | Managed Secret Keys |
-|------------|-----------------------------------------------------------|
-| K8STLSSecr | `tls.crt`,`tls.key`, `ca.crt` |
-| K8SSecret | `tls.crt`,`tls.key`, `ca.crt` |
-| K8SPKCS12 | Specified in custom field `KubeSecretKey` or use defaults |
-| K8SJKS | Specified in custom field `KubeSecretKey` or use defaults |
-| K8SCluster | `tls.crt`,`tls.key` |
-| K8SNS | `tls.crt`,`tls.key` |
-
-### K8STLSSecr & K8SSecret
-These store types are virtually the same, they only differ in what K8S secret type they create. Both store types allow
-for **ONLY** a single certificate to be stored in the secret. This means any `add` job will **overwrite** the existing
-`tls.crt`, `tls.key`, and `ca.crt` values in the secret. If a secret does not exist, the orchestrator will create one
-with the fields `tls.crt`, `tls.key`. Additionally, if `SeparateChain` on the store definition is set to
-`true`, then the field `ca.crt` will be populated with the certificate chain data.
-
-**NOTE:** If a secret already exists and does not contain the field `ca.crt`, the orchestrator will **NOT** add the field
-`ca.crt` to the secret, and instead will deploy a full certificate chain to the `tls.crt` field.
-
-#### Opaque & tls secret w/o ca.crt
-Here's what an `Opaque` secret looks like in the UI when it does not contain the `ca.crt` field **NOTE** the chain is
-included in the `tls.crt` field:
-
-
-#### Opaque & tls secret w/ ca.crt
-Here's what an `Opaque` secret looks like in the UI when it does contain the `ca.crt` field:
-
-
-#### Opaque & tls secret w/o private key
-It is possible to deploy a certificate without the private key from Command, and this is how it will look in the UI
-**NOTE** the chain will only be included if Command has inventoried it:
-
-
-### K8SJKS & K8SPKCS12
-
-The K8SJKS store type is a Java Key Store (JKS) that is stored in a Kubernetes Secret. The secret can contain multiple
-JKS files. The orchestrator will attempt to manage the JKS files found in the secret that match the `allowed_keys` or
-`CertificateDataFieldName` custom field values.
-
-Alias pattern: `/`.
-
-Example of secret containing 2 JKS stores:
-
-
-Here's what this looks like in the UI:
-
-
-## Development
-
-[See the development guide](Development.md)
+- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all
+namespaces. *This cannot be left blank.*
+
+
+
+K8SPKCS12
+
+
+### K8SPKCS12 Discovery Job
+
+For discovery of `K8SPKCS12` stores toy can use the following params to filter the certificates that will be discovered:
+- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all
+ namespaces. *This cannot be left blank.*
+- `File name patterns to match` - comma separated list of K8S secret keys to search for PKCS12 or PKCS12 data. Will use
+ the following keys by default: `tls.pfx`,`tls.pkcs12`,`pfx`,`pkcs12`,`tls.pkcs12`,`pkcs12`.
+
+
+
+K8SSecret
-## License
-[Apache](https://apache.org/licenses/LICENSE-2.0)
+### K8SSecret Discovery Job
+
+For discovery of K8SNS stores toy can use the following params to filter the certificates that will be discovered:
+- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all
+ namespaces. *This cannot be left blank.*
+
+
+
+K8STLSSecr
+
+
+### K8STLSSecr Discovery Job
+
+For discovery of K8SNS stores toy can use the following params to filter the certificates that will be discovered:
+- `Directories to search` - comma separated list of namespaces to search for certificates OR `all` to search all
+ namespaces. *This cannot be left blank.*
+
+
+
+
+
+
+## License
-When creating cert store type manually, that store property names and entry parameter names are case sensitive
+Apache License 2.0, see [LICENSE](LICENSE).
+## Related Integrations
+See all [Keyfactor Universal Orchestrator extensions](https://github.com/orgs/Keyfactor/repositories?q=orchestrator).
\ No newline at end of file
diff --git a/TestConsole/Program.cs b/TestConsole/Program.cs
index 90f794f..a3bfed6 100644
--- a/TestConsole/Program.cs
+++ b/TestConsole/Program.cs
@@ -17,7 +17,6 @@
using System.IO;
using System.Text;
using System.Threading.Tasks;
-using IdentityModel.Client;
using Keyfactor.Extensions.Orchestrator.K8S.Jobs;
using Keyfactor.Orchestrators.Common.Enums;
using Keyfactor.Orchestrators.Extensions;
@@ -25,678 +24,694 @@
using Moq;
using Newtonsoft.Json;
-namespace TestConsole
+namespace TestConsole;
+
+public class OrchTestCase
{
- public class OrchTestCase
- {
- public string TestName { get; set; }
+ public string TestName { get; set; }
- public string Description { get; set; }
+ public string Description { get; set; }
- public bool Fail { get; set; }
+ public bool Fail { get; set; }
- public string ExpectedValue { get; set; }
+ public string ExpectedValue { get; set; }
- public JobConfig JobConfig { get; set; }
- }
-
- public class CertificateStoreDetails
- {
- public string ClientMachine { get; set; }
+ public JobConfig JobConfig { get; set; }
+}
- public string StorePath { get; set; }
+public class CertificateStoreDetails
+{
+ public string ClientMachine { get; set; }
- public string StorePassword { get; set; }
+ public string StorePath { get; set; }
- public string Properties { get; set; }
+ public string StorePassword { get; set; }
- public int Type { get; set; }
- }
+ public string Properties { get; set; }
- public class JobCertificate
- {
- public object Thumbprint { get; set; }
+ public int Type { get; set; }
+}
- public string Contents { get; set; }
+public class JobCertificate
+{
+ public object Thumbprint { get; set; }
- public string Alias { get; set; }
+ public string Contents { get; set; }
- public string PrivateKeyPassword { get; set; }
- }
+ public string Alias { get; set; }
- public class JobConfig
- {
+ public string PrivateKeyPassword { get; set; }
+}
- public List