From 045da2a5b5311b16b7ba802d16e1a0b1e76e171e Mon Sep 17 00:00:00 2001 From: cheney Date: Wed, 20 May 2026 15:26:14 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=20mac?= =?UTF-8?q?=20=E6=A0=A1=E9=AA=8C=E4=B8=BA=E7=9C=9F=E5=AE=9E=E6=80=A7?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=EF=BC=8C=E5=81=9A=E7=AD=BE=E5=90=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/CommonMetaObjectHandler.java | 20 +++-- .../tms/modules/cert/entity/KeyEntity.java | 5 +- ...acEntity.java => ImportantDataEntity.java} | 4 +- .../datamac/helper/Sm2EntitySigner.java | 50 +++++++++++ .../interceptor/MacValidationInterceptor.java | 84 +++++++++---------- .../log/entity/OperationAuditLogEntity.java | 4 +- .../db/migration/V1__tms_schema_full.sql | 29 ++++++- 7 files changed, 140 insertions(+), 56 deletions(-) rename src/main/java/com/cisd/tms/modules/datamac/entity/{DataMacEntity.java => ImportantDataEntity.java} (81%) create mode 100644 src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java diff --git a/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java b/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java index bb9f3e9..95e125f 100644 --- a/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java +++ b/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java @@ -3,15 +3,23 @@ package com.cisd.tms.infrastructure.persistence.mybatis; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import java.time.LocalDateTime; +import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; +import com.cisd.tms.modules.datamac.helper.Sm2EntitySigner; import com.cisd.tms.modules.datamac.helper.Sm3MacCalculator; +import lombok.RequiredArgsConstructor; import org.apache.ibatis.reflection.MetaObject; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; @Component @Primary +@RequiredArgsConstructor public class CommonMetaObjectHandler implements MetaObjectHandler { + private final JnaPcieCryptoService sdf; + // 密钥对的索引 + private final int KEYPAIR_INDEX = 1; + @Override public void insertFill(MetaObject metaObject) { if ( metaObject.hasSetter("createTime") ) { @@ -22,11 +30,11 @@ public class CommonMetaObjectHandler implements MetaObjectHandler { this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } - // 插入时,直接基于当前实体对象计算 MAC - if (metaObject.hasSetter("mac")) { + // 插入时,直接基于当前实体对象计算签名 + if (metaObject.hasSetter("signature")) { Object entity = metaObject.getOriginalObject(); - String mac = Sm3MacCalculator.calculateForEntity(entity); - this.strictInsertFill(metaObject, "mac", String.class, mac); + String signature = Sm2EntitySigner.sign(sdf, KEYPAIR_INDEX, entity); + this.strictInsertFill(metaObject, "signature", String.class, signature); } } @@ -38,8 +46,8 @@ public class CommonMetaObjectHandler implements MetaObjectHandler { // 插入时,直接基于当前实体对象计算 MAC if (metaObject.hasSetter("mac")) { Object entity = metaObject.getOriginalObject(); - String mac = Sm3MacCalculator.calculateForEntity(entity); - this.strictInsertFill(metaObject, "mac", String.class, mac); + String signature = Sm2EntitySigner.sign(sdf, KEYPAIR_INDEX, entity); + this.strictInsertFill(metaObject, "signature", String.class, signature); } } } diff --git a/src/main/java/com/cisd/tms/modules/cert/entity/KeyEntity.java b/src/main/java/com/cisd/tms/modules/cert/entity/KeyEntity.java index e5bf231..0456dd4 100644 --- a/src/main/java/com/cisd/tms/modules/cert/entity/KeyEntity.java +++ b/src/main/java/com/cisd/tms/modules/cert/entity/KeyEntity.java @@ -29,7 +29,8 @@ public class KeyEntity extends BaseEntity { private String signData; private String createBy; - // 标记此字段在插入和更新时都需要自动填充 + // 临时性添加。 + // 改进方案可以通过直接扩展 BaseEntity 实现。暂时没有全量需求,所以单独添加。 @TableField(fill = FieldFill.INSERT_UPDATE) - private String mac; + private String signature; } diff --git a/src/main/java/com/cisd/tms/modules/datamac/entity/DataMacEntity.java b/src/main/java/com/cisd/tms/modules/datamac/entity/ImportantDataEntity.java similarity index 81% rename from src/main/java/com/cisd/tms/modules/datamac/entity/DataMacEntity.java rename to src/main/java/com/cisd/tms/modules/datamac/entity/ImportantDataEntity.java index 9611ab5..df69b19 100644 --- a/src/main/java/com/cisd/tms/modules/datamac/entity/DataMacEntity.java +++ b/src/main/java/com/cisd/tms/modules/datamac/entity/ImportantDataEntity.java @@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; @Data -public class DataMacEntity { +public class ImportantDataEntity { // 标记此字段在插入和更新时都需要自动填充 @TableField(fill = FieldFill.INSERT_UPDATE) - private String mac; + private String signature; } \ No newline at end of file diff --git a/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java b/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java new file mode 100644 index 0000000..7087f40 --- /dev/null +++ b/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java @@ -0,0 +1,50 @@ +package com.cisd.tms.modules.datamac.helper; + +import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult; +import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; +import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; + +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Comparator; + +public class Sm2EntitySigner { + + private static final byte[] DEFAULT_SM2_USER_ID = "1234567812345678".getBytes(StandardCharsets.UTF_8); + + public static String sign(JnaPcieCryptoService sdf, int keyIdx, Object entity){ + // 1. 获取所有字段并按字段名排序,保证不同实体计算的顺序一致 + Field[] fields = entity.getClass().getDeclaredFields(); + Arrays.sort(fields, Comparator.comparing(Field::getName)); + + // 2. 构建待摘要的数据 + StringBuilder dataBuilder = new StringBuilder(); + for (Field field : fields) { + // 排除 signature 字段自身 + if ("signature".equals(field.getName())) { + continue; + } + try { + field.setAccessible(true); + Object value = field.get(entity); + dataBuilder.append(field.getName()).append("=") + .append(value != null ? value.toString() : "") + .append(";"); + } catch (IllegalAccessException e) { + // 适当的日志记录 + throw new RuntimeException("Failed to read field: " + field.getName(), e); + } + } + + UserKeySm2SignRequest request = new UserKeySm2SignRequest(); + request.setKeyIndex(keyIdx); + request.setData(dataBuilder.toString().getBytes(StandardCharsets.UTF_8)); + request.setUserId(DEFAULT_SM2_USER_ID); + + BackupDataResult result = sdf.userKeySignWithSm2Sm3(request); + + // Base64 格式返回 + return java.util.Base64.getEncoder().encodeToString(result.getData()); + } +} diff --git a/src/main/java/com/cisd/tms/modules/datamac/interceptor/MacValidationInterceptor.java b/src/main/java/com/cisd/tms/modules/datamac/interceptor/MacValidationInterceptor.java index 2fb25d9..6a8d6af 100644 --- a/src/main/java/com/cisd/tms/modules/datamac/interceptor/MacValidationInterceptor.java +++ b/src/main/java/com/cisd/tms/modules/datamac/interceptor/MacValidationInterceptor.java @@ -1,42 +1,42 @@ -package com.cisd.tms.modules.datamac.interceptor; - - -import com.cisd.tms.modules.datamac.entity.DataMacEntity; -import com.cisd.tms.modules.datamac.helper.Sm3MacCalculator; -import org.apache.ibatis.executor.resultset.ResultSetHandler; -import org.apache.ibatis.plugin.Interceptor; -import org.apache.ibatis.plugin.Intercepts; -import org.apache.ibatis.plugin.Invocation; -import org.apache.ibatis.plugin.Signature; -import org.springframework.stereotype.Component; - -import java.sql.Statement; -import java.util.List; - - -@Intercepts(@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})) -@Component -public class MacValidationInterceptor implements Interceptor { - - @Override - public Object intercept(Invocation invocation) throws Throwable { - Object result = invocation.proceed(); - if (result instanceof List) { - ((List) result).forEach(this::validateEntity); - } else { - validateEntity(result); - } - return result; - } - - private void validateEntity(Object obj) { - if (obj instanceof DataMacEntity) { - DataMacEntity entity = (DataMacEntity) obj; - String storedMac = entity.getMac(); - String calculatedMac = Sm3MacCalculator.calculateForEntity(entity); - if (!storedMac.equals(calculatedMac)) { - throw new RuntimeException("Data integrity validation failed. The data has been tampered with."); - } - } - } -} \ No newline at end of file +//package com.cisd.tms.modules.datamac.interceptor; +// +// +//import com.cisd.tms.modules.datamac.entity.ImportantDataEntity; +//import com.cisd.tms.modules.datamac.helper.Sm3MacCalculator; +//import org.apache.ibatis.executor.resultset.ResultSetHandler; +//import org.apache.ibatis.plugin.Interceptor; +//import org.apache.ibatis.plugin.Intercepts; +//import org.apache.ibatis.plugin.Invocation; +//import org.apache.ibatis.plugin.Signature; +//import org.springframework.stereotype.Component; +// +//import java.sql.Statement; +//import java.util.List; +// +// +//@Intercepts(@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})) +//@Component +//public class MacValidationInterceptor implements Interceptor { +// +// @Override +// public Object intercept(Invocation invocation) throws Throwable { +// Object result = invocation.proceed(); +// if (result instanceof List) { +// ((List) result).forEach(this::validateEntity); +// } else { +// validateEntity(result); +// } +// return result; +// } +// +// private void validateEntity(Object obj) { +// if (obj instanceof ImportantDataEntity) { +// ImportantDataEntity entity = (ImportantDataEntity) obj; +// String storedMac = entity.getMac(); +// String calculatedMac = Sm3MacCalculator.calculateForEntity(entity); +// if (!storedMac.equals(calculatedMac)) { +// throw new RuntimeException("Data integrity validation failed. The data has been tampered with."); +// } +// } +// } +//} \ No newline at end of file diff --git a/src/main/java/com/cisd/tms/modules/log/entity/OperationAuditLogEntity.java b/src/main/java/com/cisd/tms/modules/log/entity/OperationAuditLogEntity.java index 633cce5..617cbf6 100644 --- a/src/main/java/com/cisd/tms/modules/log/entity/OperationAuditLogEntity.java +++ b/src/main/java/com/cisd/tms/modules/log/entity/OperationAuditLogEntity.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.cisd.tms.modules.datamac.entity.DataMacEntity; +import com.cisd.tms.modules.datamac.entity.ImportantDataEntity; import com.cisd.tms.modules.log.enums.*; import lombok.Data; import lombok.experimental.Accessors; @@ -14,7 +14,7 @@ import java.time.LocalDateTime; @Data @Accessors(chain = true) @TableName("tms_operation_audit_log") -public class OperationAuditLogEntity extends DataMacEntity { +public class OperationAuditLogEntity extends ImportantDataEntity { @TableId(type = IdType.ASSIGN_ID) private Long id; private String logId; diff --git a/src/main/resources/db/migration/V1__tms_schema_full.sql b/src/main/resources/db/migration/V1__tms_schema_full.sql index cb8c691..0decc94 100644 --- a/src/main/resources/db/migration/V1__tms_schema_full.sql +++ b/src/main/resources/db/migration/V1__tms_schema_full.sql @@ -708,5 +708,30 @@ INSERT IGNORE INTO tms_master_key_activate ( ) VALUES (1, true, true); -ALTER TABLE TMS.tms_operation_audit_log ADD mac varchar(100) NULL COMMENT '完整性校验值'; -ALTER TABLE TMS.tms_key_entity ADD mac varchar(100) NULL COMMENT '完整性校验值'; +ALTER TABLE tms_access_whitelist ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_auth_audit_log ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_auth_challenge ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_auth_full_account ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_auth_session ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_backup_config ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_certificate ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_certificate_crl ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_certificate_crl_import_task ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_certificate_crl_revoked ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_device_node ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_device_software_version ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_file_record ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_init_task ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_init_task_step ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_key_entity ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_log_backup_record ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_master_key_activate ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_operation_audit_log ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_replay_nonce ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_resource_backup_task ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_resource_restore_task ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_role_account ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_role_ukey_binding ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_security_event ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_trusted_cert ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; +ALTER TABLE tms_upgrade_task ADD signature varchar(250) NULL COMMENT '数据真实性签名值'; From da8fbae4ebbfc859863e3cad748b8bf0a925aaaa Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 21 May 2026 10:39:27 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=85=A5=E5=BA=93=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=81=9A=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cisd/tms/TmsApplication.java | 12 ------- .../mybatis/CommonMetaObjectHandler.java | 20 +++++++----- .../pcie/service/JnaPcieCryptoService.java | 4 +++ .../datamac/helper/Sm2EntitySigner.java | 31 ++++++++++++++++++- .../openapi/service/impl/OpenApiService.java | 3 +- 5 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/cisd/tms/TmsApplication.java b/src/main/java/com/cisd/tms/TmsApplication.java index 9764663..7e74e63 100644 --- a/src/main/java/com/cisd/tms/TmsApplication.java +++ b/src/main/java/com/cisd/tms/TmsApplication.java @@ -1,25 +1,13 @@ package com.cisd.tms; import com.cisd.tms.common.crypto.config.ConfigCryptoCli; -import com.cisd.tms.modules.log.entity.OperationAuditLogEntity; -import com.cisd.tms.modules.log.enums.ActionType; -import com.cisd.tms.modules.log.enums.AuthLevel; -import com.cisd.tms.modules.log.enums.AuditStatus; -import com.cisd.tms.modules.log.enums.ModuleCode; -import com.cisd.tms.modules.log.enums.OperationResult; -import com.cisd.tms.modules.log.enums.OperatorRoleCode; -import com.cisd.tms.modules.log.repository.OperationAuditLogRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationPropertiesScan; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableScheduling; -import java.time.LocalDateTime; -import java.util.UUID; - @SpringBootApplication @ConfigurationPropertiesScan @EnableScheduling diff --git a/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java b/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java index 95e125f..d71ed86 100644 --- a/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java +++ b/src/main/java/com/cisd/tms/infrastructure/persistence/mybatis/CommonMetaObjectHandler.java @@ -1,22 +1,28 @@ package com.cisd.tms.infrastructure.persistence.mybatis; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import java.time.LocalDateTime; - import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; import com.cisd.tms.modules.datamac.helper.Sm2EntitySigner; -import com.cisd.tms.modules.datamac.helper.Sm3MacCalculator; -import lombok.RequiredArgsConstructor; import org.apache.ibatis.reflection.MetaObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; +import java.time.LocalDateTime; + @Component @Primary -@RequiredArgsConstructor public class CommonMetaObjectHandler implements MetaObjectHandler { + @Lazy + @Autowired private final JnaPcieCryptoService sdf; + + public CommonMetaObjectHandler(@Lazy JnaPcieCryptoService cryptoService) { + this.sdf = cryptoService; + } + // 密钥对的索引 private final int KEYPAIR_INDEX = 1; @@ -33,7 +39,7 @@ public class CommonMetaObjectHandler implements MetaObjectHandler { // 插入时,直接基于当前实体对象计算签名 if (metaObject.hasSetter("signature")) { Object entity = metaObject.getOriginalObject(); - String signature = Sm2EntitySigner.sign(sdf, KEYPAIR_INDEX, entity); + String signature = Sm2EntitySigner.signMayNull(sdf, KEYPAIR_INDEX, entity); this.strictInsertFill(metaObject, "signature", String.class, signature); } } @@ -46,7 +52,7 @@ public class CommonMetaObjectHandler implements MetaObjectHandler { // 插入时,直接基于当前实体对象计算 MAC if (metaObject.hasSetter("mac")) { Object entity = metaObject.getOriginalObject(); - String signature = Sm2EntitySigner.sign(sdf, KEYPAIR_INDEX, entity); + String signature = Sm2EntitySigner.signMayNull(sdf, KEYPAIR_INDEX, entity); this.strictInsertFill(metaObject, "signature", String.class, signature); } } diff --git a/src/main/java/com/cisd/tms/integration/crypto/pcie/service/JnaPcieCryptoService.java b/src/main/java/com/cisd/tms/integration/crypto/pcie/service/JnaPcieCryptoService.java index 3142b07..08d4b14 100644 --- a/src/main/java/com/cisd/tms/integration/crypto/pcie/service/JnaPcieCryptoService.java +++ b/src/main/java/com/cisd/tms/integration/crypto/pcie/service/JnaPcieCryptoService.java @@ -15,6 +15,9 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; + +//import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +42,7 @@ public class JnaPcieCryptoService implements PcieCryptoService { private final boolean strictAlgIdValidation; private final long recoverUserKeyAsyncDelayMillis; + public JnaPcieCryptoService(PcieSessionTemplate sessionTemplate, CryptoCardProperties properties) { this(sessionTemplate, properties, RECOVER_USER_KEY_ASYNC_DELAY_MILLIS); } diff --git a/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java b/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java index 7087f40..5a16ec1 100644 --- a/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java +++ b/src/main/java/com/cisd/tms/modules/datamac/helper/Sm2EntitySigner.java @@ -1,8 +1,12 @@ package com.cisd.tms.modules.datamac.helper; +import com.cisd.tms.TmsApplication; import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult; import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; +import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; @@ -12,8 +16,33 @@ import java.util.Comparator; public class Sm2EntitySigner { private static final byte[] DEFAULT_SM2_USER_ID = "1234567812345678".getBytes(StandardCharsets.UTF_8); + private static final Logger log = LoggerFactory.getLogger(Sm2EntitySigner.class); - public static String sign(JnaPcieCryptoService sdf, int keyIdx, Object entity){ + /** + * 对对象计算签名 + * @param sdf + * @param keyIdx + * @param entity + * @return + */ + public static String signMayNull(PcieCryptoService sdf, int keyIdx, Object entity){ + try { + return sign(sdf, keyIdx, entity); + } catch (Exception e) { + log.error("入库数据签名失败", e); + } + return null; + } + + + /** + * 对对象计算签名 + * @param sdf + * @param keyIdx + * @param entity + * @return + */ + public static String sign(PcieCryptoService sdf, int keyIdx, Object entity){ // 1. 获取所有字段并按字段名排序,保证不同实体计算的顺序一致 Field[] fields = entity.getClass().getDeclaredFields(); Arrays.sort(fields, Comparator.comparing(Field::getName)); diff --git a/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java b/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java index 3da54c1..45d28fd 100644 --- a/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java +++ b/src/main/java/com/cisd/tms/modules/openapi/service/impl/OpenApiService.java @@ -10,6 +10,7 @@ import com.cisd.tms.integration.crypto.pcie.model.BackupDataResult; import com.cisd.tms.integration.crypto.pcie.model.EccExternalVerifyRequest; import com.cisd.tms.integration.crypto.pcie.model.UserKeySm2SignRequest; import com.cisd.tms.integration.crypto.pcie.service.JnaPcieCryptoService; +import com.cisd.tms.integration.crypto.pcie.service.PcieCryptoService; import com.cisd.tms.modules.cert.entity.KeyEntity; import com.cisd.tms.modules.cert.service.CertificateService; import com.cisd.tms.modules.cert.service.EntityService; @@ -31,7 +32,7 @@ public class OpenApiService implements IOpenApiService { private static final Logger log = LoggerFactory.getLogger(OpenApiService.class); private final PcieSessionTemplate sessionTemplate; - private final JnaPcieCryptoService sdf; + private final PcieCryptoService sdf; // 签名验签均从证书 dn 作为索引,所以引入证书服务类 private final CertificateService certificateService; From c1f3deb55901a3f862ea3ffc79f13e5ab1022b58 Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 21 May 2026 10:58:21 +0800 Subject: [PATCH 3/4] =?UTF-8?q?hotfix=20dmidecode=20=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E5=89=8D=E6=B7=BB=E5=8A=A0=20sudo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- device-fingerprint-tool/pom.xml | 2 +- .../sunyard/cisd/device/tool/DeviceFingerprintService.java | 4 ++-- pom.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/device-fingerprint-tool/pom.xml b/device-fingerprint-tool/pom.xml index 546f370..8a5c03d 100644 --- a/device-fingerprint-tool/pom.xml +++ b/device-fingerprint-tool/pom.xml @@ -6,7 +6,7 @@ com.sunyard.cisd device-fingerprint-tool - 1.0.1 + 1.0.2 device-fingerprint-tool 设备指纹信息获取工具 diff --git a/device-fingerprint-tool/src/main/java/com/sunyard/cisd/device/tool/DeviceFingerprintService.java b/device-fingerprint-tool/src/main/java/com/sunyard/cisd/device/tool/DeviceFingerprintService.java index e290dfd..3d98bcc 100644 --- a/device-fingerprint-tool/src/main/java/com/sunyard/cisd/device/tool/DeviceFingerprintService.java +++ b/device-fingerprint-tool/src/main/java/com/sunyard/cisd/device/tool/DeviceFingerprintService.java @@ -58,11 +58,11 @@ public class DeviceFingerprintService { } private String getCpuModel() { - return executeCommand("dmidecode -t processor | grep \"Version\" | awk -F\\ '{print $2$3$4}'"); + return executeCommand("sudo dmidecode -t processor | grep \"Version\" | awk -F\\ '{print $2$3$4}'"); } private String getCpuSerialNumber() { - return executeCommand("dmidecode -t processor | grep \"Serial Number\" | awk -F\\ '{print $3}'"); + return executeCommand("sudo dmidecode -t processor | grep \"Serial Number\" | awk -F\\ '{print $3}'"); } private String getHardDiskSerialNumber() { diff --git a/pom.xml b/pom.xml index d9f6468..62f85ed 100644 --- a/pom.xml +++ b/pom.xml @@ -128,7 +128,7 @@ com.sunyard.cisd device-fingerprint-tool - 1.0.1 + 1.0.2 From 4a636b4811b8206b5c7ff4e0a45c6ee478763bde Mon Sep 17 00:00:00 2001 From: xydkj Date: Thu, 21 May 2026 10:58:27 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../device/service/NetworkConfigService.java | 119 ++++++++++++------ 1 file changed, 83 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/cisd/tms/modules/device/service/NetworkConfigService.java b/src/main/java/com/cisd/tms/modules/device/service/NetworkConfigService.java index eabe726..913e76c 100644 --- a/src/main/java/com/cisd/tms/modules/device/service/NetworkConfigService.java +++ b/src/main/java/com/cisd/tms/modules/device/service/NetworkConfigService.java @@ -112,6 +112,7 @@ public class NetworkConfigService { List result = new ArrayList<>(); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -164,6 +165,7 @@ public class NetworkConfigService { List result = new ArrayList<>(); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -226,6 +228,7 @@ public class NetworkConfigService { int pageSize = req.getPageSize(); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -286,6 +289,7 @@ public class NetworkConfigService { if ("connected".equalsIgnoreCase(state)) { List infoLines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -319,6 +323,7 @@ public class NetworkConfigService { if (connectionName != null && !connectionName.trim().isEmpty()) { try { List conLines = executeCommand( + "sudo", "nmcli", "-g", "ipv4.addresses,ipv4.gateway,ipv6.addresses,ipv6.gateway", @@ -425,6 +430,7 @@ public class NetworkConfigService { if (isNewConnection) { cmdArgs = new ArrayList<>(Arrays.asList( + "sudo", "nmcli", "con", "add", @@ -441,6 +447,7 @@ public class NetworkConfigService { )); } else { cmdArgs = new ArrayList<>(Arrays.asList( + "sudo", "nmcli", "con", "mod", @@ -474,14 +481,14 @@ public class NetworkConfigService { if ("Active".equalsIgnoreCase(status)) { try { - executeCommand("nmcli", "dev", "reapply", deviceName); + executeCommand("sudo", "nmcli", "dev", "reapply", deviceName); } catch (RuntimeException e) { log.warn("reapply 网卡 [{}] 失败,尝试重新激活连接 [{}]: {}", deviceName, connectionName, e.getMessage()); - executeCommand("nmcli", "con", "up", connectionName); + executeCommand("sudo", "nmcli", "con", "up", connectionName); } } else if ("Inactive".equalsIgnoreCase(status)) { try { - executeCommand("nmcli", "con", "down", connectionName); + executeCommand("sudo", "nmcli", "con", "down", connectionName); } catch (Exception e) { log.warn("设置网卡为未激活时,down网卡操作抛出异常: {}", e.getMessage()); } @@ -526,6 +533,7 @@ public class NetworkConfigService { try { List lines = executeCommand( + "sudo", "nmcli", "-g", addressesKey, @@ -574,6 +582,7 @@ public class NetworkConfigService { String newAddresses = String.join(",", remainAddressList); executeCommand( + "sudo", "nmcli", "con", "mod", @@ -630,7 +639,7 @@ public class NetworkConfigService { int pageNum = req.getPageNum(); int pageSize = req.getPageSize(); - List lines = executeCommand("nmcli", "-t", "-f", "NAME,TYPE,DEVICE", "con", "show"); + List lines = executeCommand("sudo", "nmcli", "-t", "-f", "NAME,TYPE,DEVICE", "con", "show"); for (String line : lines) { if (line == null || line.trim().isEmpty()) { @@ -665,6 +674,7 @@ public class NetworkConfigService { List slaveList = getBondSlaves(bondName); List conLines = executeCommand( + "sudo", "nmcli", "-g", "IPv4.ADDRESSES,IPv4.GATEWAY,IPv6.ADDRESSES,IPv6.GATEWAY", @@ -718,6 +728,7 @@ public class NetworkConfigService { Map result = new HashMap<>(); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -765,7 +776,7 @@ public class NetworkConfigService { validateIpAndPrefix(ipAddress, gateway, prefixLength, isIpv6); - List lines = executeCommand("nmcli", "-g", "NAME", "con", "show"); + List lines = executeCommand("sudo", "nmcli", "-g", "NAME", "con", "show"); for (String line : lines) { if (bondName.equals(line.trim())) { throw new BizException( @@ -786,6 +797,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "add", @@ -800,6 +812,7 @@ public class NetworkConfigService { ); List ipCmdArgs = new ArrayList<>(Arrays.asList( + "sudo", "nmcli", "con", "mod", @@ -838,6 +851,7 @@ public class NetworkConfigService { oldConnectionSnapshots.addAll(downOldConnectionByDevice(slaveName)); executeCommand( + "sudo", "nmcli", "con", "add", @@ -854,7 +868,7 @@ public class NetworkConfigService { createdSlaveConnectionNames.add(slaveConnectionName); } - executeCommand("nmcli", "con", "up", bondName); + executeCommand("sudo", "nmcli", "con", "up", bondName); } catch (RuntimeException e) { rollbackCreateBond(bondName, createdSlaveConnectionNames, oldConnectionSnapshots); @@ -893,6 +907,7 @@ public class NetworkConfigService { String bondOptions = String.format("mode=%s,miimon=100", mapBondMode(mode)); executeCommand( + "sudo", "nmcli", "con", "mod", @@ -902,6 +917,7 @@ public class NetworkConfigService { ); List ipCmdArgs = new ArrayList<>(Arrays.asList( + "sudo", "nmcli", "con", "mod", @@ -931,10 +947,10 @@ public class NetworkConfigService { syncBondSlaves(bondName, newSlaveList); if ("Active".equalsIgnoreCase(status)) { - executeCommand("nmcli", "con", "up", bondName); + executeCommand("sudo", "nmcli", "con", "up", bondName); } else if ("Inactive".equalsIgnoreCase(status)) { try { - executeCommand("nmcli", "con", "down", bondName); + executeCommand("sudo", "nmcli", "con", "down", bondName); } catch (RuntimeException e) { log.warn("停用 Bond [{}] 失败: {}", bondName, e.getMessage()); } @@ -967,6 +983,7 @@ public class NetworkConfigService { try { List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -997,6 +1014,7 @@ public class NetworkConfigService { if ("ethernet".equals(type) || "802-3-ethernet".equals(type)) { try { List masterLines = executeCommand( + "sudo", "nmcli", "-g", "connection.master", @@ -1026,13 +1044,13 @@ public class NetworkConfigService { for (String uuid : uuidToDeleteList) { try { - executeCommand("nmcli", "con", "down", "uuid", uuid); + executeCommand("sudo", "nmcli", "con", "down", "uuid", uuid); } catch (RuntimeException e) { log.warn("停用 Bond 从属连接 [{}] 失败,继续删除: {}", uuid, e.getMessage()); } try { - executeCommand("nmcli", "con", "delete", "uuid", uuid); + executeCommand("sudo", "nmcli", "con", "delete", "uuid", uuid); } catch (RuntimeException e) { throw new BizException( ErrorCode.BIZ_ERROR.getCode(), @@ -1042,12 +1060,12 @@ public class NetworkConfigService { } try { - executeCommand("nmcli", "con", "down", "uuid", bondUuid); + executeCommand("sudo", "nmcli", "con", "down", "uuid", bondUuid); } catch (RuntimeException e) { log.warn("停用 Bond 主连接 [{}] 失败,继续删除: {}", bondName, e.getMessage()); } - executeCommand("nmcli", "con", "delete", "uuid", bondUuid); + executeCommand("sudo", "nmcli", "con", "delete", "uuid", bondUuid); } catch (BizException e) { throw e; @@ -1118,6 +1136,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1224,6 +1243,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1233,6 +1253,7 @@ public class NetworkConfigService { ); executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1289,6 +1310,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1314,6 +1336,7 @@ public class NetworkConfigService { Set result = new HashSet<>(); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -1352,6 +1375,7 @@ public class NetworkConfigService { private void clearProtocolConfig(String connectionName, String protocol) { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1439,6 +1463,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1500,6 +1525,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1525,6 +1551,7 @@ public class NetworkConfigService { try { List lines = executeCommand( + "sudo", "nmcli", "-g", routeKey, @@ -1553,6 +1580,7 @@ public class NetworkConfigService { try { if (snapshot.bondOptions != null && !snapshot.bondOptions.trim().isEmpty()) { executeCommand( + "sudo", "nmcli", "con", "mod", @@ -1567,6 +1595,7 @@ public class NetworkConfigService { try { List ipv4Args = new ArrayList<>(Arrays.asList( + "sudo", "nmcli", "con", "mod", @@ -1588,6 +1617,7 @@ public class NetworkConfigService { try { List ipv6Args = new ArrayList<>(Arrays.asList( + "sudo", "nmcli", "con", "mod", @@ -1615,10 +1645,10 @@ public class NetworkConfigService { try { if (snapshot.active) { - executeCommand("nmcli", "con", "up", bondName); + executeCommand("sudo", "nmcli", "con", "up", bondName); } else { try { - executeCommand("nmcli", "con", "down", bondName); + executeCommand("sudo", "nmcli", "con", "down", bondName); } catch (Exception e) { log.warn("回滚停用 Bond [{}] 失败: {}", bondName, e.getMessage()); } @@ -1631,6 +1661,7 @@ public class NetworkConfigService { private BondConfigSnapshot snapshotBondConfig(String bondName) { List lines = executeCommand( + "sudo", "nmcli", "-g", "bond.options,IPv4.METHOD,IPv4.ADDRESSES,IPv4.GATEWAY,IPv6.METHOD,IPv6.ADDRESSES,IPv6.GATEWAY", @@ -1685,6 +1716,7 @@ public class NetworkConfigService { } List activeUuids = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -1695,6 +1727,7 @@ public class NetworkConfigService { ); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -1726,6 +1759,7 @@ public class NetworkConfigService { String interfaceName = ""; try { List ifLines = executeCommand( + "sudo", "nmcli", "-g", "connection.interface-name", @@ -1750,6 +1784,7 @@ public class NetworkConfigService { String autoconnect = "yes"; try { List autoLines = executeCommand( + "sudo", "nmcli", "-g", "connection.autoconnect", @@ -1773,6 +1808,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "modify", @@ -1788,7 +1824,7 @@ public class NetworkConfigService { if (active) { try { - executeCommand("nmcli", "con", "down", "uuid", uuid); + executeCommand("sudo", "nmcli", "con", "down", "uuid", uuid); } catch (RuntimeException e) { log.warn("停用旧连接 [{}] 失败,uuid: {}, 原因: {}", name, uuid, e.getMessage()); } @@ -1886,6 +1922,7 @@ public class NetworkConfigService { try { List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -1916,6 +1953,7 @@ public class NetworkConfigService { String interfaceName = ""; try { List interfaceLines = executeCommand( + "sudo", "nmcli", "-g", "connection.interface-name", @@ -1971,13 +2009,13 @@ public class NetworkConfigService { } try { - executeCommand("nmcli", "con", "down", slaveConnectionName); + executeCommand("sudo", "nmcli", "con", "down", slaveConnectionName); } catch (Exception e) { log.warn("回滚停用 Bond 从属连接失败: {}, 原因: {}", slaveConnectionName, e.getMessage()); } try { - executeCommand("nmcli", "con", "delete", slaveConnectionName); + executeCommand("sudo", "nmcli", "con", "delete", slaveConnectionName); } catch (Exception e) { log.warn("回滚删除 Bond 从属连接失败: {}, 原因: {}", slaveConnectionName, e.getMessage()); } @@ -1987,13 +2025,13 @@ public class NetworkConfigService { if (bondName != null && !bondName.trim().isEmpty()) { try { - executeCommand("nmcli", "con", "down", bondName); + executeCommand("sudo", "nmcli", "con", "down", bondName); } catch (Exception e) { log.warn("回滚停用 Bond 主连接失败: {}, 原因: {}", bondName, e.getMessage()); } try { - executeCommand("nmcli", "con", "delete", bondName); + executeCommand("sudo", "nmcli", "con", "delete", bondName); } catch (Exception e) { log.warn("回滚删除 Bond 主连接失败: {}, 原因: {}", bondName, e.getMessage()); } @@ -2013,6 +2051,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "modify", @@ -2027,7 +2066,7 @@ public class NetworkConfigService { if (snapshot.active) { try { - executeCommand("nmcli", "con", "up", "uuid", uuid); + executeCommand("sudo", "nmcli", "con", "up", "uuid", uuid); } catch (Exception e) { log.warn("回滚恢复旧连接激活失败,uuid: {}, 原因: {}", uuid, e.getMessage()); } @@ -2046,6 +2085,7 @@ public class NetworkConfigService { try { List lines = executeCommand( + "sudo", "nmcli", "-g", "connection.type", @@ -2108,7 +2148,7 @@ public class NetworkConfigService { private void checkSlaveDevicesExist(List slaveList) { - List deviceLines = executeCommand("nmcli", "-t", "-f", "DEVICE,TYPE", "dev"); + List deviceLines = executeCommand("sudo", "nmcli", "-t", "-f", "DEVICE,TYPE", "dev"); for (String slave : slaveList) { String slaveName = slave.trim(); @@ -2153,6 +2193,7 @@ public class NetworkConfigService { private boolean isConnectionActive(String connectionName) { try { List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -2274,6 +2315,7 @@ public class NetworkConfigService { Map statusMap = new HashMap<>(); List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -2361,10 +2403,10 @@ public class NetworkConfigService { private void applyConnection(String connectionName, String interfaceName) { try { - executeCommand("nmcli", "dev", "reapply", interfaceName); + executeCommand("sudo", "nmcli", "dev", "reapply", interfaceName); } catch (RuntimeException e) { log.warn("reapply 网口 [{}] 失败,尝试重新激活连接 [{}]: {}", interfaceName, connectionName, e.getMessage()); - executeCommand("nmcli", "con", "up", connectionName); + executeCommand("sudo", "nmcli", "con", "up", connectionName); } } @@ -2401,6 +2443,7 @@ public class NetworkConfigService { oldConnectionSnapshots.addAll(downOldConnectionByDevice(slaveName)); executeCommand( + "sudo", "nmcli", "con", "add", @@ -2417,7 +2460,7 @@ public class NetworkConfigService { createdSlaveConnectionNames.add(slaveConnectionName); } - executeCommand("nmcli", "con", "up", bondName); + executeCommand("sudo", "nmcli", "con", "up", bondName); } catch (RuntimeException e) { rollbackAddSlavesToBond(createdSlaveConnectionNames, oldConnectionSnapshots); @@ -2464,18 +2507,18 @@ public class NetworkConfigService { try { for (BondSlaveSnapshot snapshot : targetSlaveSnapshots) { try { - executeCommand("nmcli", "con", "down", "uuid", snapshot.uuid); + executeCommand("sudo", "nmcli", "con", "down", "uuid", snapshot.uuid); } catch (Exception e) { log.warn("停用从属网卡连接 [{}] 失败,忽略并继续删除: {}", snapshot.name, e.getMessage()); } - executeCommand("nmcli", "con", "delete", "uuid", snapshot.uuid); + executeCommand("sudo", "nmcli", "con", "delete", "uuid", snapshot.uuid); deletedSlaveSnapshots.add(snapshot); } if (!deletedSlaveSnapshots.isEmpty()) { try { - executeCommand("nmcli", "con", "up", bondName); + executeCommand("sudo", "nmcli", "con", "up", bondName); } catch (RuntimeException e) { rollbackDeletedBondSlaves(bondName, deletedSlaveSnapshots); throw new BizException( @@ -2508,6 +2551,7 @@ public class NetworkConfigService { } List lines = executeCommand( + "sudo", "nmcli", "-t", "-f", @@ -2562,6 +2606,7 @@ public class NetworkConfigService { try { List detailLines = executeCommand( + "sudo", "nmcli", "-g", "connection.master,connection.interface-name", @@ -2627,6 +2672,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "add", @@ -2651,7 +2697,7 @@ public class NetworkConfigService { } try { - executeCommand("nmcli", "con", "up", bondName); + executeCommand("sudo", "nmcli", "con", "up", bondName); } catch (Exception e) { log.warn("恢复 Bond [{}] 激活失败: {}", bondName, e.getMessage()); } @@ -2668,13 +2714,13 @@ public class NetworkConfigService { } try { - executeCommand("nmcli", "con", "down", slaveConnectionName); + executeCommand("sudo", "nmcli", "con", "down", slaveConnectionName); } catch (Exception e) { log.warn("回滚停用 Bond 从属连接 [{}] 失败: {}", slaveConnectionName, e.getMessage()); } try { - executeCommand("nmcli", "con", "delete", slaveConnectionName); + executeCommand("sudo", "nmcli", "con", "delete", slaveConnectionName); } catch (Exception e) { log.warn("回滚删除 Bond 从属连接 [{}] 失败: {}", slaveConnectionName, e.getMessage()); } @@ -2686,7 +2732,7 @@ public class NetworkConfigService { private void checkConnectionNameNotExists(String connectionName) { try { - executeCommand("nmcli", "con", "show", connectionName); + executeCommand("sudo", "nmcli", "con", "show", connectionName); throw new BizException( ErrorCode.BIZ_ERROR.getCode(), @@ -2717,6 +2763,7 @@ public class NetworkConfigService { try { executeCommand( + "sudo", "nmcli", "con", "modify", @@ -2731,7 +2778,7 @@ public class NetworkConfigService { if (snapshot.active) { try { - executeCommand("nmcli", "con", "up", "uuid", uuid); + executeCommand("sudo", "nmcli", "con", "up", "uuid", uuid); } catch (Exception e) { log.warn("恢复旧连接激活失败,uuid: {}, 原因: {}", uuid, e.getMessage()); } @@ -2781,7 +2828,7 @@ public class NetworkConfigService { List slaveList = new ArrayList<>(); List lines; try { - lines = executeCommand("nmcli", "-t", "-f", "UUID,DEVICE,NAME,TYPE", "con", "show"); + lines = executeCommand("sudo", "nmcli", "-t", "-f", "UUID,DEVICE,NAME,TYPE", "con", "show"); } catch (RuntimeException e) { throw new BizException(ErrorCode.BIZ_ERROR.getCode(), "查询 Bond 从属网卡列表失败"); } @@ -2805,7 +2852,7 @@ public class NetworkConfigService { } if (type != null && type.contains("ethernet")) { - List masterOutputs = executeCommand("nmcli", "-g", "connection.master", "con", "show", uuid); + List masterOutputs = executeCommand("sudo", "nmcli", "-g", "connection.master", "con", "show", uuid); String master = masterOutputs.isEmpty() ? "" : masterOutputs.get(0).trim(); if (bondName.equals(master)) { @@ -2837,7 +2884,7 @@ public class NetworkConfigService { List lines; try { - lines = executeCommand("nmcli", "-g", "bond.options", "con", "show", bondName); + lines = executeCommand("sudo", "nmcli", "-g", "bond.options", "con", "show", bondName); } catch (RuntimeException e) { throw new BizException(ErrorCode.BIZ_ERROR.getCode(), "读取 Bond 配置信息失败,请检查名称 [" + bondName + "] 是否存在"); } @@ -2874,7 +2921,7 @@ public class NetworkConfigService { private String getConnectionNameByDeviceName(String deviceName) { if (deviceName == null || deviceName.trim().isEmpty()) return null; try { - List lines = executeCommand("nmcli", "-t", "-f", "DEVICE,CONNECTION", "dev", "status"); + List lines = executeCommand("sudo", "nmcli", "-t", "-f", "DEVICE,CONNECTION", "dev", "status"); for (String line : lines) { String[] parts = line.split("(?