OkHttp 2.0手动验证正在使用的密码套件

时间:2014-11-06 17:12:04

标签: java android okhttp

我正在尝试找出一种检查在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;
    }
}

1 个答案:

答案 0 :(得分:1)

获取OkHttp 2.1-RC1并使用新的ConnectionSpec类将密码套件限制为您喜欢的密码套件。