You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

主机服务商如何重置Let's Encrypt证书流程,实现重复颁发测试?

Great question! Since you're using Greenlock with Node/Express to automate free Let's Encrypt certs for your hosting platform, here's a practical, step-by-step approach to fully reset a domain's certificate state—so you can repeat your issuance tests without needing an endless supply of test domains:

1. First, Understand Greenlock's Storage Model

Greenlock stores all certificate data (private keys, issued certs, ACME account associations, and challenge records) in a storage layer—by default, this is a local file system directory (./greenlock.d). If you're using a custom storage backend (like a database), you'll need to target that instead, but we'll cover both scenarios below.

2. Step-by-Step Reset Process

To fully reset a domain's certificate flow, you need to cover four key areas:

a. Clear Greenlock's Certificate Storage

This removes all traces of the domain's existing certificates and ACME state from Greenlock's storage.

  • For default file storage: Delete the domain-specific folder in ./greenlock.d/issued/.
  • For custom storage: Delete all records associated with the domain (certificates, private keys, ACME account links).

Even if you delete the storage, Let's Encrypt still has a record of the issued certificate. Revoking it helps avoid hitting rate limits (especially in production) and ensures a clean slate for testing.

c. Clean Up ACME Challenge Records

If you're using HTTP-01 challenges, Greenlock generates temporary files in ./public/.well-known/acme-challenge/—delete any files linked to your test domain. For DNS-01 challenges, ensure you remove any test DNS records you created.

d. Reset Greenlock's Runtime State

Restart or reinitialize your Greenlock instance in your Express app to ensure it picks up the empty storage state.

3. Code Examples for Automated Testing

Here's how to wrap these steps into reusable functions you can call in your test suite:

Example 1: Clear Default File Storage

const fs = require('fs').promises;
const path = require('path');

async function resetDomainFileStorage(domain) {
  const greenlockIssuedDir = path.join(__dirname, 'greenlock.d', 'issued');
  const domainDir = path.join(greenlockIssuedDir, domain);

  try {
    await fs.rm(domainDir, { recursive: true, force: true });
    console.log(`✅ Cleared storage for ${domain}`);
  } catch (err) {
    if (err.code !== 'ENOENT') {
      console.error(`❌ Failed to clear storage for ${domain}:`, err);
    } else {
      console.log(`ℹ️ No existing storage found for ${domain}`);
    }
  }
}

Example 2: Revoke a Certificate via Greenlock API

const Greenlock = require('greenlock');

async function revokeDomainCertificate(domain, greenlockConfig) {
  const greenlock = Greenlock.create(greenlockConfig);

  // Check if a certificate exists for the domain
  const existingCerts = await greenlock.get({ domains: [domain] });
  if (!existingCerts || !existingCerts.pem) {
    console.log(`ℹ️ No certificate found for ${domain} to revoke`);
    return;
  }

  try {
    await greenlock.revoke({
      domains: [domain],
      reason: 'testing' // Valid reason per Let's Encrypt guidelines
    });
    console.log(`✅ Revoked certificate for ${domain}`);
  } catch (err) {
    console.error(`❌ Failed to revoke certificate for ${domain}:`, err);
  }
}

Example 3: Integrate into Your Test Suite (e.g., Mocha)

Add this to your test setup to reset the domain before each test run:

// Your Greenlock configuration (use STAGING for testing!)
const greenlockTestConfig = {
  packageRoot: __dirname,
  configDir: './greenlock.d',
  maintainerEmail: 'your-test-email@example.com',
  staging: true // Critical to avoid production rate limits!
};

const TEST_DOMAIN = 'test.your-platform.com'; // Your fixed test domain

beforeEach(async () => {
  // 1. Revoke existing cert (if any)
  await revokeDomainCertificate(TEST_DOMAIN, greenlockTestConfig);
  
  // 2. Clear storage
  await resetDomainFileStorage(TEST_DOMAIN);
  
  // 3. Reinitialize Greenlock to pick up the empty state
  global.greenlock = Greenlock.create(greenlockTestConfig);
});
4. Critical Best Practices
  • Always Use Let's Encrypt Staging: The staging environment has much more lenient rate limits (50 certs per domain per week) compared to production (5 per week). Set staging: true in your Greenlock config for testing.
  • Avoid Over-Testing: Even with staging, don't run tests non-stop—rate limits still apply.
  • Custom Storage Adjustments: If you're using a database for Greenlock storage, modify the resetDomainFileStorage function to delete domain-specific records instead of files.
  • DNS Challenge Cleanup: If using DNS-01 challenges, automate the removal of TXT records for your test domain (e.g., via your DNS provider's API) to ensure a clean reset.

内容的提问来源于stack exchange,提问作者Koder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:25:08