在 acme4j 中加载已有的 ACME 账户主要通过账户的位置 URL 和对应的密钥对实现,核心是通过 Login 类绑定账户信息。以下是具体操作步骤和示例代码:
前提条件
- 已保存账户的位置 URL(创建账户时通过
account.getLocation()获取)。 - 已保存账户的密钥对(创建账户时生成,需持久化存储)。
加载账户的核心步骤
步骤 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());
注意事项
- 密钥安全:账户密钥对是访问账户的唯一凭证,需安全存储,避免泄露。
- CA 一致性:加载账户时使用的 CA 地址(
caUri)必须与创建账户时一致,否则会提示账户不存在。 - 外部账户绑定(EAB):若 CA 要求 EAB(如 Actalis),加载时无需重复设置 EAB 信息,仅需使用正确的密钥对即可。
参考代码来源
- 账户登录逻辑基于
Login类的构造方法(new Login(accountLocation, keyPair, session))。 - 未保存位置时的查询方式参考
AccountBuilder#onlyExisting()方法(见AccountBuilderTest测试用例)。