97 lines
3.1 KiB
TypeScript
97 lines
3.1 KiB
TypeScript
/**
|
|
* Secure SMTP Server Utility Functions
|
|
* Provides helper functions for creating and managing secure TLS server
|
|
*/
|
|
|
|
import * as plugins from '../../../plugins.js';
|
|
import {
|
|
loadCertificatesFromString,
|
|
generateSelfSignedCertificates,
|
|
createTlsOptions,
|
|
type ICertificateData
|
|
} from './certificate-utils.js';
|
|
import { SmtpLogger } from './utils/logging.js';
|
|
|
|
/**
|
|
* Create a secure TLS server for direct TLS connections
|
|
* @param options - TLS certificate options
|
|
* @returns A configured TLS server or undefined if TLS is not available
|
|
*/
|
|
export function createSecureTlsServer(options: {
|
|
key: string;
|
|
cert: string;
|
|
ca?: string;
|
|
}): plugins.tls.Server | undefined {
|
|
try {
|
|
// Log the creation attempt
|
|
SmtpLogger.info('Creating secure TLS server for direct connections');
|
|
|
|
// Load certificates from strings
|
|
let certificates: ICertificateData;
|
|
try {
|
|
certificates = loadCertificatesFromString({
|
|
key: options.key,
|
|
cert: options.cert,
|
|
ca: options.ca
|
|
});
|
|
|
|
SmtpLogger.info('Successfully loaded TLS certificates for secure server');
|
|
} catch (certificateError) {
|
|
SmtpLogger.warn(`Failed to load certificates, using self-signed: ${certificateError instanceof Error ? certificateError.message : String(certificateError)}`);
|
|
certificates = generateSelfSignedCertificates();
|
|
}
|
|
|
|
// Create server-side TLS options
|
|
const tlsOptions = createTlsOptions(certificates, true);
|
|
|
|
// Log details for debugging
|
|
SmtpLogger.debug('Creating secure server with options', {
|
|
certificates: {
|
|
keyLength: certificates.key.length,
|
|
certLength: certificates.cert.length,
|
|
caLength: certificates.ca ? certificates.ca.length : 0
|
|
},
|
|
tlsOptions: {
|
|
minVersion: tlsOptions.minVersion,
|
|
maxVersion: tlsOptions.maxVersion,
|
|
ciphers: tlsOptions.ciphers?.substring(0, 50) + '...' // Truncate long cipher list
|
|
}
|
|
});
|
|
|
|
// Create the TLS server
|
|
const server = new plugins.tls.Server(tlsOptions);
|
|
|
|
// Set up error handlers
|
|
server.on('error', (err) => {
|
|
SmtpLogger.error(`Secure server error: ${err.message}`, {
|
|
component: 'secure-server',
|
|
error: err,
|
|
stack: err.stack
|
|
});
|
|
});
|
|
|
|
// Log secure connections
|
|
server.on('secureConnection', (socket) => {
|
|
const protocol = socket.getProtocol();
|
|
const cipher = socket.getCipher();
|
|
|
|
SmtpLogger.info('New direct TLS connection established', {
|
|
component: 'secure-server',
|
|
remoteAddress: socket.remoteAddress,
|
|
remotePort: socket.remotePort,
|
|
protocol: protocol || 'unknown',
|
|
cipher: cipher?.name || 'unknown'
|
|
});
|
|
});
|
|
|
|
return server;
|
|
} catch (error) {
|
|
SmtpLogger.error(`Failed to create secure TLS server: ${error instanceof Error ? error.message : String(error)}`, {
|
|
component: 'secure-server',
|
|
error: error instanceof Error ? error : new Error(String(error)),
|
|
stack: error instanceof Error ? error.stack : 'No stack trace available'
|
|
});
|
|
|
|
return undefined;
|
|
}
|
|
} |