HttpClient 调用https接口的三种方式

最近在工作过程中遇到使用httpClient去call https接口失败的问题, 所以就此做了个学习记录, 在这过程中可以通过一下三种方式中的任何一种都解决了上诉问题

1.ignore https certificate

通过在httpClient call https接口之前先调用如下代码即可忽略https认证


private static DefaultHttpClient httpClientTrustingAllSSLCerts() throws NoSuchAlgorithmException, KeyManagementException {
    DefaultHttpClient httpclient = new DefaultHttpClient();
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, getTrustingManager(), new java.security.SecureRandom());
    SSLSocketFactory socketFactory = new SSLSocketFactory(sc);
    Scheme sch = new Scheme("https", 443, socketFactory);
    httpclient.getConnectionManager().getSchemeRegistry().register(sch);
    return httpclient;
}
private static TrustManager[] getTrustingManager() {
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws CertificateException {
        }
        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] x509Certificates, String s) throws CertificateException {
        }
        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    } };
    return trustAllCerts;
}

2. 通过加载指定证书达到证书校验(在httpClient call之前调用下列代码)

  • 首先需要将对应网站的cer证书从浏览器中导出, 步骤如下
    2.1 点击浏览器URL左侧图标, 然后点击证书
ssl1

2.2 点击详细信息tab, 然后点击"复制到文件选项"

ssl2

2.3 将证书导出为Base64编码格式, 继续点击下一步(比如我们保存名字为myaliyun.cer), 选择保存位置

ssl3

这时候我们就已经将cer导出来了!

2.4 结合之前导出来的certificate文件使用如下命令生成truststore

keytool -import -alias myaliyun -trustcacerts -file myaliyun.cer -keystore myaliyuntrust.jks

然后输入指定密码, 这是我们的trustStore就生成了, 最后就是在JavaCode中指定加载这个trustStore文件(下面keystore和trustStore均为上面我们gen的myaliyuntrust.jks)

  • 通过设置System环境变量加载我们刚刚生成的trust证书
        System.setProperty("javax.net.ssl.keyStore", "keyStore存放位置"));
        System.setProperty("javax.net.ssl.keyStorePassword", "keyStore密码");
        System.setProperty("javax.net.ssl.keyStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", "trustStore存放位置");
        System.setProperty("javax.net.ssl.trustStorePassword", "Trustore密码");
        System.setProperty("javax.net.ssl.trustType", "JKS");

3. 将安全证书导入到java的cacerts证书库(changeit为jdk cecerts证书库的默认密码)

  1. 和2.3步骤一样, 将对应网站的cetificate文件导出来, 这里我将这个证书放到了这个路径下<JAVA_HOME路径>/jre/lib/security/myaliyun.cer
  2. 将刚才导出来的certifate证书导入到java的cacerts证书库,切换到目录 <JAVA_HOME路径>/jre/lib/security, 执行如下命令:

keytool -import -alias myaliyun -keystore cacerts -file ${JAVA_HOME}/jre/lib/security/myaliyun.cer -storepass changeit

然后你会看到如下信息

C:\java\jdk1.8.0_251\jre\lib\security
λ keytool -import -alias myaliyun -keystore cacerts -file C:/java/jdk1.8.0_251/jre/lib/security/myaliyun.cer -storepass changeit
....
.... 
....
#8: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4C 7A 17 49 7B 8C 31 F0   48 93 A1 FC 83 CA D7 E9  Lz.I..1.H.......
0010: E0 C5 F7 0B                                        ....
]
]

Trust this certificate? [no]:  yes
Certificate was added to keystore

noted: HttpClient 使用例子

dependency

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.2.3</version>
</dependency>
            HttpClient httpClient = new DefaultHttpClient();
            httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 1000);
            httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000);
            HttpGet httpGet = null;
            try {
                httpGet = new HttpGet(url);
                HttpResponse response = httpClient.execute(httpGet);
                int httpStatus = response.getStatusLine().getStatusCode();
                if(httpStatus == HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    //to avoid throw exception when new json object, if the contentType is not json, .
                    String contentType = ContentType.getOrDefault(entity).getMimeType();
                    if(contentType.contains("application/json")) {
                        String getJson = EntityUtils.toString(entity);
                        JSONObject jsonObj = new JSONObject(getJson);
                        //the json obj should contains version key
                    }
                    //Consume response content
                    EntityUtils.consume(entity);
                }
            } catch (Exception e) {
        throw e;
            } finally {
                httpGet.abort();
                httpClient.getConnectionManager().shutdown();
            }

总结

个人还是比较推荐使用第三种将安全证书导入到java的cacerts证书库, 因为我们不需要改code, 只需要通过命令就可以了

ssl4

ssl5

还有一点需要注意的是, 我在测试过程中, 需要使用上面三种中任何一种做法的前提是当所访问网站的证书是不安全的时候才需要那么做的. 如果对应网站的证书是安全的, 则不需要上诉做法。 或者还有一种情况就是: 如果我们时候用的httpClient是3.x版本的, 那么无论这个网站的证书是否安全都需要我们添加上面三种方式中的其中一种了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352