mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-08 05:27:52 +00:00
Fix PKI syncs to return intermidiate chain and root CA on the json object
This commit is contained in:
@@ -196,3 +196,62 @@ export const convertExtendedKeyUsageArrayToLegacy = (
|
|||||||
): CertExtendedKeyUsage[] | undefined => {
|
): CertExtendedKeyUsage[] | undefined => {
|
||||||
return usages?.map(convertToLegacyExtendedKeyUsage);
|
return usages?.map(convertToLegacyExtendedKeyUsage);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a PEM-formatted certificate chain and returns individual certificates
|
||||||
|
* @param certificateChain - PEM-formatted certificate chain
|
||||||
|
* @returns Array of individual PEM certificates
|
||||||
|
*/
|
||||||
|
const parseCertificateChain = (certificateChain: string): string[] => {
|
||||||
|
if (!certificateChain || typeof certificateChain !== "string") {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const certRegex = new RE2(/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g);
|
||||||
|
const certificates = certificateChain.match(certRegex);
|
||||||
|
|
||||||
|
return certificates ? certificates.map((cert) => cert.trim()) : [];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the root CA certificate from a certificate chain, leaving only intermediate certificates.
|
||||||
|
* If the chain contains only the root CA certificate, returns an empty string.
|
||||||
|
*
|
||||||
|
* @param certificateChain - PEM-formatted certificate chain containing leaf + intermediates + root CA
|
||||||
|
* @returns PEM-formatted certificate chain with only intermediate certificates (no root CA)
|
||||||
|
*/
|
||||||
|
export const removeRootCaFromChain = (certificateChain?: string): string => {
|
||||||
|
if (!certificateChain || typeof certificateChain !== "string") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const certificates = parseCertificateChain(certificateChain);
|
||||||
|
|
||||||
|
if (certificates.length === 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const intermediateCerts = certificates.slice(0, -1);
|
||||||
|
|
||||||
|
return intermediateCerts.join("\n");
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts the root CA certificate from a certificate chain.
|
||||||
|
*
|
||||||
|
* @param certificateChain - PEM-formatted certificate chain containing leaf + intermediates + root CA
|
||||||
|
* @returns PEM-formatted root CA certificate, or empty string if not found
|
||||||
|
*/
|
||||||
|
export const extractRootCaFromChain = (certificateChain?: string): string => {
|
||||||
|
if (!certificateChain || typeof certificateChain !== "string") {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
const certificates = parseCertificateChain(certificateChain);
|
||||||
|
|
||||||
|
if (certificates.length === 0) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return certificates[certificates.length - 1];
|
||||||
|
};
|
||||||
|
|||||||
+5
-1
@@ -17,6 +17,7 @@ import { AWSRegion } from "@app/services/app-connection/app-connection-enums";
|
|||||||
import { getAwsConnectionConfig } from "@app/services/app-connection/aws/aws-connection-fns";
|
import { getAwsConnectionConfig } from "@app/services/app-connection/aws/aws-connection-fns";
|
||||||
import { TAwsConnectionConfig } from "@app/services/app-connection/aws/aws-connection-types";
|
import { TAwsConnectionConfig } from "@app/services/app-connection/aws/aws-connection-types";
|
||||||
import { TCertificateDALFactory } from "@app/services/certificate/certificate-dal";
|
import { TCertificateDALFactory } from "@app/services/certificate/certificate-dal";
|
||||||
|
import { removeRootCaFromChain } from "@app/services/certificate-common/certificate-utils";
|
||||||
import { TCertificateSyncDALFactory } from "@app/services/certificate-sync/certificate-sync-dal";
|
import { TCertificateSyncDALFactory } from "@app/services/certificate-sync/certificate-sync-dal";
|
||||||
import { CertificateSyncStatus } from "@app/services/certificate-sync/certificate-sync-enums";
|
import { CertificateSyncStatus } from "@app/services/certificate-sync/certificate-sync-enums";
|
||||||
import { createConnectionQueue, RateLimitConfig } from "@app/services/connection-queue";
|
import { createConnectionQueue, RateLimitConfig } from "@app/services/connection-queue";
|
||||||
@@ -262,7 +263,10 @@ export const awsSecretsManagerPkiSyncFactory = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (certificateChain && certificateChain.trim().length > 0) {
|
if (certificateChain && certificateChain.trim().length > 0) {
|
||||||
certificateData[fieldMappings.certificateChain] = certificateChain;
|
const processedCertificateChain = removeRootCaFromChain(certificateChain);
|
||||||
|
if (processedCertificateChain.trim().length > 0) {
|
||||||
|
certificateData[fieldMappings.certificateChain] = processedCertificateChain;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (caCertificate && typeof caCertificate === "string" && caCertificate.trim().length > 0) {
|
if (caCertificate && typeof caCertificate === "string" && caCertificate.trim().length > 0) {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import {
|
|||||||
import { TChefDataBagItemContent } from "@app/ee/services/secret-sync/chef";
|
import { TChefDataBagItemContent } from "@app/ee/services/secret-sync/chef";
|
||||||
import { logger } from "@app/lib/logger";
|
import { logger } from "@app/lib/logger";
|
||||||
import { TCertificateDALFactory } from "@app/services/certificate/certificate-dal";
|
import { TCertificateDALFactory } from "@app/services/certificate/certificate-dal";
|
||||||
|
import { removeRootCaFromChain } from "@app/services/certificate-common/certificate-utils";
|
||||||
import { TCertificateSyncDALFactory } from "@app/services/certificate-sync/certificate-sync-dal";
|
import { TCertificateSyncDALFactory } from "@app/services/certificate-sync/certificate-sync-dal";
|
||||||
import { CertificateSyncStatus } from "@app/services/certificate-sync/certificate-sync-enums";
|
import { CertificateSyncStatus } from "@app/services/certificate-sync/certificate-sync-enums";
|
||||||
import { createConnectionQueue, RateLimitConfig } from "@app/services/connection-queue";
|
import { createConnectionQueue, RateLimitConfig } from "@app/services/connection-queue";
|
||||||
@@ -264,11 +265,13 @@ export const chefPkiSyncFactory = ({ certificateDAL, certificateSyncDAL }: TChef
|
|||||||
} = certificateData;
|
} = certificateData;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
const processedCertificateChain = certificateChain ? removeRootCaFromChain(certificateChain) : undefined;
|
||||||
|
|
||||||
const chefDataBagItem: ChefCertificateDataBagItem = {
|
const chefDataBagItem: ChefCertificateDataBagItem = {
|
||||||
id: targetItemName,
|
id: targetItemName,
|
||||||
[fieldMappings.certificate]: cert,
|
[fieldMappings.certificate]: cert,
|
||||||
[fieldMappings.privateKey]: certPrivateKey,
|
[fieldMappings.privateKey]: certPrivateKey,
|
||||||
...(certificateChain && { [fieldMappings.certificateChain]: certificateChain }),
|
...(processedCertificateChain && { [fieldMappings.certificateChain]: processedCertificateChain }),
|
||||||
...(caCertificate && { [fieldMappings.caCertificate]: caCertificate })
|
...(caCertificate && { [fieldMappings.caCertificate]: caCertificate })
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import { TCertificateSecretDALFactory } from "../certificate/certificate-secret-
|
|||||||
import { TCertificateAuthorityCertDALFactory } from "../certificate-authority/certificate-authority-cert-dal";
|
import { TCertificateAuthorityCertDALFactory } from "../certificate-authority/certificate-authority-cert-dal";
|
||||||
import { TCertificateAuthorityDALFactory } from "../certificate-authority/certificate-authority-dal";
|
import { TCertificateAuthorityDALFactory } from "../certificate-authority/certificate-authority-dal";
|
||||||
import { getCaCertChain } from "../certificate-authority/certificate-authority-fns";
|
import { getCaCertChain } from "../certificate-authority/certificate-authority-fns";
|
||||||
|
import { extractRootCaFromChain } from "../certificate-common/certificate-utils";
|
||||||
import { TCertificateSyncDALFactory } from "../certificate-sync/certificate-sync-dal";
|
import { TCertificateSyncDALFactory } from "../certificate-sync/certificate-sync-dal";
|
||||||
import { CertificateSyncStatus } from "../certificate-sync/certificate-sync-enums";
|
import { CertificateSyncStatus } from "../certificate-sync/certificate-sync-enums";
|
||||||
import { TPkiSyncDALFactory } from "./pki-sync-dal";
|
import { TPkiSyncDALFactory } from "./pki-sync-dal";
|
||||||
@@ -255,7 +256,7 @@ export const pkiSyncQueueFactory = ({
|
|||||||
if (!certBody.encryptedCertificateChain) {
|
if (!certBody.encryptedCertificateChain) {
|
||||||
certificateChain = `${caCert}\n${caCertChain}`.trim();
|
certificateChain = `${caCert}\n${caCertChain}`.trim();
|
||||||
}
|
}
|
||||||
caCertificate = caCert;
|
caCertificate = certificateChain ? extractRootCaFromChain(certificateChain) : caCert;
|
||||||
}
|
}
|
||||||
} catch (chainError) {
|
} catch (chainError) {
|
||||||
logger.warn(
|
logger.warn(
|
||||||
|
|||||||
Reference in New Issue
Block a user