fix TomcatEngine to support https

This commit is contained in:
Looly
2024-12-24 23:25:57 +08:00
parent b4eb357775
commit cacfbd9fc8
13 changed files with 252 additions and 32 deletions

View File

@@ -17,7 +17,9 @@
package org.dromara.hutool.crypto;
import org.dromara.hutool.core.io.IoUtil;
import org.dromara.hutool.core.io.file.FileNameUtil;
import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.crypto.provider.GlobalProviderFactory;
import java.io.File;
@@ -35,11 +37,12 @@ import java.security.Provider;
public class KeyStoreUtil {
/**
* Java密钥库(Java Key StoreJKS)KEY_STORE
* Java密钥库(Java Key StoreJKS)KEY_STOREJava 平台特有的密钥库格式<br>
* JKS 密钥库可以用 Java 的 keytool 工具进行管理。
*/
public static final String TYPE_JKS = "JKS";
/**
* jceks
* JCEKSJava Cryptography Extension Key Store
*/
public static final String TYPE_JCEKS = "jceks";
/**
@@ -100,6 +103,31 @@ public class KeyStoreUtil {
return readKeyStore(TYPE_PKCS12, in, password);
}
/**
* 读取KeyStore文件<br>
* KeyStore文件用于数字证书的密钥对保存<br>
* 证书类型根据扩展名自动判断,规则如下:
* <pre>
* .jks .keystore -> JKS
* .p12 .pfx等其它 -> PKCS12
* </pre>
*
* @param keyFile 证书文件
* @param password 密码null表示无密码
* @return {@link KeyStore}
* @since 6.0.0
*/
public static KeyStore readKeyStore(final File keyFile, final char[] password) {
final String suffix = FileNameUtil.getSuffix(keyFile);
final String type;
if(StrUtil.equalsIgnoreCase(suffix, "jks") || StrUtil.equalsIgnoreCase(suffix, "keystore")){
type = TYPE_JKS;
}else{
type = TYPE_PKCS12;
}
return readKeyStore(type, keyFile, password);
}
/**
* 读取KeyStore文件<br>
* KeyStore文件用于数字证书的密钥对保存<br>

View File

@@ -30,6 +30,7 @@ import java.security.Provider;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
/**
* 数字证书{@link Certificate}相关工具类
@@ -141,4 +142,35 @@ public class CertUtil {
}
return factory;
}
/**
* 判断一个证书是否是自签名的,即证书由自己签发。
* @param cert 证书
* @return true表示自签名的false表示非自签名的
*/
public static boolean isSelfSigned(final X509Certificate cert) {
return isSignedBy(cert, cert);
}
/**
* 验证一个证书是否由另一个证书签发。<br>
* 来自sun.security.tools.KeyStoreUtil
*
* @param end 需要验证的终端证书
* @param ca 用于验证的CA证书
* @return 如果终端证书由CA证书签发则返回true否则返回false
*/
public static boolean isSignedBy(final X509Certificate end, final X509Certificate ca) {
// 检查CA证书的主题和终端证书的颁发者是否相同
if (!ca.getSubjectX500Principal().equals(end.getIssuerX500Principal())) {
return false;
}
try {
// 使用CA证书的公钥验证终端证书
end.verify(ca.getPublicKey());
return true;
} catch (final Exception e) {
return false;
}
}
}