feiyu02
2024-11-19 752e00503f672ddfe2066afb6c235721a3a912b5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package cn.flightfeather.supervision.common.net
 
import org.apache.commons.httpclient.ConnectTimeoutException
import org.apache.commons.httpclient.HttpClientError
import org.apache.commons.httpclient.params.HttpConnectionParams
import org.apache.commons.httpclient.protocol.ControllerThreadSocketFactory
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory
import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory
import java.io.IOException
import java.net.InetAddress
import java.net.Socket
import java.net.UnknownHostException
import java.security.cert.CertificateException
import java.security.cert.X509Certificate
import javax.net.ssl.*
 
 
/**
 * 通过java 进行访问有时候会有证书进行拦截
 */
object SkipCertificateValidation {
    /**
     * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     * @throws Exception
     */
    @Throws(Exception::class)
    fun ignoreSsl() {
        val hv = HostnameVerifier { urlHostName, session ->
            println("Warning: URL Host: " + urlHostName + " vs. " + session.peerHost)
            true
        }
        trustAllHttpsCertificates()
        HttpsURLConnection.setDefaultHostnameVerifier(hv)
    }
 
    @Throws(Exception::class)
    private fun trustAllHttpsCertificates() {
        val trustAllCerts = arrayOfNulls<TrustManager>(1)
        val tm: TrustManager = MiTM()
        trustAllCerts[0] = tm
        val sc = SSLContext.getInstance("SSL")
        sc.init(null, trustAllCerts, null)
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.socketFactory)
    }
 
    internal class MiTM : X509TrustManager {
        override fun getAcceptedIssuers(): Array<X509Certificate>? {
            return null
        }
 
        @Throws(CertificateException::class)
        override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) {
            return
        }
 
        @Throws(CertificateException::class)
        override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) {
            return
        }
    }
 
    class MySecureProtocolSocketFactory : ProtocolSocketFactory {
        //这里添加一个属性,主要目的就是来获取ssl跳过验证
        private var sslContext: SSLContext? = null
 
        /**
         * 判断获取SSLContext
         * @return
         */
        private val sSLContext: SSLContext?
            get() {
                if (sslContext == null) {
                    sslContext = createEasySSLContext()
                }
                return sslContext
            }
 
        //后面的方法基本上就是带入相关参数就可以了
        /*
     * (non-Javadoc)
     *
     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
     *      int, java.net.InetAddress, int)
     */
        @Throws(IOException::class, UnknownHostException::class)
        override fun createSocket(host: String, port: Int, clientHost: InetAddress?, clientPort: Int): Socket {
            return sSLContext!!.socketFactory.createSocket(host, port, clientHost, clientPort)
        }
 
        /*
     * (non-Javadoc)
     *
     * @see org.apache.commons.httpclient.protocol.ProtocolSocketFactory#createSocket(java.lang.String,
     *      int, java.net.InetAddress, int,
     *      org.apache.commons.httpclient.params.HttpConnectionParams)
     */
        @Throws(IOException::class, UnknownHostException::class, ConnectTimeoutException::class)
        override fun createSocket(
            host: String, port: Int, localAddress: InetAddress?, localPort: Int,
            params: HttpConnectionParams?
        ): Socket {
            requireNotNull(params) { "Parameters may not be null" }
            val timeout: Int = params.connectionTimeout
            return if (timeout == 0) {
                createSocket(host, port, localAddress, localPort)
            } else {
                ControllerThreadSocketFactory.createSocket(this, host, port, localAddress, localPort, timeout)
            }
        }
 
        /*
     * (non-Javadoc)
     *
     * @see SecureProtocolSocketFactory#createSocket(java.lang.String,int)
     */
        @Throws(IOException::class, UnknownHostException::class)
        override fun createSocket(host: String, port: Int): Socket {
            return sSLContext!!.socketFactory.createSocket(host, port)
        }
 
        /*
     * (non-Javadoc)
     *
     * @see SecureProtocolSocketFactory#createSocket(java.net.Socket,java.lang.String,int,boolean)
     */
//        @Throws(IOException::class, UnknownHostException::class)
//        override fun createSocket(socket: Socket?, host: String?, port: Int, autoClose: Boolean): Socket {
//            return sSLContext!!.socketFactory.createSocket(socket, host, port, autoClose)
//        }
 
        companion object {
            /**
             * 这个创建一个获取SSLContext的方法,导入MyX509TrustManager进行初始化
             * @return
             */
            private fun createEasySSLContext(): SSLContext {
                return try {
                    val context = SSLContext.getInstance("SSL")
                    context.init(
                        null, arrayOf(MiTM()),
                        null
                    )
                    context
                } catch (e: Exception) {
                    throw HttpClientError(e.toString())
                }
            }
        }
    }
}