diff --git a/src/main/java/com/cisd/tms/modules/openapi/service/controller/OpenApiController.java b/src/main/java/com/cisd/tms/modules/openapi/service/controller/OpenApiController.java index 5bd047e..17c50c8 100644 --- a/src/main/java/com/cisd/tms/modules/openapi/service/controller/OpenApiController.java +++ b/src/main/java/com/cisd/tms/modules/openapi/service/controller/OpenApiController.java @@ -1,10 +1,15 @@ package com.cisd.tms.modules.openapi.service.controller; import com.cisd.tms.common.api.ApiResponse; +import com.cisd.tms.modules.cert.dto.ImportCertificateResponse; +import com.cisd.tms.modules.cert.service.CertificateService; +import com.cisd.tms.modules.openapi.service.dto.DettachedSignRequest; +import com.cisd.tms.modules.openapi.service.dto.DettachedVerifyRequest; import com.cisd.tms.modules.openapi.service.dto.RawSignRequest; import com.cisd.tms.modules.openapi.service.dto.RawSignResponse; import com.cisd.tms.modules.openapi.service.dto.RawVerifyRequest; import com.cisd.tms.modules.openapi.service.dto.RawVerifyResponse; +import com.cisd.tms.modules.openapi.service.dto.UploadCertRequest; import com.cisd.tms.modules.openapi.service.impl.OpenApiService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -28,12 +33,13 @@ public class OpenApiController { private static final Logger log = LoggerFactory.getLogger(OpenApiController.class); private final OpenApiService openApiService; + private final CertificateService certificateService; @PostMapping("/rawSign") @Operation(summary = "裸签名", description = "基于 SM3 SM2 算法进行签名,返回 Base64 编码的签名值") public ApiResponse rawSign(@Valid @RequestBody RawSignRequest request) { - log.info("收到裸签名请求, DN: {}", request.getDn()); + log.info("收到裸签名请求, DN: {}, sessionId: {}", request.getDn(), request.getSessionId()); // 入参检查 if (request.getOrigBytes() == null || request.getOrigBytes().trim().isEmpty()) { @@ -67,7 +73,7 @@ public class OpenApiController { @PostMapping("/rawVerify") @Operation(summary = "裸验签", description = "基于 SM3 SM2 算法进行验签,验证签名的有效性") public ApiResponse rawVerify(@Valid @RequestBody RawVerifyRequest request) { - log.info("收到裸验签请求, DN: {}", request.getDn()); + log.info("收到裸验签请求, DN: {}, sessionId: {}", request.getDn(), request.getSessionId()); // 入参检查 if (request.getOrigBytes() == null || request.getOrigBytes().trim().isEmpty()) { @@ -108,7 +114,72 @@ public class OpenApiController { } } + @PostMapping("/dettachedSign") + @Operation(summary = "分离签名", description = "基于 SM3 SM2 算法进行分离签名,返回 Base64 编码的签名值") + public ApiResponse dettachedSign(@Valid @RequestBody DettachedSignRequest request) { + log.info("收到分离签名请求, DN: {}, sessionId: {}", request.getDn(), request.getSessionId()); + RawSignRequest rawSignRequest = new RawSignRequest(); + rawSignRequest.setDn(request.getDn()); + rawSignRequest.setOrigBytes(request.getOrigBytes()); + rawSignRequest.setSessionId(request.getSessionId()); + return rawSign(rawSignRequest); + } + + @PostMapping("/dettachedVerify") + @Operation(summary = "分离验签", description = "基于 SM3 SM2 算法进行分离验签,验证签名的有效性") + public ApiResponse dettachedVerify(@Valid @RequestBody DettachedVerifyRequest request) { + log.info("收到分离验签请求, DN: {}, sessionId: {}", request.getDn(), request.getSessionId()); + + RawVerifyRequest rawVerifyRequest = new RawVerifyRequest(); + rawVerifyRequest.setDn(request.getDn()); + rawVerifyRequest.setOrigBytes(request.getOrigBytes()); + rawVerifyRequest.setSignature(request.getSignature()); + rawVerifyRequest.setSessionId(request.getSessionId()); + + return rawVerify(rawVerifyRequest); + } + + @PostMapping("/dettachedVerifySimple") + @Operation(summary = "分离验签(简化版)", description = "基于 SM3 SM2 算法进行分离验签,验证签名的有效性(简化版)") + public ApiResponse dettachedVerifySimple(@Valid @RequestBody DettachedVerifyRequest request) { + log.info("收到分离验签(简化版)请求, DN: {}, sessionId: {}", request.getDn(), request.getSessionId()); + + RawVerifyRequest rawVerifyRequest = new RawVerifyRequest(); + rawVerifyRequest.setDn(request.getDn()); + rawVerifyRequest.setOrigBytes(request.getOrigBytes()); + rawVerifyRequest.setSignature(request.getSignature()); + rawVerifyRequest.setSessionId(request.getSessionId()); + + return rawVerify(rawVerifyRequest); + } + + @PostMapping("/uploadCert") + @Operation(summary = "上传证书", description = "上传并导入证书") + public ApiResponse uploadCert(@Valid @RequestBody UploadCertRequest request) { + log.info("收到上传证书请求, sessionId: {}", request.getSessionId()); + + if (request.getCertData() == null || request.getCertData().trim().isEmpty()) { + log.error("上传证书请求失败:证书数据为空"); + return ApiResponse.fail(400, "证书数据不能为空", null); + } + + try { + byte[] certBytes = Base64.getDecoder().decode(request.getCertData()); + log.info("证书数据长度: {} bytes", certBytes.length); + + ImportCertificateResponse response = certificateService.importCertificate(certBytes); + + log.info("证书上传成功, certId: {}, subjectDn: {}", response.getCertId(), response.getSubjectDn()); + return ApiResponse.success(response); + } catch (IllegalArgumentException e) { + log.error("上传证书请求参数错误: {}", e.getMessage()); + return ApiResponse.fail(400, e.getMessage(), null); + } catch (Exception e) { + log.error("证书上传失败: {}", e.getMessage(), e); + return ApiResponse.fail(500, "证书上传失败: " + e.getMessage(), null); + } + } } diff --git a/src/main/java/com/cisd/tms/modules/openapi/service/dto/DettachedSignRequest.java b/src/main/java/com/cisd/tms/modules/openapi/service/dto/DettachedSignRequest.java new file mode 100644 index 0000000..2206edc --- /dev/null +++ b/src/main/java/com/cisd/tms/modules/openapi/service/dto/DettachedSignRequest.java @@ -0,0 +1,20 @@ +package com.cisd.tms.modules.openapi.service.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +@Schema(description = "分离签名请求") +public class DettachedSignRequest { + @NotBlank(message = "证书DN不能为空") + @Schema(description = "证书DN", example = "CN=Initial Entity,OU=Initial OU,O=Initial Org,L=Beijing,ST=Beijing,C=CN") + private String dn; + + @NotBlank(message = "待签名原文不能为空") + @Schema(description = "待签名原文的Base64编码", example = "dGVzdCBtZXNzYWdl") + private String origBytes; + + @Schema(description = "会话ID", example = "session-12345") + private String sessionId; +} \ No newline at end of file diff --git a/src/main/java/com/cisd/tms/modules/openapi/service/dto/DettachedVerifyRequest.java b/src/main/java/com/cisd/tms/modules/openapi/service/dto/DettachedVerifyRequest.java new file mode 100644 index 0000000..c24c871 --- /dev/null +++ b/src/main/java/com/cisd/tms/modules/openapi/service/dto/DettachedVerifyRequest.java @@ -0,0 +1,11 @@ +package com.cisd.tms.modules.openapi.service.dto; + +import lombok.Data; + +@Data +public class DettachedVerifyRequest { + private String dn; + private String origBytes; + private String sessionId; + private String signature; +} \ No newline at end of file diff --git a/src/main/java/com/cisd/tms/modules/openapi/service/dto/UploadCertRequest.java b/src/main/java/com/cisd/tms/modules/openapi/service/dto/UploadCertRequest.java new file mode 100644 index 0000000..fe7bc6f --- /dev/null +++ b/src/main/java/com/cisd/tms/modules/openapi/service/dto/UploadCertRequest.java @@ -0,0 +1,16 @@ +package com.cisd.tms.modules.openapi.service.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +@Schema(description = "上传证书请求") +public class UploadCertRequest { + @NotBlank(message = "证书数据不能为空") + @Schema(description = "证书文件的Base64编码", example = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...") + private String certData; + + @Schema(description = "会话ID", example = "session-12345") + private String sessionId; +} \ No newline at end of file