1+ package fr.free.nrw.commons.di
2+
3+ import android.content.Context
4+ import android.util.Log
5+ import java.security.KeyManagementException
6+ import java.security.KeyStore
7+ import java.security.NoSuchAlgorithmException
8+ import java.security.SecureRandom
9+ import java.security.cert.Certificate
10+ import java.security.cert.CertificateException
11+ import java.security.cert.CertificateFactory
12+ import java.security.cert.X509Certificate
13+ import javax.net.ssl.*
14+
15+ object SslUtils {
16+
17+ fun getSslContextForCertificateFile (context : Context , fileName : String ): SSLContext {
18+ try {
19+ val keyStore = SslUtils .getKeyStore(context, fileName)
20+ val sslContext = SSLContext .getInstance(" SSL" )
21+ val trustManagerFactory = TrustManagerFactory .getInstance(TrustManagerFactory .getDefaultAlgorithm())
22+ trustManagerFactory.init (keyStore)
23+ sslContext.init (null , trustManagerFactory.trustManagers, SecureRandom ())
24+ return sslContext
25+ } catch (e: Exception ) {
26+ val msg = " Error during creating SslContext for certificate from assets"
27+ e.printStackTrace()
28+ throw RuntimeException (msg)
29+ }
30+ }
31+
32+ private fun getKeyStore (context : Context , fileName : String ): KeyStore ? {
33+ var keyStore: KeyStore ? = null
34+ try {
35+ val assetManager = context.assets
36+ val cf = CertificateFactory .getInstance(" X.509" )
37+ val caInput = assetManager.open(fileName)
38+ val ca: Certificate
39+ try {
40+ ca = cf.generateCertificate(caInput)
41+ Log .d(" SslUtilsAndroid" , " ca=" + (ca as X509Certificate ).subjectDN)
42+ } finally {
43+ caInput.close()
44+ }
45+
46+ val keyStoreType = KeyStore .getDefaultType()
47+ keyStore = KeyStore .getInstance(keyStoreType)
48+ keyStore!! .load(null , null )
49+ keyStore.setCertificateEntry(" ca" , ca)
50+ } catch (e: Exception ) {
51+ e.printStackTrace()
52+ }
53+
54+ return keyStore
55+ }
56+
57+ fun getTrustAllHostsSSLSocketFactory (): SSLSocketFactory ? {
58+ try {
59+ // Create a trust manager that does not validate certificate chains
60+ val trustAllCerts = arrayOf<TrustManager >(object : X509TrustManager {
61+
62+ override fun getAcceptedIssuers (): Array <X509Certificate > {
63+ return arrayOf()
64+ }
65+
66+ @Throws(CertificateException ::class )
67+ override fun checkClientTrusted (chain : Array <X509Certificate >, authType : String ) {
68+ }
69+
70+ @Throws(CertificateException ::class )
71+ override fun checkServerTrusted (chain : Array <X509Certificate >, authType : String ) {
72+ }
73+ })
74+
75+ // Install the all-trusting trust manager
76+ val sslContext = SSLContext .getInstance(" SSL" )
77+ sslContext.init (null , trustAllCerts, java.security.SecureRandom ())
78+ // Create an ssl socket factory with our all-trusting manager
79+
80+ return sslContext.socketFactory
81+ } catch (e: KeyManagementException ) {
82+ e.printStackTrace()
83+ return null
84+ } catch (e: NoSuchAlgorithmException ) {
85+ e.printStackTrace()
86+ return null
87+ }
88+
89+ }
90+ }
0 commit comments