88} from 'read-tls-client-hello' ;
99
1010import { createHttp1Handler , createHttp2Handler } from './http-handler.js' ;
11- import { createTlsHandler , CertMode } from './tls-handler.js' ;
11+ import { createTlsHandler } from './tls-handler.js' ;
12+ import { CertOptions } from './tls-certificates/cert-definitions.js' ;
1213import { ConnectionProcessor } from './process-connection.js' ;
1314
1415import { AcmeCA , AcmeProvider } from './tls-certificates/acme.js' ;
@@ -60,8 +61,8 @@ async function generateTlsConfig(options: ServerOptions) {
6061 await certCache . loadCache ( ) ;
6162 }
6263
63- const ca = await LocalCA . create ( caCert ) ;
64- const defaultCert = await ca . generateCertificate ( rootDomain ) ;
64+ const localCA = await LocalCA . create ( caCert ) ;
65+ const defaultCert = await localCA . generateCertificate ( rootDomain , { } ) ;
6566
6667 if ( ! options . acmeProvider ) {
6768 console . log ( 'Using self signed certificates' ) ;
@@ -70,12 +71,13 @@ async function generateTlsConfig(options: ServerOptions) {
7071 key : defaultCert . key ,
7172 cert : defaultCert . cert ,
7273 ca : caCert . cert ,
73- localCA : ca ,
74- generateCertificate : async ( domain : string , mode ?: CertMode ) => {
75- if ( mode === 'self-signed' ) return await ca . generateSelfSignedCertificate ( domain ) ;
76- if ( mode === 'expired' ) return await ca . generateExpiredCertificate ( domain ) ;
77- if ( mode === 'revoked' ) return await ca . generateRevokedCertificate ( domain ) ;
78- return await ca . generateCertificate ( domain ) ;
74+ localCA,
75+ generateCertificate : async ( domain : string , options : CertOptions ) => {
76+ if ( options . requiredType === 'acme' ) {
77+ throw new Error ( `Can't generate cert for ${ domain } without ACME` ) ;
78+ }
79+
80+ return await localCA . generateCertificate ( domain , options ) ;
7981 } ,
8082 acmeChallenge : ( ) => undefined // Not supported
8183 } ;
@@ -94,40 +96,30 @@ async function generateTlsConfig(options: ServerOptions) {
9496 }
9597
9698 const acmeCA = new AcmeCA ( certCache ! , options . acmeProvider , options . acmeAccountKey ) ;
97- acmeCA . tryGetCertificateSync ( rootDomain ) ; // Preload the root domain every time
99+ acmeCA . tryGetCertificateSync ( rootDomain , { } ) ; // Preload the root domain every time
98100
99101 return {
100102 rootDomain,
101103 proactiveCertDomains : options . proactiveCertDomains ,
102104 key : defaultCert . key ,
103105 cert : defaultCert . cert ,
104106 ca : caCert . cert ,
105- localCA : ca ,
106- generateCertificate : async ( domain : string , mode ?: CertMode ) => {
107- if ( mode === 'self-signed' ) return await ca . generateSelfSignedCertificate ( domain ) ;
108-
109- if ( mode === 'expired' ) {
110- // Try to get an actually-expired ACME cert; fall back to LocalCA if not expired yet
111- const expiredAcmeCert = acmeCA . tryGetExpiredCertificateSync ( domain ) ;
112- if ( expiredAcmeCert ) return expiredAcmeCert ;
113- return await ca . generateExpiredCertificate ( domain ) ;
107+ localCA,
108+ generateCertificate : async ( domain : string , options : CertOptions ) => {
109+ if ( options . requiredType === 'local' ) {
110+ return await localCA . generateCertificate ( domain , options ) ;
114111 }
115112
116- if ( mode === 'revoked' ) {
117- // Try to get a revoked ACME cert; fall back to LocalCA revoked cert
118- const revokedAcmeCert = acmeCA . tryGetRevokedCertificateSync ( domain ) ;
119- if ( revokedAcmeCert ) return revokedAcmeCert ;
120- return await ca . generateRevokedCertificate ( domain ) ;
121- }
113+ const cert = acmeCA . tryGetCertificateSync ( domain , options ) ;
122114
123- if ( domain === rootDomain || domain . endsWith ( '.' + rootDomain ) ) {
124- const cert = acmeCA . tryGetCertificateSync ( domain ) ;
125- if ( cert ) return cert ;
115+ if ( cert ) {
116+ return cert ;
117+ } else {
118+ if ( options . requiredType === 'acme' ) {
119+ return await acmeCA . waitForCertificate ( domain , options ) ;
120+ }
121+ return await localCA . generateCertificate ( domain , options ) ;
126122 }
127-
128- // If you use some other domain or the cert isn't immediately available, we fall back
129- // to self-signed certs for now:
130- return await ca . generateCertificate ( domain ) ;
131123 } ,
132124 acmeChallenge : ( token : string ) => acmeCA . getChallengeResponse ( token )
133125 }
0 commit comments