feat(control-plane): production native-CA wiring for on-disk P-256 CAs (A2-prep)
Wire the prod boot to issue frp-client + device leaves from the existing on-disk P-256 CAs: NATIVE_* env vars, a file-backed KmsResolver (loads the PEM key, validates prime256v1, never logs key material), buildFileBackedNativeCas threaded into buildControlPlane via a nativeCas override. Fail-closed on partial NATIVE_*. 281 tests pass.
This commit is contained in:
@@ -115,3 +115,61 @@ describe('B1 operator-login env (set-together-or-none, fail-closed)', () => {
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
describe('A2-prep native-tunnel CA env (set-together-or-none, fail-closed)', () => {
|
||||
const FRP_CERT = '/etc/cp/frp-client-ca.cert.pem'
|
||||
const DEV_CERT = '/etc/cp/device-ca.cert.pem'
|
||||
const ZONE = 'native.example.test'
|
||||
|
||||
test('none set → nativeCa undefined (injection/dev path)', () => {
|
||||
const env = loadEnv(base())
|
||||
expect(env.nativeCa).toBeUndefined()
|
||||
})
|
||||
|
||||
test('cert paths + dns zone set → parsed, key paths DERIVED from cert paths', () => {
|
||||
const env = loadEnv({
|
||||
...base(),
|
||||
NATIVE_FRP_CLIENT_CA_CERT_PATH: FRP_CERT,
|
||||
NATIVE_DEVICE_CA_CERT_PATH: DEV_CERT,
|
||||
NATIVE_DNS_ZONE: ZONE,
|
||||
})
|
||||
expect(env.nativeCa).toEqual({
|
||||
frpClientCaCertPath: FRP_CERT,
|
||||
frpClientCaKeyPath: '/etc/cp/frp-client-ca.key.pem',
|
||||
deviceCaCertPath: DEV_CERT,
|
||||
deviceCaKeyPath: '/etc/cp/device-ca.key.pem',
|
||||
dnsZone: ZONE,
|
||||
})
|
||||
})
|
||||
|
||||
test('explicit key paths are used verbatim (not derived)', () => {
|
||||
const env = loadEnv({
|
||||
...base(),
|
||||
NATIVE_FRP_CLIENT_CA_CERT_PATH: FRP_CERT,
|
||||
NATIVE_FRP_CLIENT_CA_KEY_PATH: '/keys/frp.pem',
|
||||
NATIVE_DEVICE_CA_CERT_PATH: DEV_CERT,
|
||||
NATIVE_DEVICE_CA_KEY_PATH: '/keys/dev.pem',
|
||||
NATIVE_DNS_ZONE: ZONE,
|
||||
})
|
||||
expect(env.nativeCa?.frpClientCaKeyPath).toBe('/keys/frp.pem')
|
||||
expect(env.nativeCa?.deviceCaKeyPath).toBe('/keys/dev.pem')
|
||||
})
|
||||
|
||||
test('partial set — only frp cert path → fail-closed listing the missing keys', () => {
|
||||
expect(() => loadEnv({ ...base(), NATIVE_FRP_CLIENT_CA_CERT_PATH: FRP_CERT })).toThrow(
|
||||
/NATIVE_DEVICE_CA_CERT_PATH|NATIVE_DNS_ZONE/,
|
||||
)
|
||||
})
|
||||
|
||||
test('partial set — cert paths without a dns zone → fail-closed', () => {
|
||||
expect(() =>
|
||||
loadEnv({ ...base(), NATIVE_FRP_CLIENT_CA_CERT_PATH: FRP_CERT, NATIVE_DEVICE_CA_CERT_PATH: DEV_CERT }),
|
||||
).toThrow(/NATIVE_DNS_ZONE/)
|
||||
})
|
||||
|
||||
test('partial set — a key path supplied WITHOUT its cert path → fail-closed', () => {
|
||||
expect(() => loadEnv({ ...base(), NATIVE_FRP_CLIENT_CA_KEY_PATH: '/keys/frp.pem' })).toThrow(
|
||||
/NATIVE_FRP_CLIENT_CA_CERT_PATH|NATIVE_DEVICE_CA_CERT_PATH|NATIVE_DNS_ZONE/,
|
||||
)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user