android ip直连,Android使用HTTPS进行IP直连握手失败问题(okHttp)

public class TlsSniSocketFactory extendsSSLSocketFactory {private final String TAG = TlsSniSocketFactory.class.getSimpleName();

HostnameVerifier hostnameVerifier=HttpsURLConnection.getDefaultHostnameVerifier();

String peerHost;publicTlsSniSocketFactory(String peerHost) {this.peerHost =peerHost;

}publicTlsSniSocketFactory() {

}

@OverridepublicSocket createSocket() {return null;

}

@Overridepublic Socket createSocket(String host, intport) {return null;

}

@Overridepublic Socket createSocket(String host, int port, InetAddress localHost, intlocalPort) {return null;

}

@Overridepublic Socket createSocket(InetAddress host, intport) {return null;

}

@Overridepublic Socket createSocket(InetAddress address, int port, InetAddress localAddress, intlocalPort) {return null;

}//TLS layer

@OverridepublicString[] getDefaultCipherSuites() {return new String[0];

}

@OverridepublicString[] getSupportedCipherSuites() {return new String[0];

}

@Overridepublic Socket createSocket(Socket plainSocket, String host, int port, boolean autoClose) throwsIOException {

if(TextUtils.isEmpty(peerHost)) {

peerHost=host;

peerHost=....;

} Log.i(TAG, "customized createSocket. host: " +peerHost);

InetAddress address=plainSocket.getInetAddress();if(autoClose) {//we don't need the plainSocket

plainSocket.close();

}//create and connect SSL socket, but don't do hostname/certificate verification yet

SSLCertificateSocketFactory sslSocketFactory = (SSLCertificateSocketFactory) SSLCertificateSocketFactory.getDefault(0);

SSLSocket ssl=(SSLSocket) sslSocketFactory.createSocket(address, port);//enable TLSv1.1/1.2 if available

ssl.setEnabledProtocols(ssl.getSupportedProtocols());//set up SNI before the handshake

if (Build.VERSION.SDK_INT >=Build.VERSION_CODES.JELLY_BEAN_MR1) {

Log.i(TAG,"Setting SNI hostname");

sslSocketFactory.setHostname(ssl, peerHost);

}else{

Log.d(TAG,"No documented SNI support on Android <4.2, trying with reflection");try{

java.lang.reflect.Method setHostnameMethod= ssl.getClass().getMethod("setHostname", String.class);

setHostnameMethod.invoke(ssl, peerHost);

}catch(Exception e) {

Log.w(TAG,"SNI not useable", e);

}

}//verify hostname and certificate

SSLSession session =ssl.getSession();if (!hostnameVerifier.verify(peerHost, session))throw new SSLPeerUnverifiedException("Cannot verify hostname: " +peerHost);

Log.i(TAG,"Established " + session.getProtocol() + " connection with " + session.getPeerHost() +

" using " +session.getCipherSuite());returnssl;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值