Статьи

Как обезопасить сервис Apache Thrift

В предыдущем посте объяснялось, как создать службу Thrift и использовать ее в различных режимах, таких как блокирование, неблокирование и т. Д. Теперь, если вы думаете об использовании Apache Thrift для обмена данными между клиентом и сервером по общедоступной сети, есть вероятность, что вы можете выполнить требование защиты данных, передаваемых через Thrift. В этом посте объясняется, как SSL можно использовать для защиты связи между сервером Thrift и клиентом Thrift.

Предпосылки

1. Я буду использовать то же определение сервиса (arithmetic.thrift) и сгенерированные коды плюс реализацию сервиса (ArithmeticServiceImpl) из предыдущего поста.

2. Вам необходимо иметь хранилище ключей с закрытым ключом сервера на стороне сервера и хранилище доверенных сертификатов, содержащее открытый ключ сервера на стороне клиента. Для этого примера давайте создадим хранилище ключей и доверенное хранилище, используя JDK keytool.

Создание хранилища ключей

1. Перейдите в каталог bin установки Java в командной строке и выполните следующее.

keytool -genkeypair -alias certificatekey -keyalg RSA -validity 7 -keystore keystore.jks

 2. Дайте подходящий пароль и ответьте на подсказки. После этого он создаст хранилище ключей keystore.jks, содержащее сгенерированную пару секретный / открытый ключ.

3. Экспортируйте сертификат (cret.cer), содержащий открытый ключ, из хранилища ключей, используя следующую команду.

keytool -export -alias certificatekey -keystore keystore.jks -rfc -file cert.cer

 

Создать трастовый магазин

1. Теперь давайте создадим хранилище доверия (truststore.jks) и импортируем в него сертификат. Это можно сделать с помощью одной командной строки, как указано ниже.

keytool -import -alias certificatekey -file cert.cer -keystore truststore.jks

Снова введите пароль и скажите «да» в ответ на вопрос, доверять ли этому сертификату. На этом настройка сертификата завершена. Давайте создадим безопасный сервер Thrift и клиент для его использования.

Безопасный Комиссионный Сервер

Код для безопасного сервера приведен ниже. Он использует TSSLTransportFactory для получения безопасного сокета. Расположение хранилища ключей задается в качестве параметра. Измените параметры «path to keystore.jks » и «keystore.jks password» на подходящие значения в коде.

public class SecureServer {

    private void start() {
        try {
            TSSLTransportFactory.TSSLTransportParameters params =
                    new TSSLTransportFactory.TSSLTransportParameters();
            params.setKeyStore("path to keystore.jks", "keystore.jks password");

            TServerSocket serverTransport = TSSLTransportFactory.getServerSocket(
                    7911, 10000, InetAddress.getByName("localhost"), params);
            ArithmeticService.Processor processor = new ArithmeticService.Processor(new ArithmeticServiceImpl());

            TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).
                    processor(processor));
            System.out.println("Starting server on port 7911 ...");
            server.serve();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {

        }
    }

    public static void main(String[] args) {
        SecureServer srv = new SecureServer();
        srv.start();
    }

Secure Thrift Client

Код клиента приведен ниже. Как и в случае с сервером, замените параметры «path to trustore.jks» и «truststore.jks password» на фактические значения.

public class SecureClient {

    private void invoke() {
        TTransport transport;
        try {

            TSSLTransportFactory.TSSLTransportParameters params =
                    new TSSLTransportFactory.TSSLTransportParameters();
            params.setTrustStore("path to truststore.jks", "truststore.jks password");

            transport = TSSLTransportFactory.getClientSocket("localhost", 7911, 10000, params);
            TProtocol protocol = new TBinaryProtocol(transport);

            ArithmeticService.Client client = new ArithmeticService.Client(protocol);

            long addResult = client.add(100, 200);
            System.out.println("Add result: " + addResult);
            long multiplyResult = client.multiply(20, 40);
            System.out.println("Multiply result: " + multiplyResult);

            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }

 Вот и все. Теперь вы защитили свою службу Thrift с помощью SSL и создали защищенного клиента для общения с вашей защищенной службой.

Помимо этого метода вы также можете использовать транспорт TServlet, чтобы предоставить сервис Thrift сервлету и безопасно представить свой сервлет внешнему миру. Я опишу этот метод в следующем посте.

Источник: http://chamibuddhika.wordpress.com/2011/10/03/securing-a-thrift-service/