package Ġco il . sample Ċ Ċ import Ġandroid . os . Build . VERSION . SDK _ INT Ċ import Ġandroid . os . Build . VERSION _ CODES . J EL LY _ BE AN Ċ import Ġandroid . os . Build . VERSION _ CODES . LO L LI POP Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġokhttp 3 . Connection Spec Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Tls Version Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Socket Ċ import Ġjava . net . Unknown Host Exception Ċ import Ġjava . security . KeyStore Ċ import Ġjavax . net . ssl . SSL Context Ċ import Ġjavax . net . ssl . SS LS ocket Ċ import Ġjavax . net . ssl . SS LS ocket Factory Ċ import Ġjavax . net . ssl . Trust ManagerFactory Ċ import Ġjavax . net . ssl . X 5 0 9 Trust Manager Ċ Ċ private Ġconst Ġval ĠTLS _ 1 _ 2 Ġ= Ġ" TLS v 1 . 2 " Ċ private Ġval ĠTLS _ 1 _ 2 _ ONLY Ġ= ĠarrayOf ( TLS _ 1 _ 2 ) Ċ private Ġval ĠCONNECTION _ SPEC _ TLS _ 1 _ 2 _ ONLY Ġ= Ġrun Ġ{ ĊĠĠĠ ĠConnection Spec . Builder ( Connection Spec . MO DER N _ TLS ) ĊĠĠĠĠĠĠĠ Ġ. tls Versions ( Tls Version . TLS _ 1 _ 2 ) ĊĠĠĠĠĠĠĠ Ġ. build () Ċ } Ċ Ċ /** Ċ Ġ* ĠForce Ġthe Ġ[ Ok HttpClient ] Ġto Ġonly Ġaccept ĠTLS Ġ 1 . 2 Ġconnections . Ċ Ġ* Ċ Ġ* ĠThis Ġenables ĠTLS Ġ 1 . 2 Ġsupport Ġon ĠAPI Ġ 1 6 +. Ċ Ġ*/ Ċ @ Requires Api ( J EL LY _ BE AN ) Ċ fun ĠOk HttpClient . Builder . force Tls 1 2 (): ĠOk HttpClient . Builder Ġ{ ĊĠĠĠ Ġ// ĠTLS Ġ 1 . 2 Ġis Ġenabled Ġby Ġdefault Ġon ĠL ol lip op Ġand Ġabove . ĊĠĠĠ Ġif Ġ( SDK _ INT Ġ>= ĠL OL LI POP ) Ġreturn Ġthis ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġssl Context Ġ= ĠSSL Context . getInstance ( TLS _ 1 _ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġtrust Manager Ġ= ĠgetDefault Trust Manager () ĊĠĠĠĠĠĠĠ Ġssl Context . init ( null , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġsocket Factory Ġ= ĠT ls 1 2 Socket Factory ( ssl Context . socket Factory ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġdon 't Ġfind Ġthe ĠX 5 0 9 Trust Manager , Ġlet ĠOk Http Ġtry Ġto Ġfind Ġit . ĊĠĠĠĠĠĠĠ Ġif Ġ( trust Manager Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġssl Socket Factory ( socket Factory , Ġtrust Manager ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġssl Socket Factory ( socket Factory ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconnection Specs ( listOf ( CONNECTION _ SPEC _ TLS _ 1 _ 2 _ ONLY )) ĊĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{} ĊĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** ĠFind Ġand Ġinitialize Ġthe Ġdefault Ġtrust Ġmanager . Ġ*/ Ċ private Ġfun ĠgetDefault Trust Manager (): ĠX 5 0 9 Trust Manager ? Ġ{ ĊĠĠĠ Ġval Ġalgorithm Ġ= ĠTrust ManagerFactory . getDefault Algorithm () ĊĠĠĠ Ġval Ġfactory Ġ= ĠTrust ManagerFactory . getInstance ( algorithm ) ĊĠĠĠ Ġfactory . init ( null Ġas ĠKey Store ?) ĊĠĠĠ Ġreturn Ġfactory . trust Managers . find Instance () Ċ } Ċ Ċ /** ĠA ĠSocket Factory Ġthat Ġforces ĠTLS Ġv 1 . 2 . Ġ*/ Ċ @ Requires Api ( J EL LY _ BE AN ) Ċ private Ġclass ĠT ls 1 2 Socket Factory ( private Ġval Ġdelegate : ĠSSL Socket Factory ) Ġ: ĠSSL Socket Factory () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetDefault Cipher Su ites (): ĠArray < String > Ġ= Ġdelegate . default Cipher Su ites ĊĊĠĠĠ Ġoverride Ġfun Ġget Supported Cipher Su ites (): ĠArray < String > Ġ= Ġdelegate . supported Cipher Su ites ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( socket : ĠSocket , Ġhost : ĠString , Ġport : ĠInt , Ġauto Close : ĠBoolean ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( delegate . create Socket ( socket , Ġhost , Ġport , Ġauto Close )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠUnknown Host Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( host : ĠString , Ġport : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( delegate . create Socket ( host , Ġport )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠUnknown Host Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( host : ĠString , Ġport : ĠInt , Ġlocal Host : ĠInet Address , Ġlocal Port : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( delegate . create Socket ( host , Ġport , Ġlocal Host , Ġlocal Port )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( host : ĠInet Address , Ġport : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( delegate . create Socket ( host , Ġport )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcreate Socket ( address : ĠInet Address , Ġport : ĠInt , Ġlocal Address : ĠInet Address , Ġlocal Port : ĠInt ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrap ( delegate . create Socket ( address , Ġport , Ġlocal Address , Ġlocal Port )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrap ( socket : ĠSocket ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( socket Ġis ĠSSL Socket ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . enabled Protocols Ġ= ĠTLS _ 1 _ 2 _ ONLY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsocket ĊĠĠĠ Ġ} Ċ } Ċ