Android Studio 修復(fù)同步證書問題

1配置Java環(huán)境

將你電腦的Java環(huán)境變量配置成AndroidStudio的所使用的Java環(huán)境备徐,為什么要配置版姑?這方便等會(huì)添加證書的時(shí)候是針對(duì)AndroidStudio所使用的Java環(huán)境(注意:如果你電腦已經(jīng)配置好了JAVA_HOME摸屠,我仍然建議你暫時(shí)先配置成AndroidStudio的Java環(huán)境帆吻,因?yàn)椴煌腏ava版本證書可能是不一致的展运,截止發(fā)教程前最新的AndroidStudio3.5.5版本您访,使用的仍是Java8铅忿,但我看到有些人的電腦已經(jīng)配置到Java11了,如果你已經(jīng)配置了灵汪,請(qǐng)暫時(shí)先記錄下檀训,然后刪除,等你修復(fù)好AndroidStudio之后享言,再配置回來)

(1)將AndroidStudio里的jre配置成JAVA_HOME變量

打開環(huán)境變量:此電腦->屬性->高級(jí)系統(tǒng)設(shè)置->高級(jí)->環(huán)境變量
配置環(huán)境變量:系統(tǒng)變量新建JAVA_HOME峻凫,輸入AndroidStudio目錄下Java的環(huán)境變量,然后確定保存(如圖所示)

image

然后編輯一下Path環(huán)境變量览露,在Path環(huán)境變量分別加入%JAVA_HOME%\bin和%JAVA_HOME%\lib(如圖所示)

image

(2)使用cmd檢查當(dāng)前的java環(huán)境荧琼,輸入where java可查到j(luò)ava.exe所在位置

C:\Users\Administrator>where java
D:\AndroidStudio\jre\bin\java.exe
C:\Users\Administrator>

2.安裝證書

2.1桌面新建一個(gè)文件夾cert,在里面新建一個(gè)文件InstallCert.java代碼如下

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.*;
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;
public class InstallCert {

    public static void main(String[] args) throws Exception {
        String host = "10.0.31.32"; //輸入服務(wù)端地址
        int port = 443; //輸入服務(wù)端端口 一般默認(rèn)443

        String p = "changeit"; //一般默認(rèn)changeit
        char[] 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 + "...");
        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;
        }

        BufferedReader reader =
                new BufferedReader(new InputStreamReader(System.in));

        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();
        }

        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }

        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 + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static 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();
    }

    private static 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.2修改代碼

  • 在本例中差牛,我在桌面新建了一個(gè)Cert文件夾命锄,我把InstallCert.java放到了Cert文件夾中,便于修改和管理
  • 修改InstallCert.java代碼中"10.0.31.32"為你在AndroidStudio中無法驗(yàn)證證書的域名偏化,改完后應(yīng)該是下面這樣的
        String host = "jcenter.bintray.com"; //輸入服務(wù)端地址
        int port = 443; //輸入服務(wù)端端口 一般默認(rèn)443

(注意脐恩,你的可能是"dl.google.com"或者是"d29vzk4ow07wi7.cloudfront.net",具體的需要看它報(bào)錯(cuò)的域名夹孔,如果你是第一次安裝,請(qǐng)一次性加完三個(gè)域名再進(jìn)行后面的操作析孽,也就是你需要進(jìn)行三次javac和三次java命令搭伤,這樣出錯(cuò)的概率會(huì)非常低)

image

2.3獲取證書

  • 當(dāng)你修改好并保存文件之后,使用cmd進(jìn)入到桌面的Cert目錄袜瞬,輸入命令javac InstallCert.java怜俐,然后按回車來編譯它

    ![<meta charset="utf-8">

  • 當(dāng)你修改好并保存文件之后,使用cmd進(jìn)入到桌面的Cert目錄邓尤,輸入命令javac InstallCert.java拍鲤,然后按回車來編譯它

    image
    • 輸入命令java InstallCert,回車進(jìn)行證書獲取汞扎,會(huì)看到下面這樣的結(jié)果后季稳,輸入回車確認(rèn)添加證書
    image
    • 這是證書添加成功的結(jié)果,你會(huì)在當(dāng)前目錄得到一個(gè)jssecacerts文件澈魄,該文件是經(jīng)過先獲取到當(dāng)前Java環(huán)境的證書景鼠,然后再將代碼中指定網(wǎng)站的證書合并成一個(gè)新的證書文件,所以我們后面需要做的是把舊的證書文件替換成我們現(xiàn)在所生成的新證書文件
    image

2.4替換證書文件

<meta charset="utf-8">

打開AndroidStudio的安裝目錄痹扇,進(jìn)入到j(luò)re->jre->lib->security里铛漓,將cacerts重命名成cacerts1溯香,然后把jssecacerts拷貝到當(dāng)前目錄,并命名成cacerts

image

3.刷新AndroidStudio緩存浓恶,使配置生效

回到AndroidStudio玫坛,選擇“File -> Invalidate Caches / Restart”,這個(gè)時(shí)候包晰,AndroidStudio會(huì)自動(dòng)重啟湿镀,如果你的Gradle進(jìn)程沒有再運(yùn)行,并且運(yùn)行按鈕是灰色的杜窄,請(qǐng)點(diǎn)擊“File -> Sync Project with Gradle Files”

image

到這一步肠骆,問題基本已經(jīng)解決【請(qǐng)注意,如果你Invalidate Caches / Restart之后塞耕,還遇到這個(gè)問題蚀腿,你應(yīng)該查看錯(cuò)誤的域名是不是變了,一般是變成你沒添加過的域名扫外,例如:你添加了jcenter.bintrary.com莉钙,但你做完以上操作之后,錯(cuò)誤的域名變成dl.google.com或者d29vzk4ow07wi7.cloudfront.net筛谚,那么你需要再次添加其它域名的證書磁玉,一般出現(xiàn)這個(gè)錯(cuò)誤,那么你通常是要進(jìn)行三次添加證書操作驾讲,然后三次Invalidate Caches / Restart才能解決蚊伞,如果依舊錯(cuò)誤,可能是操作有誤吮铭,可以加我Q群?jiǎn)枂柟逼龋缬卸鄠€(gè)java環(huán)境,可能會(huì)導(dǎo)致你卡在無法使用java InstallCert命令】(完)

作者:Analyas
鏈接:http://www.reibang.com/p/89ca5b635d3f
來源:簡(jiǎn)書
著作權(quán)歸作者所有谓晌。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)掠拳,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纸肉,一起剝皮案震驚了整個(gè)濱河市溺欧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柏肪,老刑警劉巖姐刁,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烦味,居然都是意外死亡龙填,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岩遗,“玉大人扇商,你說我怎么就攤上這事∷藿福” “怎么了案铺?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)梆靖。 經(jīng)常有香客問我控汉,道長(zhǎng),這世上最難降的妖魔是什么返吻? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任姑子,我火速辦了婚禮,結(jié)果婚禮上测僵,老公的妹妹穿的比我還像新娘街佑。我一直安慰自己,他們只是感情好捍靠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布沐旨。 她就那樣靜靜地躺著,像睡著了一般榨婆。 火紅的嫁衣襯著肌膚如雪磁携。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天良风,我揣著相機(jī)與錄音谊迄,去河邊找鬼。 笑死烟央,一個(gè)胖子當(dāng)著我的面吹牛统诺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吊档,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼篙议,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唾糯!你這毒婦竟也來了怠硼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤移怯,失蹤者是張志新(化名)和其女友劉穎香璃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舟误,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葡秒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯牧。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹋岩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出学少,到底是詐尸還是另有隱情剪个,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布版确,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒸其。R本人自食惡果不足惜腺毫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吓蘑。 院中可真熱鬧惕虑,春花似錦、人聲如沸士修。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棋嘲。三九已至酒唉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沸移,已是汗流浹背痪伦。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雹锣,地道東北人网沾。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蕊爵,于是被迫代替她去往敵國和親辉哥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容