fix:p10增加ou
This commit is contained in:
parent
03d8ccce78
commit
42b4ed1c38
@ -8,6 +8,9 @@ import org.bouncycastle.asn1.x500.style.BCStyle;
|
|||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Schema(description = "证书主题信息")
|
@Schema(description = "证书主题信息")
|
||||||
public class Subject {
|
public class Subject {
|
||||||
@ -30,6 +33,9 @@ public class Subject {
|
|||||||
@Schema(description = "组织单元 OU", example = "Cert")
|
@Schema(description = "组织单元 OU", example = "Cert")
|
||||||
private String orgUnit;
|
private String orgUnit;
|
||||||
|
|
||||||
|
@Schema(description = "组织单元 OU 列表,最多支持两个;传入后优先于 orgUnit", example = "[\"Organizational-1\",\"CCFCCB\"]")
|
||||||
|
private List<String> orgUnits;
|
||||||
|
|
||||||
public String getDN() {
|
public String getDN() {
|
||||||
return toX500Name().toString();
|
return toX500Name().toString();
|
||||||
}
|
}
|
||||||
@ -40,8 +46,8 @@ public class Subject {
|
|||||||
if (StringUtils.hasText(commonName)) {
|
if (StringUtils.hasText(commonName)) {
|
||||||
builder.addRDN(BCStyle.CN, commonName);
|
builder.addRDN(BCStyle.CN, commonName);
|
||||||
}
|
}
|
||||||
if (StringUtils.hasText(orgUnit)) {
|
for (String unit : effectiveOrgUnits()) {
|
||||||
builder.addRDN(BCStyle.OU, orgUnit);
|
builder.addRDN(BCStyle.OU, unit);
|
||||||
}
|
}
|
||||||
if (StringUtils.hasText(org)) {
|
if (StringUtils.hasText(org)) {
|
||||||
builder.addRDN(BCStyle.O, org);
|
builder.addRDN(BCStyle.O, org);
|
||||||
@ -59,9 +65,26 @@ public class Subject {
|
|||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<String> effectiveOrgUnits() {
|
||||||
|
List<String> units = new ArrayList<>();
|
||||||
|
if (orgUnits != null) {
|
||||||
|
for (String unit : orgUnits) {
|
||||||
|
if (StringUtils.hasText(unit)) {
|
||||||
|
units.add(unit.trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (units.isEmpty() && StringUtils.hasText(orgUnit)) {
|
||||||
|
units.add(orgUnit.trim());
|
||||||
|
}
|
||||||
|
Assert.isTrue(units.size() <= 2, "组织单元最多支持2个");
|
||||||
|
return units;
|
||||||
|
}
|
||||||
|
|
||||||
public static Subject fromDN(String dn) {
|
public static Subject fromDN(String dn) {
|
||||||
Assert.hasText(dn, "DN不能为空");
|
Assert.hasText(dn, "DN不能为空");
|
||||||
Subject subject = new Subject();
|
Subject subject = new Subject();
|
||||||
|
List<String> orgUnits = new ArrayList<>();
|
||||||
String[] splits = dn.trim().split(",");
|
String[] splits = dn.trim().split(",");
|
||||||
for (String split : splits) {
|
for (String split : splits) {
|
||||||
String trim = split.trim();
|
String trim = split.trim();
|
||||||
@ -78,12 +101,16 @@ public class Subject {
|
|||||||
subject.setOrg(trim.substring(2));
|
subject.setOrg(trim.substring(2));
|
||||||
}
|
}
|
||||||
if (trim.startsWith("OU=")) {
|
if (trim.startsWith("OU=")) {
|
||||||
subject.setOrgUnit(trim.substring(3));
|
orgUnits.add(trim.substring(3));
|
||||||
}
|
}
|
||||||
if (trim.startsWith("CN=")) {
|
if (trim.startsWith("CN=")) {
|
||||||
subject.setCommonName(trim.substring(3));
|
subject.setCommonName(trim.substring(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!orgUnits.isEmpty()) {
|
||||||
|
subject.setOrgUnit(orgUnits.get(0));
|
||||||
|
subject.setOrgUnits(orgUnits);
|
||||||
|
}
|
||||||
Assert.hasText(subject.commonName, "通用名称不能为空");
|
Assert.hasText(subject.commonName, "通用名称不能为空");
|
||||||
return subject;
|
return subject;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -109,6 +109,7 @@ public class EntityService {
|
|||||||
.setOrgName(request.getOrgName())
|
.setOrgName(request.getOrgName())
|
||||||
.setAlgoType(algoType)
|
.setAlgoType(algoType)
|
||||||
.setKeyLen(keyLen)
|
.setKeyLen(keyLen)
|
||||||
|
//todo 后续增加密钥类型字段/增加加密密钥对字段
|
||||||
.setKeyIdx(keyIdx)
|
.setKeyIdx(keyIdx)
|
||||||
.setBackupData(Base64.getEncoder().encodeToString(backup.getData()))
|
.setBackupData(Base64.getEncoder().encodeToString(backup.getData()))
|
||||||
.setPublicKey(Base64.getEncoder().encodeToString(publicKey.getData()))
|
.setPublicKey(Base64.getEncoder().encodeToString(publicKey.getData()))
|
||||||
|
|||||||
@ -278,6 +278,28 @@ class EntityServiceTest {
|
|||||||
assertEquals("TMS,Entity+001", commonName);
|
assertEquals("TMS,Entity+001", commonName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldGenerateP10WithTwoOrganizationalUnits() throws Exception {
|
||||||
|
KeyEntityRepository keyEntityRepository = Mockito.mock(KeyEntityRepository.class);
|
||||||
|
CertificateRepository certificateRepository = Mockito.mock(CertificateRepository.class);
|
||||||
|
PcieCryptoService pcieCryptoService = Mockito.mock(PcieCryptoService.class);
|
||||||
|
EntityService service = new EntityService(keyEntityRepository, certificateRepository, pcieCryptoService, new ObjectMapper());
|
||||||
|
Mockito.when(keyEntityRepository.findById(10L)).thenReturn(Optional.of(keyEntity(10L, 5)));
|
||||||
|
Mockito.when(keyEntityRepository.save(any())).thenAnswer(invocation -> invocation.getArgument(0));
|
||||||
|
Mockito.when(pcieCryptoService.userKeySignWithSm3(any())).thenReturn(signatureResult());
|
||||||
|
Mockito.when(pcieCryptoService.userKeySignWithSm2Sm3(any())).thenReturn(signatureResult());
|
||||||
|
|
||||||
|
EntityGenP10Request request = genP10Request("TMS-001");
|
||||||
|
request.getSubject().setOrgUnits(List.of("Organizational-1", "CCFCCB"));
|
||||||
|
|
||||||
|
String pem = service.generateP10(request);
|
||||||
|
|
||||||
|
PKCS10CertificationRequest csr = (PKCS10CertificationRequest) new PEMParser(new StringReader(pem)).readObject();
|
||||||
|
assertEquals(2, csr.getSubject().getRDNs(BCStyle.OU).length);
|
||||||
|
assertEquals("Organizational-1", csr.getSubject().getRDNs(BCStyle.OU)[0].getFirst().getValue().toString());
|
||||||
|
assertEquals("CCFCCB", csr.getSubject().getRDNs(BCStyle.OU)[1].getFirst().getValue().toString());
|
||||||
|
}
|
||||||
|
|
||||||
private EntityGenP10Request genP10Request(String commonName) {
|
private EntityGenP10Request genP10Request(String commonName) {
|
||||||
Subject subject = new Subject();
|
Subject subject = new Subject();
|
||||||
subject.setCommonName(commonName);
|
subject.setCommonName(commonName);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user