update
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -48,3 +48,5 @@ config.local.json
|
|||||||
# Logs
|
# Logs
|
||||||
logs/
|
logs/
|
||||||
*.log
|
*.log
|
||||||
|
|
||||||
|
.playwright-mcp
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 24 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB |
@@ -224,6 +224,13 @@ export class OneboxHttpServer {
|
|||||||
} else if (path.match(/^\/api\/ssl\/[^/]+\/renew$/) && method === 'POST') {
|
} else if (path.match(/^\/api\/ssl\/[^/]+\/renew$/) && method === 'POST') {
|
||||||
const domain = path.split('/')[3];
|
const domain = path.split('/')[3];
|
||||||
return await this.handleRenewCertificateRequest(domain);
|
return await this.handleRenewCertificateRequest(domain);
|
||||||
|
} else if (path === '/api/domains' && method === 'GET') {
|
||||||
|
return await this.handleGetDomainsRequest();
|
||||||
|
} else if (path === '/api/domains/sync' && method === 'POST') {
|
||||||
|
return await this.handleSyncDomainsRequest();
|
||||||
|
} else if (path.match(/^\/api\/domains\/[^/]+$/) && method === 'GET') {
|
||||||
|
const domainName = path.split('/').pop()!;
|
||||||
|
return await this.handleGetDomainDetailRequest(domainName);
|
||||||
} else {
|
} else {
|
||||||
return this.jsonResponse({ success: false, error: 'Not found' }, 404);
|
return this.jsonResponse({ success: false, error: 'Not found' }, 404);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,52 @@ export class OneboxSslManager {
|
|||||||
return this.smartacme !== null && this.acmeEmail !== null;
|
return this.smartacme !== null && this.acmeEmail !== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Acquire certificate and return certificate data (for CertRequirementManager)
|
||||||
|
* Returns certificate paths and expiry information
|
||||||
|
*/
|
||||||
|
async acquireCertificate(
|
||||||
|
domain: string,
|
||||||
|
includeWildcard = false
|
||||||
|
): Promise<{
|
||||||
|
certPath: string;
|
||||||
|
keyPath: string;
|
||||||
|
fullChainPath: string;
|
||||||
|
expiryDate: number;
|
||||||
|
issuer: string;
|
||||||
|
}> {
|
||||||
|
try {
|
||||||
|
if (!this.isConfigured()) {
|
||||||
|
throw new Error('SSL manager not configured');
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.info(`Acquiring SSL certificate for ${domain} via SmartACME DNS-01...`);
|
||||||
|
|
||||||
|
// Use SmartACME to obtain certificate via DNS-01 challenge
|
||||||
|
const cert = await this.smartacme!.getCertificateForDomain(domain, {
|
||||||
|
includeWildcard,
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.success(`SSL certificate obtained for ${domain}`);
|
||||||
|
logger.info(`Certificate valid until: ${new Date(cert.validUntil).toISOString()}`);
|
||||||
|
|
||||||
|
// Reload certificates in reverse proxy
|
||||||
|
await this.oneboxRef.reverseProxy.reloadCertificates();
|
||||||
|
|
||||||
|
// Return certificate data
|
||||||
|
return {
|
||||||
|
certPath: cert.certFilePath,
|
||||||
|
keyPath: cert.keyFilePath,
|
||||||
|
fullChainPath: cert.chainFilePath || cert.certFilePath,
|
||||||
|
expiryDate: cert.validUntil,
|
||||||
|
issuer: cert.issuer || 'Let\'s Encrypt',
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(`Failed to acquire certificate for ${domain}: ${error.message}`);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtain SSL certificate for a domain using SmartACME
|
* Obtain SSL certificate for a domain using SmartACME
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user