OkHttp 2.0, използван ръчно проверяващ набор от шифри

Опитвам се да намеря начин да проверя Cipher Suite (CS), който е избран по време на ръкостискането на TLS. Искам да мога ръчно да изхвърля ръкостискането или поне да спра изпращането на тялото на http съобщението, ако CS не успее да премине ръчна проверка.

Искам подмножество от CS, използвайки персонализиран SocketFactory, но това не винаги се уважава от сървъра.

Играх си с това вътре в обратното извикване HandshakeCompletedListener, но това се оказва трудно. Хвърлянето на който и да е RuntimeException клас няма да направи нищо поради catch all в извикващия метод. Затварянето на сокета също няма да има значение, което според мен може вътрешно да хвърли изключение, което така или иначе не би било чудесно решение.

Всяка помощ би била чудесна.

РЕДАКТИРАНЕ: след отговора на @jesse-wilsons по-долу използвам 2.1-RC1 и класа ConnectionSpec, за да уточня какви пакети за шифроване (CS) искам да използвам – но има случаи, когато съществуваща SSL сесия може да бъде използвани повторно с различен пакет от шифри. Включих персонализиран HostNameVerifier, за да уловя всички случаи, при които SSL връзка се опитва да бъде настроена с различна от заявената CS. Това е малко като обувка, но не виждам друг начин за свързване, след като 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;
    }
}

person Dori    schedule 06.11.2014    source източник


Отговори (1)


Вземете OkHttp 2.1-RC1 и използвайте новия клас ConnectionSpec, за да ограничите комплектите за шифроване до тези, които харесвате.

person Jesse Wilson    schedule 06.11.2014
comment
Това е готино, благодаря - по-добър начин за указване на искания CS. Това обаче не гарантира, че се приемат само тези CS. Ще актуализирам отговора си по-горе с текущото решение, което използвам за принудителен избор на CS - би било чудесно, ако можете да ми кажете дали има по-лесен начин или дали горният подход ще причини проблеми. Благодаря :) - person Dori; 11.11.2014