|
10 | 10 |
|
11 | 11 | package at.bitfire.cert4android |
12 | 12 |
|
| 13 | +import android.net.SSLCertificateSocketFactory |
| 14 | +import org.apache.http.conn.ssl.AllowAllHostnameVerifier |
13 | 15 | import org.junit.Assume.assumeNotNull |
14 | 16 | import org.junit.Before |
15 | 17 | import org.junit.Test |
16 | 18 | import java.io.IOException |
17 | | -import java.net.InetSocketAddress |
18 | | -import java.net.Socket |
19 | 19 | import java.net.URL |
20 | | -import java.security.SecureRandom |
21 | 20 | import java.security.cert.CertificateException |
22 | 21 | import java.security.cert.X509Certificate |
23 | | -import javax.net.ssl.SSLContext |
24 | | -import javax.net.ssl.SSLSocket |
25 | | -import javax.net.ssl.TrustManager |
| 22 | +import javax.net.ssl.HttpsURLConnection |
26 | 23 | import javax.net.ssl.X509TrustManager |
27 | 24 |
|
28 | 25 | class CustomCertManagerTest { |
@@ -99,35 +96,30 @@ class CustomCertManagerTest { |
99 | 96 | * @return the certificates of the site |
100 | 97 | */ |
101 | 98 | fun getSiteCertificates(url: URL): List<X509Certificate> { |
102 | | - val port = if (url.port != -1) url.port else 443 |
103 | | - val host = url.host |
104 | | - |
105 | | - // Create a TrustManager which accepts all certificates |
106 | | - val trustAll = object : X509TrustManager { |
107 | | - override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) {} |
108 | | - override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {} |
109 | | - override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray() |
110 | | - } |
111 | | - |
112 | | - // Create an SSLContext using the trust-all manager |
113 | | - val sslContext = SSLContext.getInstance("TLS").apply { |
114 | | - init(null, arrayOf<TrustManager>(trustAll), SecureRandom()) |
115 | | - } |
116 | | - |
117 | | - // Create an SSL socket and force a TLS handshake |
118 | | - val socket = Socket().apply { |
119 | | - soTimeout = 5000 // read timeout |
120 | | - connect( |
121 | | - InetSocketAddress(host, port), |
122 | | - 5000 // connect timeout |
123 | | - ) |
124 | | - } |
125 | | - sslContext.socketFactory.createSocket(socket, host, port, true).use { socket -> |
126 | | - val sslSocket = socket as SSLSocket |
127 | | - // Explicitly start the handshake (gets certificate) |
128 | | - sslSocket.startHandshake() |
129 | | - // server certificates now available in SSLSession |
130 | | - return sslSocket.session.peerCertificates.map { it as X509Certificate } |
| 99 | + val conn = url.openConnection() as HttpsURLConnection |
| 100 | + try { |
| 101 | + conn.hostnameVerifier = AllowAllHostnameVerifier() |
| 102 | + conn.sslSocketFactory = object : SSLCertificateSocketFactory(1000) { |
| 103 | + init { |
| 104 | + setTrustManagers(arrayOf(object : X509TrustManager { |
| 105 | + override fun checkClientTrusted( |
| 106 | + chain: Array<out X509Certificate?>?, |
| 107 | + authType: String? |
| 108 | + ) { /* OK */ } |
| 109 | + override fun checkServerTrusted( |
| 110 | + chain: Array<out X509Certificate?>?, |
| 111 | + authType: String? |
| 112 | + ) { /* OK */ } |
| 113 | + override fun getAcceptedIssuers(): Array<out X509Certificate?>? = emptyArray() |
| 114 | + })) |
| 115 | + } |
| 116 | + } |
| 117 | + conn.inputStream.read() |
| 118 | + val certs = mutableListOf<X509Certificate>() |
| 119 | + conn.serverCertificates.forEach { certs += it as X509Certificate } |
| 120 | + return certs |
| 121 | + } finally { |
| 122 | + conn.disconnect() |
131 | 123 | } |
132 | 124 | } |
133 | 125 |
|
|
0 commit comments