Administrator
Published on 2025-10-27 / 2 Visits
0

如何在 acme4j 中加载已有的 ACME 账户

#AI

在 acme4j 中加载已有的 ACME 账户主要通过账户的位置 URL 和对应的密钥对实现,核心是通过 Login 类绑定账户信息。以下是具体操作步骤和示例代码:

前提条件

  1. 已保存账户的位置 URL(创建账户时通过 account.getLocation() 获取)。
  2. 已保存账户的密钥对(创建账户时生成,需持久化存储)。

加载账户的核心步骤

步骤 1:加载账户密钥对

从本地文件或其他存储中读取之前保存的账户密钥对(例如 PEM 格式文件):

import org.shredzone.acme4j.util.KeyPairUtils;
import java.io.FileReader;
import java.security.KeyPair;

// 从文件加载账户密钥对
KeyPair accountKeyPair;
try (FileReader fr = new FileReader("account-key.pem")) {
    accountKeyPair = KeyPairUtils.readKeyPair(fr);
}

步骤 2:创建会话(Session)

与 ACME 服务器建立连接(使用与创建账户时相同的 CA 地址):

import org.shredzone.acme4j.Session;

// ACME 服务器目录 URI(需与账户创建时一致,例如 Let's Encrypt 生产环境)
String caUri = "https://acme-v02.api.letsencrypt.org/directory";
Session session = new Session(caUri);

步骤 3:通过账户位置和密钥对登录

使用账户的位置 URL 和密钥对创建 Login 对象,绑定账户:

import org.shredzone.acme4j.Login;
import java.net.URL;

// 账户的位置 URL(从保存的地方读取,例如数据库或配置文件)
URL accountLocation = new URL("https://acme-v02.api.letsencrypt.org/acme/acct/12345678");

// 登录账户
Login login = new Login(accountLocation, accountKeyPair, session);

// 获取账户对象
Account account = login.getAccount();

步骤 4:验证加载结果

可通过获取账户信息(如联系人、状态)验证是否加载成功:

// 打印账户信息
System.out.println("账户位置: " + account.getLocation());
System.out.println("联系人: " + account.getContacts());
System.out.println("状态: " + account.getStatus());

特殊场景:未保存账户位置 URL 时的加载方式

如果未保存账户位置 URL,可通过密钥对重新查询账户(需确保密钥对已在 ACME 服务器注册):

import org.shredzone.acme4j.AccountBuilder;

// 使用已有的密钥对查询账户(不会创建新账户)
Login login = new AccountBuilder()
    .onlyExisting()  // 仅查询已存在的账户
    .useKeyPair(accountKeyPair)
    .createLogin(session);

Account account = login.getAccount();
System.out.println("找回的账户位置: " + account.getLocation());

注意事项

  1. 密钥安全:账户密钥对是访问账户的唯一凭证,需安全存储,避免泄露。
  2. CA 一致性:加载账户时使用的 CA 地址(caUri)必须与创建账户时一致,否则会提示账户不存在。
  3. 外部账户绑定(EAB):若 CA 要求 EAB(如 Actalis),加载时无需重复设置 EAB 信息,仅需使用正确的密钥对即可。

参考代码来源

  • 账户登录逻辑基于 Login 类的构造方法(new Login(accountLocation, keyPair, session))。
  • 未保存位置时的查询方式参考 AccountBuilder#onlyExisting() 方法(见 AccountBuilderTest 测试用例)。