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

如何在Spring REST Docs生成的Curl片段中添加P12证书

解决Spring REST Docs生成带P12证书的Curl片段问题

Spring REST Docs默认的Curl生成器不会识别MockMVC中配置的X509证书信息,因此需要自定义请求转换器来添加--cert-type和--cert参数。

步骤1:自定义Curl请求转换器

创建继承自DefaultCurlRequestConverter的自定义转换器,在其中添加证书相关的Curl参数:

import org.springframework.restdocs.curl.DefaultCurlRequestConverter;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import java.util.List;

public class CustomCurlRequestConverter extends DefaultCurlRequestConverter {

    private final String certFile;
    private final String certPassword;

    public CustomCurlRequestConverter(String certFile, String certPassword) {
        this.certFile = certFile;
        this.certPassword = certPassword;
    }

    @Override
    protected List<String> appendRequest(List<String> curlCommand, MockHttpServletRequestBuilder request) {
        // 先执行默认的Curl参数生成逻辑
        curlCommand = super.appendRequest(curlCommand, request);
        // 添加P12证书相关参数
        curlCommand.add("--cert-type P12");
        curlCommand.add("--cert " + certFile + ":" + certPassword);
        return curlCommand;
    }
}

步骤2:配置RestDocumentation使用自定义转换器

在测试类的setUp方法中,修改documentationConfiguration的配置,替换默认的Curl请求转换器:

@BeforeEach
public void setUp(WebApplicationContext webApplicationContext,
                  RestDocumentationContextProvider restDocumentation) throws KeyStoreException, NoSuchAlgorithmException, 
                                                                    CertificateException, IOException {

    this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
                                  // 配置自定义Curl转换器
                                  .apply(documentationConfiguration(restDocumentation)
                                          .curlRequestConverter(new CustomCurlRequestConverter("localhost.p12", "password")))
                                  .addFilters(sessionRepositoryFilter)
                                  .apply(springSecurity())
                                  .build();

    certificate = ControllerUtil.getCertificate();
}

可选:按需添加证书参数(灵活场景)

如果只有部分测试需要生成带证书的Curl片段,可以给请求添加标记属性,在转换器中判断后再添加参数:

  1. 在测试请求中添加标记:
mockMvc.perform(post("/login")
        .contentType(MediaType.APPLICATION_FORM_URLENCODED)
        .with(x509(certificate))
        .requestAttr("useX509Cert", true) // 添加标记属性
        .param("username", "username")
        .param("password", "password")
)
  1. 修改转换器的判断逻辑:
@Override
protected List<String> appendRequest(List<String> curlCommand, MockHttpServletRequestBuilder request) {
    curlCommand = super.appendRequest(curlCommand, request);
    // 仅当请求标记了使用X509证书时才添加参数
    Boolean useCert = (Boolean) request.getRequestAttr("useX509Cert");
    if (useCert != null && useCert) {
        curlCommand.add("--cert-type P12");
        curlCommand.add("--cert " + certFile + ":" + certPassword);
    }
    return curlCommand;
}

完成以上配置后,生成的Curl片段就会包含预期的证书参数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:40:26