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

Android设备证书吊销与续期处理技术咨询(NDES/EJBCA场景)

证书续期与吊销方案(Android + NDES/EJBCA/DigiCert SCEP)

一、证书续期

1. 重新SCEP注册的合理性

重新发起SCEP注册流程获取新证书是可行且通用的方案,尤其适配NDES和DigiCert SCEP的特性:

  • NDES本身无专门的SCEP续期接口,设备重新提交CSR、完成身份验证后即可获取新证书,旧证书会在过期后自动失效。
  • DigiCert SCEP支持重新注册续期,只要设备身份验证通过(原有证书验证或预共享密钥),就能签发新证书。

2. EJBCA的标准续期方案

EJBCA支持SCEP规范中的Renew操作,比重新注册更高效:

  • 无需重新生成密钥对,直接复用原有证书的公钥生成CSR。
  • 调用jscep的Client.renew()方法(需确保jscep版本支持该操作),传入原有证书、新CSR和身份验证凭证。

Android续期示例代码片段(EJBCA续期)

// 复用已初始化的jscep Client
Client client = new Client(...);
// 从KeyStore加载原有证书
X509Certificate oldCert = ...;
// 复用原有密钥对生成CSR
KeyPair keyPair = ...;
CertificationRequest csr = new CertificationRequestBuilder()
    .withPublicKey(keyPair.getPublic())
    .withSubjectDN(oldCert.getSubjectX500Principal())
    .sign(keyPair.getPrivate(), "SHA256withRSA");
// 执行续期操作
EnrollmentResponse response = client.renew(csr, oldCert, client.getCaCertificate());
if (response.isSuccess()) {
    X509Certificate newCert = response.getCertStore().getCertificates(null).iterator().next();
    // 将新证书存入KeyStore
}

二、证书吊销

1. 通用思路:HTTP请求实现

jscep未内置吊销功能,需通过CA提供的HTTP/REST接口发起请求,不同服务器接口格式存在差异:

2. EJBCA吊销接口实现

EJBCA提供REST API支持吊销,Android上可通过OkHttp发起POST请求:

  • 请求地址:https://<EJBCA_HOST>/ejbca/rest/v1/certificates/revoke
  • 请求头:Content-Type: application/json,携带身份验证凭证(API密钥或客户端证书)
  • 请求体格式:
{
  "certificateSerialNumber": "<证书十六进制序列号>",
  "reason": "KEY_COMPROMISE", // 可选值:REASON_UNSPECIFIED、KEY_COMPROMISE等
  "username": "<证书关联用户名>"
}

Android EJBCA吊销示例代码

OkHttpClient client = new OkHttpClient();
String jsonBody = "{\"certificateSerialNumber\": \"123ABC\", \"reason\": \"KEY_COMPROMISE\", \"username\": \"android_device\"}";
RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json; charset=utf-8"));
Request request = new Request.Builder()
    .url("https://ejbca.example.com/ejbca/rest/v1/certificates/revoke")
    .addHeader("Authorization", "Bearer <API_TOKEN>") // 或使用客户端证书验证
    .post(body)
    .build();
try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        // 吊销成功
    } else {
        // 处理错误响应
    }
} catch (IOException e) {
    e.printStackTrace();
}

3. NDES吊销接口实现

NDES依赖AD CS服务,需通过AD CS的Web接口发起吊销,Android设备可通过HTTP POST请求实现:

  • 请求地址:https://<NDES_HOST>/certsrv/certrqxt.dll
  • 请求参数(表单格式):
    • Mode: Revoke
    • SerialNumber: 证书十六进制序列号
    • Reason: 吊销原因代码(0=未指定,1=密钥泄露等)
    • 身份验证:需通过NTLM或客户端证书验证

Android NDES吊销示例代码(OkHttp + NTLM验证)

// 配置NTLM验证(需引入okhttp-ntlm依赖)
NtlmAuthenticator authenticator = new NtlmAuthenticator("domain", "username", "password");
OkHttpClient client = new OkHttpClient.Builder()
    .authenticator(authenticator)
    .build();
RequestBody formBody = new FormBody.Builder()
    .add("Mode", "Revoke")
    .add("SerialNumber", "123ABC")
    .add("Reason", "1")
    .build();
Request request = new Request.Builder()
    .url("https://ndes.example.com/certsrv/certrqxt.dll")
    .post(formBody)
    .build();
try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        // 吊销成功
    }
} catch (IOException e) {
    e.printStackTrace();
}

三、关键注意事项

  • 身份验证:续期和吊销操作需严格验证身份,优先使用客户端证书验证,避免弱凭证。
  • 证书存储:Android上需将证书存入系统KeyStore或应用私有KeyStore,保障密钥安全。
  • 服务器兼容性:不同CA服务器的接口细节可能存在差异,需参考对应官方文档调整参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:27:27