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