java.security.cert.certificateexception: no subject alternative dns name mat
时间: 2023-06-05 08:47:36 浏览: 114
Java.security.cert.certificateException: no subject alternative DNS name mat是一种Java异常,表示SSL连接失败,因为服务器的主机名无法与证书中指定的主机名匹配。这通常是由于服务器使用了自签名证书或使用了无效证书而导致的。当客户端访问服务器时,它会尝试验证服务器的证书。如果证书中指定的主机名与实际主机名不匹配,就会出现这个异常。
要解决这个问题,可以采取以下措施:
1. 修改服务器的主机名,使其与证书中指定的主机名一致。
2. 重新颁发一个新的证书,确保证书中的主机名与服务器的主机名一致,并将其安装到服务器上。
3. 如果服务器使用的是自签名证书,可以将证书导入到Java信任库中。
4. 如果是使用的是无效证书,需要重新购买一个有效证书,保证证书的合法性。
总之,Java.security.cert.certificateException: no subject alternative DNS name mat是一个常见的SSL连接异常,要解决这个问题,需要确保服务器使用的证书是合法的,并且与服务器主机名一致。如果出现了这个问题,可以采取上述措施来解决。
相关问题
java.security.cert.CertificateException: No subject alternative DNS name matching XXX found
这个错误通常是由于SSL证书中的主题备用名称(SAN)不包含您正在尝试连接的主机名引起的。这意味着您的Java客户端无法验证SSL证书,因为它无法验证证书是否与您正在尝试连接的主机名匹配。解决此问题的方法是将证书添加到Java信任存储中,或者在代码中禁用SSL证书验证。以下是两种解决方法:
1. 将证书添加到Java信任存储中
```shell
# 下载证书
openssl s_client -connect example.com:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > example.crt
# 将证书添加到Java信任存储中
keytool -import -alias example -keystore $JAVA_HOME/jre/lib/security/cacerts -file example.crt
```
2. 在代码中禁用SSL证书验证
```java
import javax.net.ssl.*;
import java.security.cert.X509Certificate;
public class SSLUtil {
public static void turnOffSslChecking() throws NoSuchAlgorithmException, KeyManagementException {
// 创建一个不验证证书链的信任管理器
TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
} };
// 获取一个不验证证书链的SSLContext实例
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
// 获取一个不验证证书链的HostnameVerifier实例
HostnameVerifier allHostsValid = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
}
}
```
在需要禁用SSL证书验证的代码中调用`SSLUtil.turnOffSslChecking()`即可。
Caused by: java.security.cert.CertificateException: No subject alternative names present
这个错误通常是由于SSL证书中缺少主题备用名称(SAN)字段引起的。可以通过以下方法解决此问题:
1.忽略证书验证,但这并不是一个好的解决方案,因为它会降低应用程序的安全性。可以使用以下代码来忽略证书验证:
```java
connOpts.setHttpsHostnameVerificationEnabled(false);```
2.在SSL证书中添加主题备用名称(SAN)字段。这可以通过在证书签名请求(CSR)中包含主题备用名称扩展来完成。可以使用以下命令生成包含主题备用名称扩展的CSR:
```shell
openssl req -new -newkey rsa:2048 -nodes -keyout example.com.key -out example.com.csr -subj "/C=US/ST=California/L=San Francisco/O=Example Corp/CN=example.com" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com"))
```
3.使用IP地址而不是主机名来访问SSL站点。这种方法不需要主题备用名称字段。可以使用以下代码来访问SSL站点:
```java
URL url = new URL("https://192.168.0.1");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
```