mirror of
https://gitee.com/guoyifanA/qiu-mo-jetbrains-help.git
synced 2026-09-21 22:30:45 +08:00
去除TEST依赖,证书生成时间问题
This commit is contained in:
@@ -95,13 +95,6 @@
|
|||||||
<artifactId>jansi</artifactId>
|
<artifactId>jansi</artifactId>
|
||||||
<version>2.4.0</version>
|
<version>2.4.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- 测试依赖 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework.boot</groupId>
|
|
||||||
<artifactId>spring-boot-starter-test</artifactId>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<!-- 构建配置 -->
|
<!-- 构建配置 -->
|
||||||
@@ -142,13 +135,6 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
||||||
<!-- Maven测试插件 -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<version>${maven-surefire-plugin.version}</version>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
</project>
|
</project>
|
||||||
|
|||||||
@@ -95,33 +95,6 @@ public class CertificateContextHolder {
|
|||||||
/** 服务器子证书文件路径 */
|
/** 服务器子证书文件路径 */
|
||||||
private static final String SERVER_CHILD_CET_FILE_NAME = "external/certificate/server-child-ca.crt";
|
private static final String SERVER_CHILD_CET_FILE_NAME = "external/certificate/server-child-ca.crt";
|
||||||
|
|
||||||
/** 证书有效期(年) */
|
|
||||||
private static final int CERTIFICATE_VALIDITY_YEARS = 100;
|
|
||||||
|
|
||||||
/** RSA签名算法 */
|
|
||||||
private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";
|
|
||||||
|
|
||||||
/** BouncyCastle提供者标识 */
|
|
||||||
private static final String BC_PROVIDER = "BC";
|
|
||||||
|
|
||||||
/** RSA加密算法标识 */
|
|
||||||
private static final String RSA_ALGORITHM = "RSA";
|
|
||||||
|
|
||||||
/** 授权码签名CA的DN */
|
|
||||||
private static final String CODE_CA_DN = "CN=JetProfile CA";
|
|
||||||
|
|
||||||
/** 许可证服务器CA的DN */
|
|
||||||
private static final String LICENSE_SERVER_CA_DN = "CN=License Servers CA";
|
|
||||||
|
|
||||||
/** 应用程序主体DN */
|
|
||||||
private static final String APP_SUBJECT_DN = "CN=QiuMo-Jetbrains-Help";
|
|
||||||
|
|
||||||
/** 许可证服务器域名 */
|
|
||||||
private static final String LICENSE_SERVER_DOMAIN = "qiumo.lsrv.jetbrains.com";
|
|
||||||
|
|
||||||
/** 许可证服务器主体DN */
|
|
||||||
private static final String LICENSE_SERVER_SUBJECT_DN = "CN=" + LICENSE_SERVER_DOMAIN;
|
|
||||||
|
|
||||||
// ==================== 静态文件对象 ====================
|
// ==================== 静态文件对象 ====================
|
||||||
|
|
||||||
/** 授权码根密钥文件对象 */
|
/** 授权码根密钥文件对象 */
|
||||||
@@ -335,7 +308,7 @@ public class CertificateContextHolder {
|
|||||||
private static KeyPair generateRSAKeyPair(int keySize) {
|
private static KeyPair generateRSAKeyPair(int keySize) {
|
||||||
try {
|
try {
|
||||||
log.debug("生成{}位RSA密钥对", keySize);
|
log.debug("生成{}位RSA密钥对", keySize);
|
||||||
return SecureUtil.generateKeyPair(RSA_ALGORITHM, keySize);
|
return SecureUtil.generateKeyPair("RSA", keySize);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("RSA密钥对生成失败: " + keySize + "位", e);
|
throw new RuntimeException("RSA密钥对生成失败: " + keySize + "位", e);
|
||||||
}
|
}
|
||||||
@@ -351,17 +324,14 @@ public class CertificateContextHolder {
|
|||||||
private static void saveKeyPairToFiles(KeyPair keyPair, String privateKeyPath, String publicKeyPath) {
|
private static void saveKeyPairToFiles(KeyPair keyPair, String privateKeyPath, String publicKeyPath) {
|
||||||
try {
|
try {
|
||||||
// 保存私钥
|
// 保存私钥
|
||||||
File privateKeyFileObj = FileTools.getFileOrCreat(privateKeyPath);
|
privateKeyFile = FileTools.getFileOrCreat(privateKeyPath);
|
||||||
PemUtil.writePemObject("PRIVATE KEY", keyPair.getPrivate().getEncoded(),
|
PemUtil.writePemObject("PRIVATE KEY", keyPair.getPrivate().getEncoded(),
|
||||||
FileUtil.getWriter(privateKeyFileObj, StandardCharsets.UTF_8, false));
|
FileUtil.getWriter(privateKeyFile, StandardCharsets.UTF_8, false));
|
||||||
|
|
||||||
// 保存公钥
|
// 保存公钥
|
||||||
File publicKeyFileObj = FileTools.getFileOrCreat(publicKeyPath);
|
publicKeyFile = FileTools.getFileOrCreat(publicKeyPath);
|
||||||
PemUtil.writePemObject("PUBLIC KEY", keyPair.getPublic().getEncoded(),
|
PemUtil.writePemObject("PUBLIC KEY", keyPair.getPublic().getEncoded(),
|
||||||
FileUtil.getWriter(publicKeyFileObj, StandardCharsets.UTF_8, false));
|
FileUtil.getWriter(publicKeyFile, StandardCharsets.UTF_8, false));
|
||||||
|
|
||||||
publicKeyFile = publicKeyFileObj;
|
|
||||||
privateKeyFile = privateKeyFileObj;
|
|
||||||
|
|
||||||
log.debug("密钥对已保存: {} 和 {}", privateKeyPath, publicKeyPath);
|
log.debug("密钥对已保存: {} 和 {}", privateKeyPath, publicKeyPath);
|
||||||
|
|
||||||
@@ -381,8 +351,8 @@ public class CertificateContextHolder {
|
|||||||
PublicKey publicKey4096 = keyPair.getPublic();
|
PublicKey publicKey4096 = keyPair.getPublic();
|
||||||
|
|
||||||
// 创建内容签名器
|
// 创建内容签名器
|
||||||
ContentSigner signer = new JcaContentSignerBuilder(SIGNATURE_ALGORITHM).build(privateKey4096);
|
ContentSigner signer = new JcaContentSignerBuilder("SHA256withRSA").build(privateKey4096);
|
||||||
JcaX509CertificateConverter certConverter = new JcaX509CertificateConverter().setProvider(BC_PROVIDER);
|
JcaX509CertificateConverter certConverter = new JcaX509CertificateConverter().setProvider("BC");
|
||||||
|
|
||||||
// 生成授权码签名CA证书
|
// 生成授权码签名CA证书
|
||||||
Certificate codeCertificate = generateCodeCACertificate(publicKey4096, signer, certConverter);
|
Certificate codeCertificate = generateCodeCACertificate(publicKey4096, signer, certConverter);
|
||||||
@@ -412,11 +382,11 @@ public class CertificateContextHolder {
|
|||||||
private static Certificate generateCodeCACertificate(PublicKey publicKey, ContentSigner signer,
|
private static Certificate generateCodeCACertificate(PublicKey publicKey, ContentSigner signer,
|
||||||
JcaX509CertificateConverter certConverter) throws Exception {
|
JcaX509CertificateConverter certConverter) throws Exception {
|
||||||
JcaX509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(
|
JcaX509v3CertificateBuilder certificateBuilder = new JcaX509v3CertificateBuilder(
|
||||||
new X500Name(CODE_CA_DN), // 颁发者DN
|
new X500Name("CN=JetProfile CA"), // 颁发者DN
|
||||||
BigInteger.valueOf(System.currentTimeMillis()), // 序列号
|
BigInteger.valueOf(System.currentTimeMillis()), // 序列号
|
||||||
DateUtil.yesterday(), // 生效日期(昨天,避免时钟偏差)
|
DateUtil.yesterday().toJdkDate(), // 生效日期(昨天,避免时钟偏差)
|
||||||
DateUtil.date().offset(DateField.YEAR, CERTIFICATE_VALIDITY_YEARS), // 过期日期
|
DateUtil.date().offset(DateField.YEAR, 100).toJdkDate(), // 过期日期
|
||||||
new X500Name(APP_SUBJECT_DN), // 主体DN
|
new X500Name("CN=QiuMo-Jetbrains-Help"), // 主体DN
|
||||||
SubjectPublicKeyInfo.getInstance(publicKey.getEncoded())); // 公钥信息
|
SubjectPublicKeyInfo.getInstance(publicKey.getEncoded())); // 公钥信息
|
||||||
|
|
||||||
return certConverter.getCertificate(certificateBuilder.build(signer));
|
return certConverter.getCertificate(certificateBuilder.build(signer));
|
||||||
@@ -433,11 +403,11 @@ public class CertificateContextHolder {
|
|||||||
private static Certificate generateServerCACertificate(PublicKey publicKey, ContentSigner signer,
|
private static Certificate generateServerCACertificate(PublicKey publicKey, ContentSigner signer,
|
||||||
JcaX509CertificateConverter certConverter) throws Exception {
|
JcaX509CertificateConverter certConverter) throws Exception {
|
||||||
JcaX509v3CertificateBuilder serversCertBuilder = new JcaX509v3CertificateBuilder(
|
JcaX509v3CertificateBuilder serversCertBuilder = new JcaX509v3CertificateBuilder(
|
||||||
new X500Name(LICENSE_SERVER_CA_DN), // 颁发者DN
|
new X500Name("CN=License Servers CA"), // 颁发者DN
|
||||||
BigInteger.valueOf(System.currentTimeMillis()), // 序列号
|
BigInteger.valueOf(System.currentTimeMillis()), // 序列号
|
||||||
DateUtil.yesterday(), // 生效日期
|
DateUtil.yesterday().toJdkDate(), // 生效日期
|
||||||
DateUtil.date().offset(DateField.YEAR, CERTIFICATE_VALIDITY_YEARS), // 过期日期
|
DateUtil.date().offset(DateField.YEAR, 100).toJdkDate(), // 过期日期
|
||||||
new X500Name(APP_SUBJECT_DN), // 主体DN
|
new X500Name("CN=QiuMo-Jetbrains-Help"), // 主体DN
|
||||||
SubjectPublicKeyInfo.getInstance(publicKey.getEncoded())); // 公钥信息
|
SubjectPublicKeyInfo.getInstance(publicKey.getEncoded())); // 公钥信息
|
||||||
|
|
||||||
return certConverter.getCertificate(serversCertBuilder.build(signer));
|
return certConverter.getCertificate(serversCertBuilder.build(signer));
|
||||||
@@ -463,11 +433,11 @@ public class CertificateContextHolder {
|
|||||||
private static Certificate generateServerChildCertificate(PublicKey publicKey4096,
|
private static Certificate generateServerChildCertificate(PublicKey publicKey4096,
|
||||||
ContentSigner signer, JcaX509CertificateConverter certConverter) throws Exception {
|
ContentSigner signer, JcaX509CertificateConverter certConverter) throws Exception {
|
||||||
JcaX509v3CertificateBuilder childCertBuilder = new JcaX509v3CertificateBuilder(
|
JcaX509v3CertificateBuilder childCertBuilder = new JcaX509v3CertificateBuilder(
|
||||||
new X500Name(LICENSE_SERVER_CA_DN), // 颁发者DN
|
new X500Name("CN=License Servers CA"), // 颁发者DN
|
||||||
BigInteger.valueOf(System.currentTimeMillis()), // 序列号
|
BigInteger.valueOf(System.currentTimeMillis()), // 序列号
|
||||||
DateUtil.yesterday(), // 生效日期
|
DateUtil.yesterday().toJdkDate(), // 生效日期
|
||||||
DateUtil.date().offset(DateField.YEAR, CERTIFICATE_VALIDITY_YEARS), // 过期日期
|
DateUtil.date().offset(DateField.YEAR, 100).toJdkDate(), // 过期日期
|
||||||
new X500Name(LICENSE_SERVER_SUBJECT_DN), // 主体DN(具体域名)
|
new X500Name("CN=qiumo.lsrv.jetbrains.com"), // 主体DN(具体域名)
|
||||||
SubjectPublicKeyInfo.getInstance(publicKey4096.getEncoded())); // 公钥信息
|
SubjectPublicKeyInfo.getInstance(publicKey4096.getEncoded())); // 公钥信息
|
||||||
|
|
||||||
// 添加证书扩展
|
// 添加证书扩展
|
||||||
@@ -494,7 +464,7 @@ public class CertificateContextHolder {
|
|||||||
|
|
||||||
// 2. 主体备用名称:DNS域名
|
// 2. 主体备用名称:DNS域名
|
||||||
GeneralNamesBuilder generalNamesBuilder = new GeneralNamesBuilder();
|
GeneralNamesBuilder generalNamesBuilder = new GeneralNamesBuilder();
|
||||||
GeneralName dnsName = new GeneralName(GeneralName.dNSName, LICENSE_SERVER_DOMAIN);
|
GeneralName dnsName = new GeneralName(GeneralName.dNSName, "qiumo.lsrv.jetbrains.com");
|
||||||
generalNamesBuilder.addName(dnsName);
|
generalNamesBuilder.addName(dnsName);
|
||||||
GeneralNames generalNames = generalNamesBuilder.build();
|
GeneralNames generalNames = generalNamesBuilder.build();
|
||||||
certBuilder.addExtension(Extension.subjectAlternativeName, false, generalNames);
|
certBuilder.addExtension(Extension.subjectAlternativeName, false, generalNames);
|
||||||
|
|||||||
Binary file not shown.
@@ -1,13 +0,0 @@
|
|||||||
package com.qiumo.help;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
|
|
||||||
@SpringBootTest
|
|
||||||
class QiuMoJetbrainsHelpApplicationTests {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void contextLoads() {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user