Эта часть показывает Вам, как создать приложения, которые выполняют безопасную связь. SE Java 6 платформ обеспечивают три стандартных API, которые позволяют приложениям выполнять безопасную связь: Java Универсальная Служба безопасности (GSS), Java API SASL, и Расширение Защищенного сокета Java (JSSE). Создавая приложение, которое из этих API следует использовать? Ответ зависит от многих факторов, включая требования протокола или службы, инфраструктуры развертывания, и интеграции с другими службами безопасности. Например, если бы Вы создаете клиентскую библиотеку LDAP, Вы должны были бы использовать Java API SASL, потому что использование SASL является частью определения протокола LDAP. Как другой пример, если служба поддерживает SSL, то клиентское приложение, пытающееся получить доступ к службе, должно было бы использовать JSSE.
Упражнение 3: Используя Java Универсальная Служба безопасности (GSS) API
Цель этого осуществления:
Цель этого осуществления состоит в том, чтобы изучить, как использовать Java API GSS , чтобы выполнить безопасную аутентификацию и передачу.
Фон для этого осуществления:
Универсальный API Службы безопасности обеспечивает универсальный интерфейс языка C, чтобы получить доступ к различным службам безопасности, таким как аутентификация, целостность сообщения, и конфиденциальность сообщения. Java API GSS обеспечивает соответствующий интерфейс для приложений Java. Это позволяет приложениям выполнять аутентификацию и устанавливать безопасную передачу с коллегой. Одной из наиболее распространенной службы безопасности, к которой получают доступ через GSS-API и GSS-API Java, является Kerberos.
Это осуществление является клиент-серверным приложением, которое демонстрирует, как передать надежно использование Java API GSS. Части клиента и сервера сначала аутентифицируют к Kerberos, как показано в Упражнении 1. Это хранит учетные данные в предмете. Приложение тогда выполняет действие, которое выполняет Java операции GSS (с Kerberos как базовый механизм GSS) в Subject.doAs, используя предмет. Java GSS механизм Kerberos, потому что это выполняется в doAs, получает учетные данные Kerberos из предмета, и использует их, чтобы аутентифицировать с коллегой и обмениваться сообщениями надежно.
Этот фрагмент кода определяет действие, чтобы выполниться после того, как принципал службы аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Код сначала создает экземпляр GSSManager [строка 8], который это использует, чтобы получить ее собственные учетные данные [строка 10-11] и создать экземпляр GSSContext [строка 18]. Это использует этот контекст, чтобы выполнить аутентификацию [цикл между строками 22-34]. После завершающейся аутентификации это принимает зашифрованный ввод от клиента и использует установленный контекст защиты, чтобы дешифровать данные [строка 45]. Это тогда использует контекст защиты, чтобы зашифровать ответ, содержащий исходный ввод и дату [строка 49], и затем отсылает это назад к клиенту.
Листинг кода для GssServer.java.
static class GssServerAction implements PrivilegedExceptionAction {
...
public Object run() throws Exception {
// Create server socket for accepting connections
ServerSocket ss = new ServerSocket(localPort);
// Get own Kerberos credentials for accepting connection
Этот фрагмент кода определяет действие, чтобы выполниться после того, как клиентский принципал аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Код сначала создает экземпляр GSSManager [строка 10], который это использует, чтобы получить основное имя для службы, которую это собирается передать с [строка 12]. Это тогда создает экземпляр GSSContext [строка 15,16], чтобы выполнить аутентификацию [цикл между строками 22-33] со службой. После завершающейся аутентификации это использует установленный контекст защиты, чтобы зашифровать сообщение [строка 42] и отправляет это серверу. Это тогда читает зашифрованное сообщение из сервера и декодирует это использующий установленный контекст защиты [строка 53].
Листинг кода для GssClient.java.
static class GssClientAction implements PrivilegedExceptionAction {
...
public Object run() throws Exception {
// Create socket to server
Socket socket = new Socket(hostName, port);
DataInputStream inStream = new DataInputStream(socket.getInputStream());
DataOutputStream outStream = new DataOutputStream(socket.getOutputStream());
Выполните клиентское приложение. GssClient берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit.
Received message: Hello There! Thu May 06 12:11:15 PDT 2005
Сводка:
В этом осуществлении Вы изучили, как записать клиент-серверное приложение, которое использует Java API GSS, чтобы аутентифицировать и связаться надежно друг с другом.
Следующие Шаги
Продолжите к Упражнению 4, чтобы изучить, как записать клиент-серверное приложение, которое использует Java API SASL, чтобы аутентифицировать и связаться надежно друг с другом.
Продолжите к Упражнению 5, чтобы изучить, как записать клиент-серверное приложение, которое использует JSSE, чтобы аутентифицировать и связаться надежно друг с другом.
Продолжите к Упражнению 6, чтобы изучить, как сконфигурировать примеры программ, что Вы только что имели обыкновение достигать единственного входа в систему в среде Kerberos.
Упражнение 4: Используя Java API SASL
Цель этого осуществления:
Цель этого осуществления состоит в том, чтобы изучить, как использовать Java API SASL , чтобы выполнить безопасную аутентификацию и передачу.
Фон для этого осуществления:
Простой Уровень Аутентификации и Безопасности (SASL) определяет протокол ответа проблемы, в котором данные передаются между клиентом и сервером в целях аутентификации и (дополнительного) установления уровня безопасности, на котором можно продолжить последующую связь. SASL позволяет различным механизмам использоваться; каждый такой механизм идентифицируется профилем, который определяет данные, которыми обменяются и имя. SASL используется с основанными на соединении протоколами, такими как LDAPv3 и IMAPv4. SASL описывается в RFC 4422.
Java API SASL определяет API для приложений, чтобы использовать SASL независимым от механизма способом. Например, если Вы пишете библиотеку для объединяющегося в сеть протокола, который использует SASL, можно использовать Java API SASL, чтобы генерировать данные, которыми обменяются с коллегой. Когда библиотека развертывается, можно динамически сконфигурировать механизмы, чтобы использовать с библиотекой.
В дополнение к аутентификации можно использовать SASL, чтобы согласовать уровень безопасности, который будет использоваться после аутентификации. Но в отличие от GSS-API, свойства уровня безопасности (такой как, хотите ли Вы целостность или конфиденциальность) решаются во время согласования. (GSS-API позволяет конфиденциальности быть включенной или выключенной на сообщение).
Это осуществление является клиент-серверным приложением, которое демонстрирует, как передать надежно использование Java API SASL. Части клиента и сервера сначала аутентифицируют к Kerberos, используя Упражнение 1. Это хранит учетные данные в предмете. Приложение тогда выполняет действие, которое выполняет Java операции API SASL (с Kerberos как базовый механизм SASL) в Subject.doAs, используя предмет. Механизм SASL/Kerberos, потому что это выполняется в doAs, получает учетные данные Kerberos из предмета, и использует их, чтобы аутентифицировать с коллегой и обмениваться сообщениями надежно.
Этот пример использует простой протокол, реализованный AppConnection class. Этот протокол обменивается командами аутентификации и командами данных. Каждая команда состоит из типа (например, AppConnection.AUTH_CMD), длина данных, чтобы следовать, и данные непосредственно. Данные являются буфером SASL, если это для аутентификации или encrypted/integrity-protected данных приложения; это - простые данные приложения иначе.
Этот фрагмент кода определяет действие, чтобы выполниться после того, как принципал службы аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Сервер определяет качество защит, что это будет поддерживать [строку 9] и затем создает экземпляр SaslServer, чтобы выполнить аутентификацию [строка 21]. Протокол ответа проблемы SASL выполняется в цикле с условием продолжения [строки 33-49] с вызовами отправки сервера клиенту и обработке ответов от клиента. После аутентификации идентификационные данные аутентифицируемого клиента могут быть получены через звонок в getAuthorizedID() [строка 61]. Если уровень безопасности был согласован, сервер может обмениваться данными надежно с клиентом [строки 66,70].
Листинг кода для SaslTestServer.java.
static class SaslServerAction implements PrivilegedExceptionAction {
...
public Object run() throws Exception {
// Create server socket for accepting connections
ServerSocket ss = new ServerSocket(localPort);
// Support all quality-of-protection options
HashMap<String,Object> props = new HashMap<String,Object>();
props.put(Sasl.QOP, "auth-conf,auth-int,auth");
while (true) {
// Create application-level connection to handle request
Socket socket = ss.accept();
AppConnection conn = new AppConnection(socket);
// Normally, the application protocol will negotiate which
// SASL mechanism to use. In this simplified example, we
// will always use "GSSAPI" (the name of the mechanism that does Kerberos via GSS-API)
Считайте следующий код. Это располагается в src/SaslTestClient.java. Этот фрагмент кода определяет действие, чтобы выполниться после того, как клиентский принципал аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Программа сначала определяет качество защиты, что это хочет (в этом случае, конфиденциальность) [строка 8] и затем создает экземпляр SaslClient, чтобы использовать для аутентификации [строки 11-12]. Это тогда проверяет, имеет ли механизм начальный ответ и если так, получает ответ, вызывая evaluateChallenge() с пустым байтовым массивом [строка 20]. Это тогда отправляет ответ на сервер, чтобы начать аутентификацию. Протокол ответа проблемы SASL выполняется в цикле с условием продолжения [строки 24-39] с клиентом, оценивающим проблемы, что это получает от сервера и отправки сервера соответствующие ответы на проблемы. После аутентификации клиент может продолжить, чтобы связаться с сервером, используя согласованный уровень безопасности [строки 48,55].
Листинг кода для SaslTestClient.java.
static class SaslClientAction implements PrivilegedExceptionAction {
...
public Object run() throws Exception {
// Create application-level connection
AppConnection conn = new AppConnection(serverName, port);
HashMap<String,Object> props = new HashMap<String,Object>();
Запустите новое окно и запустите сервер. SaslTestServer берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий.
Выполните клиентское приложение. SaslTestClient берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit. % java -Djava.security.auth.login.config=jaas-krb5.conf \ SaslTestClient размещают j1hol-001
Наблюдайте следующий вывод в окнах приложений клиента и сервера.
Вывод для того, чтобы работать SaslTestServer пример.
Received: Hello There! Fri May 07 15:32:37 PDT 2005
Чтобы попробовать программу, используя различное качество защиты, измените строку 8 в SaslTestClient. Например, замените строку 8 следующей строкой, чтобы использовать защиту целостности на (никакая конфиденциальность).
props.put(Sasl.QOP, "auth-int");
Сводка:
В этом осуществлении Вы изучили, как записать клиент-серверное приложение, которое использует Java API SASL, чтобы аутентифицировать и связаться надежно друг с другом.
Следующие Шаги
Продолжите к Упражнению 5, чтобы изучить, как записать клиент-серверное приложение, которое использует JSSE, чтобы аутентифицировать и связаться надежно друг с другом.
Продолжите к Упражнению 6, чтобы изучить, как сконфигурировать примеры программ, что Вы только что имели обыкновение достигать единственного входа в систему в среде Kerberos.
Упражнение 5: Используя Расширение Защищенного сокета Java с Kerberos
Цель этого осуществления:
Цель этого осуществления состоит в том, чтобы изучить, как использовать API JSSE , чтобы выполнить безопасную аутентификацию и передачу, используя комплекты шифра Kerberos.
Фон для этого осуществления:
Уровень защищенных сокетов (SSL) и Безопасность Транспортного уровня (TLS) является наиболее широко используемыми протоколами для того, чтобы реализовать криптографию в Интернете. TLS является интернет-стандартом, развитым из SSL. SSL/TLS обеспечивает протоколы уровня приложения (такие как HTTP и LDAP) с безопасной аутентификацией и передачей. Например, HTTPS является получающимся протоколом использования HTTP по SSL/TLS. SSL/TLS используется не только для стандартных протоколов, таких как HTTP, он также широко используется, создавая прикладные программы, используя пользовательские протоколы, которые должны связаться надежно.
SSL/TLS традиционно используемая основанная на сертификате аутентификация и обычно используется для аутентификации сервера. Например, когда Веб-клиент, такой как браузер получает доступ к безопасному Веб-сайту (сервер) от имени пользователя, сервер отправляет свой сертификат браузеру так, чтобы браузер мог проверить идентификационные данные сервера. Это гарантирует, что пользователь не обнародует конфиденциальную информацию (такую как информация о кредитной карте) к поддельному серверу. Недавно, новый стандарт позволяет использование Kerberos с TLS. Это означает вместо того, чтобы использовать основанную на сертификате аутентификацию, приложение может использовать учетные данные Kerberos и использовать в своих интересах инфраструктуру Kerberos в среде развертывания. Используя комплекты шифра Kerberos также оказывает автоматическую поддержку для взаимной аутентификации, в которой клиент также аутентифицируется в дополнение к серверу.
Решение о том, использовать ли Java GSS, Java SASL, или JSSE для определенного приложения часто, зависит от нескольких факторов, включая (протоколы, используемые) службы, с которыми приложение взаимодействует, среда развертывания (PKI или основанный на Kerberos), и требования к защите приложения. JSSE обеспечивает безопасный непрерывный канал, который заботится о вводе-выводе и транспорте, в то время как Java GSS и Java, SASL обеспечивают шифрование и защиту целостности на данных, но приложение, ответственен за перенос защищенных данных к его коллеге. Некоторые детали о факторах для того, чтобы решить, когда использовать JSSE против Java GSS, представляются в документе, Когда использовать Java GSS по сравнению с. JSSE.
Это осуществление является клиент-серверным приложением, которое демонстрирует, как передать надежно использование JSSE и комплектов шифра Kerberos. Части клиента и сервера сначала аутентифицируют к Kerberos, используя Упражнение 1. Это хранит учетные данные в предмете. Приложение тогда выполняет действие, которое выполняет операции JSSE (использующий комплект шифра Kerberos) в Subject.doAs, используя предмет. Реализация комплекта шифра Kerberos, потому что это выполняется в doAs, получает учетные данные Kerberos из предмета, и использует их, чтобы аутентифицировать с коллегой и обмениваться сообщениями надежно. Этот пример отправляет завершенные новой строкой сообщения, зашифрованное использование согласованного комплекта шифра и защищенный от целостности, назад и вперед между клиентом и сервером.
Согласно стандарту (RFC 2712) все поддерживающие Kerberos приложения TLS используют то же самое имя службы, а именно, "узел". Именно поэтому в этом осуществлении, Вы не должны явно предоставить имя службы Kerberos.
Этот фрагмент кода определяет действие, чтобы выполниться после того, как принципал службы аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Сервер сначала создает SSLServerSocket [строки 5-8]. Это походит на приложение, создающее плоскость, ServerSocket кроме SSLServerSocket обеспечит автоматическую аутентификацию, шифрование и дешифрование, как необходимый. Сервер тогда устанавливает комплекты шифра, что он хочет использовать [строки 11-12]. Сервер тогда работает в цикле, принимая соединения от клиентов SSL [строка 17], и читает и пишет из сокета SSL [строки 23, 28]. Сервер может узнать идентификационные данные владельцев сокета, вызывая методы getLocalPrincipal() И getPeerPrincipal() [строки 32-33].
Листинг кода для JsseServer.java.
static class JsseServerAction implements PrivilegedExceptionAction {
// Get names of principal at both ends of secure connection
Principal self = sslSocket.getSession().getLocalPrincipal();
Principal peer = sslSocket.getSession().getPeerPrincipal();
sslSocket.close();
}
}
}
Скомпилируйте пример кода. % javac JsseServer.java
Считайте следующий код. Это располагается в src/JsseClient.java. Этот фрагмент кода определяет действие, чтобы выполниться после того, как клиентский принципал аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Клиент сначала создает SSLSocket. Клиент тогда устанавливает комплекты шифра, что это хочет использовать [строки 11-12]. Клиент тогда обменивается сообщениями с сервером, используя SSLSocket, читая и при записи во ввод/потоки вывода сокета. Клиент может узнать идентификационные данные владельцев сокета, вызывая методы getLocalPrincipal() И getPeerPrincipal() [строки 26-27].
Листинг кода для JsseClient.java
static class JsseClientAction implements PrivilegedExceptionAction {
// Should handle exception if enabledSuites is not supported
BufferedReader in = new BufferedReader(new InputStreamReader(
sslSocket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
sslSocket.getOutputStream()));
String outStr = ...;
out.write(outStr);
out.flush();
String inStr = in.readLine();
// ... use inStr
// Get names of principal at both ends of secure connection
Principal self = sslSocket.getSession().getLocalPrincipal();
Principal peer = sslSocket.getSession().getPeerPrincipal();
sslSocket.close();
return null;
}
}
Скомпилируйте пример кода.
% javac JsseClient.java
Запустите новое окно и запустите сервер. JsseServer берет один параметр: имя сервера, на котором работает служба JSSE. Например, если это работает на машине j1hol-001, Вы ввели бы следующий.
Выполните клиентское приложение. JsseClient берет один параметр: имя сервера, на котором работает служба JSSE. Например, если служба работает на машине j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit. % java -Djava.security.auth.login.config=jaas-krb5.conf \ JsseClient j1hol-001
Наблюдайте следующий вывод в окнах приложений клиента и сервера.
Received: Hello There! Fri May 07 15:32:37 PDT 2005
Cipher suite in use: TLS_KRB5_WITH_3DES_EDE_CBC_SHA
I am: test@J1LABS.EXAMPLE.COM
Server is: host/j1hol-001@J1LABS.EXAMPLE.COM
Сводка:
В этом осуществлении Вы изучили, как записать клиент-серверное приложение, которое использует JSSE, чтобы аутентифицировать и связаться надежно друг с другом, используя Kerberos в качестве базовой системы аутентификации.
Следующие Шаги
Продолжите к Упражнению 6, чтобы изучить, как сконфигурировать примеры программ в Упражнениях 3, 4, и 5, чтобы достигнуть единственного входа в систему в среде Kerberos.