如何在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片段,可以给请求添加标记属性,在转换器中判断后再添加参数:
- 在测试请求中添加标记:
mockMvc.perform(post("/login") .contentType(MediaType.APPLICATION_FORM_URLENCODED) .with(x509(certificate)) .requestAttr("useX509Cert", true) // 添加标记属性 .param("username", "username") .param("password", "password") )
- 修改转换器的判断逻辑:
@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
相关产品推荐
相关产品推荐

