Java與HTTPS

什么是HTTPS

嚴(yán)格地講变姨,HTTPS并不是一個(gè)單獨(dú)的協(xié)議,而是對(duì)工作在一加密連接(TLS或SSL)上的常規(guī)HTTP協(xié)議的稱呼熬北。

TLS/SSL

關(guān)于TLS/SSL的介紹網(wǎng)上已經(jīng)有很多,大家可以參考《SSL/TLS協(xié)議運(yùn)行機(jī)制的概述》《圖解SSL/TLS協(xié)議》中的介紹

Java與HTTPS

JDK中對(duì) HTTPS 版本的支持情況

  • JDK 6
    SSL v3
    TLS v1(默認(rèn))
    TLS v1.1(JDK6 update 111 及以上)

  • JDK 7
    SSLv3
    TLS v1(默認(rèn))
    TLS v1.1
    TLS v1.2

  • JDK 8
    SSL v3
    TLS v1
    TLS v1.1
    TLS v1.2(默認(rèn))

Java在使用HTTPS時(shí)遇到的問題

首先看一個(gè)錯(cuò)誤:

java.net.SocketException: Connection reset

    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
    at sun.security.ssl.InputRecord.read(InputRecord.java:480)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at httpsTest.HttpsSendTest.basicHttpsGet(HttpsSendTest.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

背景

最近在使用的第三方接口升級(jí)了TLS協(xié)議,只支持TLSv1.2啃擦,而我們的機(jī)器使用的JDK版本為JDK1.7,默認(rèn)使用的是TLSv1饿悬,所以當(dāng)服務(wù)端只支持TLSv1.2時(shí)會(huì)報(bào)異常

解決

解決方案很簡(jiǎn)單令蛉,只需要在啟動(dòng)參數(shù)加上-Dhttps.protocols=TLSv1.2即可

下面我們驗(yàn)證下此解決方案是否有效

  • 使用 HttpURLConnection發(fā)送HTTPS請(qǐng)求訪問百度(未修改啟動(dòng)參數(shù))
/**
 * Created by wujiang on 2017/6/30.
 */
public class HttpsSendTest {
    @Test
    public void basicHttpsGet() throws Exception {

        String url = "https://www.baidu.com";

        URL obj = new URL(url);

        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        sslContext.init(null, null, null);

        HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
        con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) ...");
        con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        con.setRequestMethod("GET");

        InputStream inputStream = con.getInputStream();
        Scanner scanner = new Scanner(inputStream, "UTF-8");
        String text = scanner.useDelimiter("\\A").next();
        System.out.println(text);
        scanner.close();
    }
}
  • 通過wireShark抓包可以看到使用的協(xié)議為TLSv1(JDK1.7)
  • 修改啟動(dòng)參數(shù)(jdk1.7)

再次請(qǐng)求 可以看到協(xié)議變?yōu)門LSv1.2

  • 使用JDK1.8我們?cè)倏纯?/li>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狡恬,隨后出現(xiàn)的幾起案子珠叔,更是在濱河造成了極大的恐慌,老刑警劉巖弟劲,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷安,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兔乞,警方通過查閱死者的電腦和手機(jī)辆憔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)报嵌,“玉大人虱咧,你說(shuō)我怎么就攤上這事∶” “怎么了腕巡?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)血筑。 經(jīng)常有香客問我绘沉,道長(zhǎng)煎楣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任车伞,我火速辦了婚禮择懂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘另玖。我一直安慰自己困曙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布谦去。 她就那樣靜靜地躺著慷丽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳄哭。 梳的紋絲不亂的頭發(fā)上要糊,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音妆丘,去河邊找鬼锄俄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛勺拣,可吹牛的內(nèi)容都是我干的珊膜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼宣脉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了剔氏?” 一聲冷哼從身側(cè)響起塑猖,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谈跛,沒想到半個(gè)月后羊苟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡感憾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蜡励,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻桅。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凉倚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫂沉,到底是詐尸還是另有隱情稽寒,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布趟章,位于F島的核電站杏糙,受9級(jí)特大地震影響慎王,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宏侍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一赖淤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谅河,春花似錦咱旱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至锨天,卻和暖如春毯盈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背病袄。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工搂赋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人益缠。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓脑奠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幅慌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宋欺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,891評(píng)論 2 8
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司胰伍,掛了不少齿诞,但最終還是拿到小米、百度骂租、阿里祷杈、京東、新浪渗饮、CVTE但汞、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,277評(píng)論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)互站,斷路器私蕾,智...
    卡卡羅2017閱讀 134,707評(píng)論 18 139
  • 1.OkHttp源碼解析(一):OKHttp初階2 OkHttp源碼解析(二):OkHttp連接的"前戲"——HT...
    隔壁老李頭閱讀 20,874評(píng)論 24 176
  • 昨天彤彤拿著筆在紙上寫寫畫畫,不知道是無(wú)意還是有心胡桃,寫出了“中3”是目,然后問我:你知道這是什么嗎?我說(shuō)這不是中嗎标捺?她...
    Vera112閱讀 666評(píng)論 0 51