@google-cloud/cloud-sql-connector
Version:
A JavaScript library for connecting securely to your Cloud SQL instances
54 lines • 2.76 kB
TypeScript
import tls from 'node:tls';
import { InstanceConnectionInfo } from './instance-connection-info';
import { SslCert } from './ssl-cert';
interface SocketOptions {
ephemeralCert: SslCert;
host: string;
port: number;
instanceInfo: InstanceConnectionInfo;
privateKey: string;
serverCaCert: SslCert;
instanceDnsName: string;
serverName: string;
}
/**
* validateCertificate implements custom TLS verification logic to gracefully and securely
* handle deviations from standard TLS hostname verification in existing Cloud SQL instance server
* certificates.
*
*
* @param instanceInfo the instance connection name
* @param instanceDnsName the instance's DNS name according to instance metadata
* @param serverName the dns name from the connector configuration.
*
* This is run AFTER the NodeJS TLS library has validated the CA for the
* server certificate.
*
* <p>This is the verification algorithm:
*
* <ol>
* <li>Verify the server cert CA, using the CA certs from the instance metadata. Reject the
* certificate if the CA is invalid.
* <li>Check that the server cert contains a SubjectAlternativeName matching the DNS name in the
* connector configuration OR the DNS Name from the instance metadata
* <li>If the SubjectAlternativeName does not match, and if the server cert Subject.CN field is
* not empty, check that the Subject.CN field contains the instance name. Reject the
* certificate if both the #2 SAN check and #3 CN checks fail.
* </ol>
*
* <p>To summarize the deviations from standard TLS hostname verification:
*
* <p>Historically, Cloud SQL creates server certificates with the instance name in the Subject.CN
* field in the format "my-project:my-instance". The connector is expected to check that the
* instance name that the connector was configured to dial matches the server certificate Subject.CN
* field. Thus, the Subject.CN field for most Cloud SQL instances does not contain a well-formed DNS
* Name. This breaks standard TLS hostname verification.
*
* <p>Also, there are times when the instance metadata reports that an instance has a DNS name, but
* that DNS name does not yet appear in the SAN records of the server certificate. The client should
* fall back to validating the hostname using the instance name in the Subject.CN field.
*/
export declare function validateCertificate(instanceInfo: InstanceConnectionInfo, instanceDnsName: string, serverName: string): (hostname: string, cert: tls.PeerCertificate) => Error | undefined;
export declare function getSocket({ ephemeralCert, host, port, instanceInfo, privateKey, serverCaCert, instanceDnsName, serverName, }: SocketOptions): tls.TLSSocket;
export {};
//# sourceMappingURL=socket.d.ts.map