我正在尝试找出一种检查在TLS握手期间选择的密码套件(CS)的方法。我希望能够手动退出握手,或者至少停止在CS通过手动检查时发送的http消息的正文。
我使用自定义SocketFactory
请求CS的子集但服务器并不总是这样做。
我在HandshakeCompletedListener
回调中玩过这个,但事实证明这很困难。由于调用方法中的catch全部,抛出任何RuntimeException
类将不会执行任何操作。关闭套接字也不会产生任何影响,我认为这可能会在内部引发异常,无论如何这都不是一个好的解决方案。
任何帮助都会很棒。
编辑:在@ jesse-wilsons回答下面之后我使用2.1-RC1和ConnectionSpec
类来指定我想要使用的密码套件(CS) - 但是有些情况当现有的SSL会话可以使用不同的密码套件重用时。我已经包含了一个自定义HostNameVerifier来捕获尝试使用与请求的CS不同的SSL连接设置的任何情况。这有点像鞋拔,但在SSL握手发生后我无法看到另一种方法。
public class HostnameAndCipherSuiteVerifier implements HostnameVerifier
{
private final String mHostname, mCipherSuite;
public HostnameAndCipherSuiteVerifier(String hostname, String cipherSuite)
{
mHostname = hostname;
mCipherSuite = cipherSuite;
}
@Override
public boolean verify(String hostname, SSLSession session)
{
//delegate to original hostname verifier
if(!OkHostnameVerifier.INSTANCE.verify(hostname, session))
{
XLog.w("delegate hostname check failed");
return false;
}
//hardcode check for domain
if(!hostname.equals(mHostname))
{
XLog.w("Hard-coding hostname fail");
return false;
}
//handshake cipher check
if(!session.getCipherSuite().equals(mCipherSuite))
{
XLog.w("cipher check failed");
return false;
}
else
return true;
}
}
答案 0 :(得分:1)
获取OkHttp 2.1-RC1并使用新的ConnectionSpec类将密码套件限制为您喜欢的密码套件。