В предыдущем посте объяснялось, как создать службу 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/