iTXTech / mirai-console-loader

模块化、轻量级且支持完全自定义的 mirai 加载器。
GNU Affero General Public License v3.0
732 stars 63 forks source link

Exception in thread "main" java.lang.InternalError: java.security.NoSuchAlgorithmException: Error constructing implementation #175

Closed qfys521 closed 1 year ago

qfys521 commented 1 year ago

由于设备原因,使用移动设备共享网络时提示该报错。

Exception in thread "main" java.lang.InternalError: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
        at java.net.http/jdk.internal.net.http.HttpClientImpl.<init>(HttpClientImpl.java:268)
        at java.net.http/jdk.internal.net.http.HttpClientImpl.create(HttpClientImpl.java:253)
        at java.net.http/jdk.internal.net.http.HttpClientBuilderImpl.build(HttpClientBuilderImpl.java:135)
        at org.itxtech.mcl.component.Repository.<init>(Repository.java:61)
        at org.itxtech.mcl.Loader.start(Loader.java:180)
        at org.itxtech.mcl.Loader.main(Loader.java:84)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
        at java.base/java.security.Provider$Service.newInstance(Provider.java:1901)
        at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
        at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
        at java.base/javax.net.ssl.SSLContext.getInstance(SSLContext.java:168)
        at java.base/javax.net.ssl.SSLContext.getDefault(SSLContext.java:99)
        at java.net.http/jdk.internal.net.http.HttpClientImpl.<init>(HttpClientImpl.java:266)
        ... 5 more
Caused by: java.security.KeyStoreException: problem accessing trust store
        at java.base/sun.security.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:73)
        at java.base/javax.net.ssl.TrustManagerFactory.init(TrustManagerFactory.java:278)
        at java.base/sun.security.ssl.SSLContextImpl$DefaultManagersHolder.getTrustManagers(SSLContextImpl.java:1053)
        at java.base/sun.security.ssl.SSLContextImpl$DefaultManagersHolder.<clinit>(SSLContextImpl.java:1023)
        at java.base/sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:1198)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at java.base/java.security.Provider.newInstanceUtil(Provider.java:154)
        at java.base/java.security.Provider$Service.newInstance(Provider.java:1894)
        ... 10 more
Caused by: java.io.IOException: DerInputStream.getLength(): lengthTag=109, too big.
        at java.base/sun.security.util.DerInputStream.getLength(DerInputStream.java:606)
        at java.base/sun.security.util.DerValue.init(DerValue.java:390)
        at java.base/sun.security.util.DerValue.<init>(DerValue.java:331)
        at java.base/sun.security.util.DerValue.<init>(DerValue.java:344)
        at java.base/sun.security.pkcs12.PKCS12KeyStore.engineLoad(PKCS12KeyStore.java:1973)
        at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:222)
        at java.base/java.security.KeyStore.load(KeyStore.java:1479)
        at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.loadKeyStore(TrustStoreManager.java:365)
        at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.getTrustedCerts(TrustStoreManager.java:313)
        at java.base/sun.security.ssl.TrustStoreManager.getTrustedCerts(TrustStoreManager.java:55)
        at java.base/sun.security.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:49)
        ... 20 more

建议解决方法

import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

/**
 * java 信任SSL证书
 *
 * @author Administrator
 */
public class SslUtils {

    public static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }

    /**
     * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     *
     * @throws Exception
     */
    public static void ignoreSsl() throws Exception {
        HostnameVerifier hv = (urlHostName, session) -> true;
        System.out.println("忽略HTTPS请求的SSL证书");
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

    static class miTM implements TrustManager, X509TrustManager {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }

        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }
    }
}
qfys521 commented 1 year ago

小小建议,不成气候() 建议使用trustAllHttpsCertificates()方法

cssxsh commented 1 year ago

https://github.com/iTXTech/mirai-console-loader/blob/master/docs/Module.md#mcl-module

PeratX commented 1 year ago

可以使用MclModule API实现该功能。