错误信息

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:                                                                 

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target

无法下载 http://maven.aliyun.com/nexus/content/repositories/jcenter 库文件。

原因分析

访问中心库请求时证书验证错误,重新生成即可。

解决办法

1,可以在其他工程中执行以下代码,生成maven.aliyun.com的证书,其他中心库修改网址即可,所有网址都生成之后才执行第二部。

package com.example.myapp;import org.junit.Test;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLException;import javax.net.ssl.SSLSocket;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManager;import javax.net.ssl.TrustManagerFactory;import javax.net.ssl.X509TrustManager;import static org.junit.Assert.*;/** * Example local unit test, which will execute on the development machine (host). * * @see Testing documentation */public class ExampleUnitTest {    @Test    public void addition_isCorrect() throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, KeyManagementException {        String args = "maven.aliyun.com";        String host;        int port;        char[] passphrase;        String[] c = args.split(":");        host = c[0];        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);        String p = "changeit";        passphrase = p.toCharArray();        File file = new File("jssecacerts");        if (file.isFile() == false) {            char SEP = File.separatorChar;            File dir = new File(System.getProperty("java.home") + SEP                    + "lib" + SEP + "security");            file = new File(dir, "jssecacerts");            if (file.isFile() == false) {                file = new File(dir, "cacerts");            }        }        System.out.println("Loading KeyStore " + file.getAbsolutePath() + "...");        InputStream in = new FileInputStream(file);        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());        ks.load(in, passphrase);        in.close();        SSLContext context = SSLContext.getInstance("TLS");        TrustManagerFactory tmf =                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());        tmf.init(ks);        X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);        context.init(null, new TrustManager[]{                tm        }, null);        SSLSocketFactory factory = context.getSocketFactory();        System.out.println("Opening connection to " + host + ":" + port + "...");        SSLSocket socket = (SSLSocket) factory.createSocket(host, port);        socket.setSoTimeout(10000);        try {            System.out.println("Starting SSL handshake...");            socket.startHandshake();            socket.close();            System.out.println();            System.out.println("No errors, certificate is already trusted");        } catch (                SSLException e) {            System.out.println();            e.printStackTrace(System.out);        }        X509Certificate[] chain = tm.chain;        if (chain == null) {            System.out.println("Could not obtain server certificate chain");            return;        }        System.out.println();        System.out.println("Server sent " + chain.length + " certificate(s):");        System.out.println();        MessageDigest sha1 = MessageDigest.getInstance("SHA1");        MessageDigest md5 = MessageDigest.getInstance("MD5");        for (                int i = 0;                i < chain.length; i++) {            X509Certificate cert = chain[i];            System.out.println                    (" " + (i + 1) + " Subject " + cert.getSubjectDN());            System.out.println("   Issuer  " + cert.getIssuerDN());            sha1.update(cert.getEncoded());            System.out.println("   sha1    " + toHexString(sha1.digest()));            md5.update(cert.getEncoded());            System.out.println("   md5     " + toHexString(md5.digest()));            System.out.println();        }        int k=1;        X509Certificate cert = chain[k];        String alias = host + "-" + (k + 1);        ks.setCertificateEntry(alias, cert);        OutputStream out = new FileOutputStream("jssecacerts");        ks.store(out, passphrase);        out.close();        System.out.println();        System.out.println(cert);        System.out.println();        System.out.println                ("Added certificate to keystore 'jssecacerts' using alias '"                        + alias + "'");    }    final char[] HEXDIGITS = "0123456789abcdef".toCharArray();    String toHexString(byte[] bytes) {        StringBuilder sb = new StringBuilder(bytes.length * 3);        for (int b : bytes) {            b &= 0xff;            sb.append(HEXDIGITS[b >> 4]);            sb.append(HEXDIGITS[b & 15]);            sb.append(' ');        }        return sb.toString();    }    class SavingTrustManager implements X509TrustManager {        private final X509TrustManager tm;        private X509Certificate[] chain;        SavingTrustManager(X509TrustManager tm) {            this.tm = tm;        }        public X509Certificate[] getAcceptedIssuers() {            throw new UnsupportedOperationException();        }        public void checkClientTrusted(X509Certificate[] chain, String authType)                throws CertificateException {            throw new UnsupportedOperationException();        }        public void checkServerTrusted(X509Certificate[] chain, String authType)                throws CertificateException {            this.chain = chain;            tm.checkServerTrusted(chain, authType);        }    }}

2、将生成的jssecacerts拷贝到Android Studio所配置的JDK的jre\lib\security\目录下,重启AS即可。

 

更多相关文章

  1. android利用matrix对图片中心旋转
  2. Android——高德地图设置中心点和缩放比例,获取两点之间距离
  3. Android SSL BKS证书的生成过程
  4. Android获取cpu和内存信息、网址的代码
  5. android一些有用的网址
  6. zxhwolfe开发点滴(相当多的Android开发相关文章,记住其网址)
  7. Android小项目之十二 设置中心的界面
  8. Android:证书生成与应用
  9. Android Studio 获取证书指纹SHA1

随机推荐

  1. android shape的使用
  2. Android开发案例:Android中几种图像特效处
  3. android selector的用法
  4. Android(安卓)Studio中如何隐藏顶部状态
  5. Android4.4支持使用DevTools对原生Androi
  6. Android(安卓)7.1预编译编译第三方so
  7. Spinner
  8. Android(安卓)NullPointerException解决
  9. [置顶] Android中以JAR形式封装控件或者
  10. Android开发平台Android(安卓)Studio学习