misc: attached gateway name to client certificates

This commit is contained in:
Sheen Capadngan
2025-09-19 17:17:21 +08:00
parent 6db30c20c7
commit bb515c334e
3 changed files with 29 additions and 6 deletions

View File

@@ -395,7 +395,8 @@ export const gatewayV2ServiceFactory = ({
relayId: gateway.relayId, relayId: gateway.relayId,
orgId: gateway.orgId, orgId: gateway.orgId,
orgName: gateway.orgName, orgName: gateway.orgName,
gatewayId gatewayId,
gatewayName: gateway.name
}); });
return { return {
@@ -508,7 +509,8 @@ export const gatewayV2ServiceFactory = ({
const relayCredentials = await relayService.getCredentialsForGateway({ const relayCredentials = await relayService.getCredentialsForGateway({
relayName, relayName,
orgId, orgId,
gatewayId: gateway.id gatewayId: gateway.id,
gatewayName: gateway.name
}); });
return { return {

View File

@@ -0,0 +1 @@
export const RELAY_CONNECTING_GATEWAY_INFO = "1.3.6.1.4.1.12345.100.3";

View File

@@ -24,6 +24,7 @@ import { SshCertType } from "../ssh/ssh-certificate-authority-types";
import { SshCertKeyAlgorithm } from "../ssh-certificate/ssh-certificate-types"; import { SshCertKeyAlgorithm } from "../ssh-certificate/ssh-certificate-types";
import { TInstanceRelayConfigDALFactory } from "./instance-relay-config-dal"; import { TInstanceRelayConfigDALFactory } from "./instance-relay-config-dal";
import { TOrgRelayConfigDALFactory } from "./org-relay-config-dal"; import { TOrgRelayConfigDALFactory } from "./org-relay-config-dal";
import { RELAY_CONNECTING_GATEWAY_INFO } from "./relay-constants";
import { TRelayDALFactory } from "./relay-dal"; import { TRelayDALFactory } from "./relay-dal";
export type TRelayServiceFactory = ReturnType<typeof relayServiceFactory>; export type TRelayServiceFactory = ReturnType<typeof relayServiceFactory>;
@@ -698,6 +699,7 @@ export const relayServiceFactory = ({
const $generateRelayClientCredentials = async ({ const $generateRelayClientCredentials = async ({
gatewayId, gatewayId,
gatewayName,
orgId, orgId,
orgName, orgName,
relayPkiClientCaCertificate, relayPkiClientCaCertificate,
@@ -706,6 +708,7 @@ export const relayServiceFactory = ({
relayPkiServerCaCertificateChain relayPkiServerCaCertificateChain
}: { }: {
gatewayId: string; gatewayId: string;
gatewayName: string;
orgId: string; orgId: string;
orgName: string; orgName: string;
relayPkiClientCaCertificate: Buffer; relayPkiClientCaCertificate: Buffer;
@@ -736,6 +739,16 @@ export const relayServiceFactory = ({
const clientCertPrivateKey = crypto.nativeCrypto.KeyObject.from(clientKeys.privateKey); const clientCertPrivateKey = crypto.nativeCrypto.KeyObject.from(clientKeys.privateKey);
const clientCertSerialNumber = createSerialNumber(); const clientCertSerialNumber = createSerialNumber();
const connectingGatewayInfoExtension = new x509.Extension(
RELAY_CONNECTING_GATEWAY_INFO,
false,
Buffer.from(
JSON.stringify({
name: gatewayName
})
)
);
// Build standard extensions // Build standard extensions
const extensions: x509.Extension[] = [ const extensions: x509.Extension[] = [
new x509.BasicConstraintsExtension(false), new x509.BasicConstraintsExtension(false),
@@ -749,7 +762,8 @@ export const relayServiceFactory = ({
x509.KeyUsageFlags[CertKeyUsage.KEY_AGREEMENT], x509.KeyUsageFlags[CertKeyUsage.KEY_AGREEMENT],
true true
), ),
new x509.ExtendedKeyUsageExtension([x509.ExtendedKeyUsage[CertExtendedKeyUsage.CLIENT_AUTH]], true) new x509.ExtendedKeyUsageExtension([x509.ExtendedKeyUsage[CertExtendedKeyUsage.CLIENT_AUTH]], true),
connectingGatewayInfoExtension
]; ];
const clientCert = await x509.X509CertificateGenerator.create({ const clientCert = await x509.X509CertificateGenerator.create({
@@ -777,11 +791,13 @@ export const relayServiceFactory = ({
const getCredentialsForGateway = async ({ const getCredentialsForGateway = async ({
relayName, relayName,
orgId, orgId,
gatewayId gatewayId,
gatewayName
}: { }: {
relayName: string; relayName: string;
orgId: string; orgId: string;
gatewayId: string; gatewayId: string;
gatewayName: string;
}) => { }) => {
let relay: TRelays | null = await relayDAL.findOne({ let relay: TRelays | null = await relayDAL.findOne({
orgId, orgId,
@@ -829,7 +845,7 @@ export const relayServiceFactory = ({
caPrivateKey: orgCAs.relaySshClientCaPrivateKey.toString("utf8"), caPrivateKey: orgCAs.relaySshClientCaPrivateKey.toString("utf8"),
clientPublicKey: relayClientSshPublicKey, clientPublicKey: relayClientSshPublicKey,
keyId: `client-${relayName}`, keyId: `client-${relayName}`,
principals: [gatewayId], principals: [gatewayId, gatewayName],
certType: SshCertType.USER, certType: SshCertType.USER,
requestedTtl: "1d" requestedTtl: "1d"
}); });
@@ -846,12 +862,14 @@ export const relayServiceFactory = ({
relayId, relayId,
orgId, orgId,
orgName, orgName,
gatewayId gatewayId,
gatewayName
}: { }: {
relayId: string; relayId: string;
orgId: string; orgId: string;
orgName: string; orgName: string;
gatewayId: string; gatewayId: string;
gatewayName: string;
}) => { }) => {
const relay = await relayDAL.findOne({ const relay = await relayDAL.findOne({
id: relayId id: relayId
@@ -869,6 +887,7 @@ export const relayServiceFactory = ({
const instanceCAs = await $getInstanceCAs(); const instanceCAs = await $getInstanceCAs();
const relayCertificateCredentials = await $generateRelayClientCredentials({ const relayCertificateCredentials = await $generateRelayClientCredentials({
gatewayId, gatewayId,
gatewayName,
orgId, orgId,
orgName, orgName,
relayPkiClientCaCertificate: instanceCAs.instanceRelayPkiClientCaCertificate, relayPkiClientCaCertificate: instanceCAs.instanceRelayPkiClientCaCertificate,
@@ -886,6 +905,7 @@ export const relayServiceFactory = ({
const orgCAs = await $getOrgCAs(orgId); const orgCAs = await $getOrgCAs(orgId);
const relayCertificateCredentials = await $generateRelayClientCredentials({ const relayCertificateCredentials = await $generateRelayClientCredentials({
gatewayId, gatewayId,
gatewayName,
orgId, orgId,
orgName, orgName,
relayPkiClientCaCertificate: orgCAs.relayPkiClientCaCertificate, relayPkiClientCaCertificate: orgCAs.relayPkiClientCaCertificate,