Spec-Zone .ru
спецификации, руководства, описания, API
Содержание документации

Вторая часть: Безопасная Связь, используя Java SE 6 API Безопасности

Эта часть показывает Вам, как создать приложения, которые выполняют безопасную связь. 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.

Ресурсы для этого Осуществления:

  1. JAAS и Учебные руководства GSS-API Java
  2. Универсальная Версия 2 API Службы безопасности: Привязка Java (RFC 2853)
  3. Java GSS javadocs: org.ietf.jgss.

Краткий обзор этого Осуществления:

Это осуществление является клиент-серверным приложением, которое демонстрирует, как передать надежно использование Java API GSS. Части клиента и сервера сначала аутентифицируют к Kerberos, как показано в Упражнении 1. Это хранит учетные данные в предмете. Приложение тогда выполняет действие, которое выполняет Java операции GSS (с Kerberos как базовый механизм GSS) в Subject.doAs, используя предмет. Java GSS механизм Kerberos, потому что это выполняется в doAs, получает учетные данные Kerberos из предмета, и использует их, чтобы аутентифицировать с коллегой и обмениваться сообщениями надежно.

Шаги, чтобы следовать:

  1. Считайте следующий код. Это располагается в src/GssServer.java.

    Этот фрагмент кода определяет действие, чтобы выполниться после того, как принципал службы аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Код сначала создает экземпляр GSSManager [строка 8], который это использует, чтобы получить ее собственные учетные данные [строка 10-11] и создать экземпляр GSSContext [строка 18]. Это использует этот контекст, чтобы выполнить аутентификацию [цикл между строками 22-34]. После завершающейся аутентификации это принимает зашифрованный ввод от клиента и использует установленный контекст защиты, чтобы дешифровать данные [строка 45]. Это тогда использует контекст защиты, чтобы зашифровать ответ, содержащий исходный ввод и дату [строка 49], и затем отсылает это назад к клиенту.

Листинг кода для GssServer.java.



  1. static class GssServerAction implements PrivilegedExceptionAction {
  2. ...
  3.   public Object run() throws Exception {
  4.     // Create server socket for accepting connections
  5.     ServerSocket ss = new ServerSocket(localPort);

  6.     // Get own Kerberos credentials for accepting connection
  7.     GSSManager manager = GSSManager.getInstance();
  8.     Oid krb5Oid = new Oid("1.2.840.113554.1.2.2");
  9.     GSSCredential serverCreds = manager.createCredential(null,
  10.       GSSCredential.DEFAULT_LIFETIME, krb5Oid, GSSCredential.ACCEPT_ONLY);

  11.     while (true) {
  12.       Socket socket = ss.accept();
  13.       DataInputStream inStream = new DataInputStream(socket.getInputStream());
  14.       DataOutputStream outStream = new DataOutputStream(socket.getOutputStream());

  15.       GSSContext context = manager.createContext((GSSCredential)serverCreds);

  16.       // Do the context establishment loop
  17.       byte[] token = null;
  18.       while (!context.isEstablished()) {
  19.         // Read token
  20.         token = new byte[inStream.readInt()];
  21.         inStream.readFully(token);

  22.         // Process token
  23.         token = context.acceptSecContext(token, 0, token.length);

  24.         // Send a token to the peer if one was generated by acceptSecContext
  25.         outStream.writeInt(token.length);
  26.         outStream.write(token);
  27.         outStream.flush();
  28.       }

  29.       // Context established!

  30.       // Create MessageProp for use with unwrap (will be set upon return from unwrap)
  31.       MessageProp prop = new MessageProp(0, false);

  32.       // Read token from client
  33.       token = new byte[inStream.readInt()];
  34.       inStream.readFully(token);
  35.       // Unwrap (decrypt) token sent by client
  36.       byte[] input = context.unwrap(token, 0, token.length, prop);
  37.       ...
  38.       // Create new token and send to client
  39.       byte[] reply = ...;
  40.       token = context.wrap(reply, 0, reply.length, prop);

  41.       outStream.writeInt(token.length);
  42.       outStream.write(token);
  43.       outStream.flush();
  44.       context.dispose();
  45.       socket.close();
  46.     }
  47.   }
  48. }


  1. Скомпилируйте пример кода. % javac GssServer.java
     
    
  2. Считайте следующий код. Это располагается в src/GssClient.java.

    Этот фрагмент кода определяет действие, чтобы выполниться после того, как клиентский принципал аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Код сначала создает экземпляр GSSManager [строка 10], который это использует, чтобы получить основное имя для службы, которую это собирается передать с [строка 12]. Это тогда создает экземпляр GSSContext [строка 15,16], чтобы выполнить аутентификацию [цикл между строками 22-33] со службой. После завершающейся аутентификации это использует установленный контекст защиты, чтобы зашифровать сообщение [строка 42] и отправляет это серверу. Это тогда читает зашифрованное сообщение из сервера и декодирует это использующий установленный контекст защиты [строка 53].
Листинг кода для GssClient.java.

  1. static class GssClientAction implements PrivilegedExceptionAction {
  2. ...
  3.   public Object run() throws Exception {
  4.     // Create socket to server
  5.     Socket socket = new Socket(hostName, port);
  6.     DataInputStream inStream = new DataInputStream(socket.getInputStream());
  7.     DataOutputStream outStream = new DataOutputStream(socket.getOutputStream());

  8.     // Get service's principal name
  9.     GSSManager manager = GSSManager.getInstance();
  10.     Oid krb5Oid = new Oid("1.2.840.113554.1.2.2");
  11.     GSSName serverName = manager.createName(serverPrinc, GSSName.NT_HOSTBASED_SERVICE);

  12.     // Get the context for authentication
  13.     GSSContext context = manager.createContext(serverName, krb5Oid, null,
  14.       GSSContext.DEFAULT_LIFETIME);
  15.     context.requestMutualAuth(true); // Request mutual authentication
  16.     context.requestConf(true); // Request confidentiality

  17.     // Do the context establishment loop
  18.     byte[] token = new byte[0];
  19.     while (!context.isEstablished()) {
  20.       token = context.initSecContext(token, 0, token.length);
  21.       outStream.writeInt(token.length);
  22.       outStream.write(token);
  23.       outStream.flush();

  24.       // Check if we're done
  25.       if (!context.isEstablished()) {
  26.         token = new byte[inStream.readInt()];
  27.         inStream.readFully(token);
  28.       }
  29.     }

  30.     // Context established!

  31.     // Create MessageProp for use with unwrap (true means request confidentiality)
  32.     MessageProp prop = new MessageProp(0, true);

  33.     // Create encrypted message and send to server
  34.     byte[] reply = ...;
  35.     token = context.wrap(reply, 0, reply.length, prop);

  36.     outStream.writeInt(token.length);
  37.     outStream.write(token);
  38.     outStream.flush();

  39.     // Read token from server
  40.     token = new byte[inStream.readInt()];
  41.     inStream.readFully(token);

  42.     // Unwrap (decrypt) token sent by server
  43.     byte[] input = context.unwrap(token, 0, token.length, prop);
  44.     ...
  45.     context.dispose();
  46.     socket.close();
  47.     return null;
  48.   }
  49. }


  1. Скомпилируйте пример кода.
    % javac GssClient.java
    
    
  2. Запустите новое окно и запустите сервер.
    % xterm &
    % java -Djava.security.auth.login.config=jaas-krb5.conf \
           GssServer
    
    
  3. Выполните клиентское приложение. GssClient берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit.
        
    % java -Djava.security.auth.login.config=jaas-krb5.conf \
           GssClient host j1hol-001
    
    
  4. Наблюдайте следующий вывод в окнах приложений клиента и сервера.

Вывод для того, чтобы выполнить пример GssServer.


  1. Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
  2. Waiting for incoming connections...
  3. Got connection from client /192.0.2.102
  4. Context Established!
  5. Client principal is test@J1LABS.EXAMPLE.COM
  6. Server principal is host/j1hol-001@J1LABS.EXAMPLE.COM
  7. Mutual authentication took place!
  8. Received data "Hello There!" of length 12
  9. Confidentiality applied: true
  10. Sending: Hello There! Thu May 06 12:11:15 PDT 2005

Вывод для того, чтобы выполнить пример GssClient.


  1. Kerberos password for test: changeit
  2. Authenticated principal: [test@J1LABS.EXAMPLE.COM]
  3. Connected to address j1hol-001/192.0.2.102
  4. Context Established!
  5. Client principal is test@J1LABS.EXAMPLE.COM
  6. Server principal is host@j1hol-001
  7. Mutual authentication took place!
  8. Sending message: Hello There!
  9. Will read token of size 93
  10. Received message: Hello There! Thu May 06 12:11:15 PDT 2005

Сводка:

В этом осуществлении Вы изучили, как записать клиент-серверное приложение, которое использует Java API GSS, чтобы аутентифицировать и связаться надежно друг с другом.

Следующие Шаги

  1. Продолжите к Упражнению 4, чтобы изучить, как записать клиент-серверное приложение, которое использует Java API SASL, чтобы аутентифицировать и связаться надежно друг с другом.
  2. Продолжите к Упражнению 5, чтобы изучить, как записать клиент-серверное приложение, которое использует JSSE, чтобы аутентифицировать и связаться надежно друг с другом.
  3. Продолжите к Упражнению 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 позволяет конфиденциальности быть включенной или выключенной на сообщение).

Ресурсы для этого осуществления:

  1. Java Программирование API SASL и Руководство по Развертыванию
  2. Java API SASL javadocs
  3. Простой Уровень Аутентификации и Безопасности (SASL) (RFC 4422)

Краткий обзор этого осуществления:

Это осуществление является клиент-серверным приложением, которое демонстрирует, как передать надежно использование Java API SASL. Части клиента и сервера сначала аутентифицируют к Kerberos, используя Упражнение 1. Это хранит учетные данные в предмете. Приложение тогда выполняет действие, которое выполняет Java операции API SASL (с Kerberos как базовый механизм SASL) в Subject.doAs, используя предмет. Механизм SASL/Kerberos, потому что это выполняется в doAs, получает учетные данные Kerberos из предмета, и использует их, чтобы аутентифицировать с коллегой и обмениваться сообщениями надежно.

Этот пример использует простой протокол, реализованный AppConnection класс. Этот протокол обменивается командами аутентификации и командами данных. Каждая команда состоит из типа (например, AppConnection.AUTH_CMD), длина данных, чтобы следовать, и данные непосредственно. Данные являются буфером SASL, если это для аутентификации или encrypted/integrity-protected данных приложения; это - простые данные приложения иначе.

Шаги, чтобы следовать:

  1. Считайте следующий код. Это располагается в src/SaslTestServer.java.

    Этот фрагмент кода определяет действие, чтобы выполниться после того, как принципал службы аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Сервер определяет качество защит, что это будет поддерживать [строку 9] и затем создает экземпляр SaslServer, чтобы выполнить аутентификацию [строка 21]. Протокол ответа проблемы SASL выполняется в цикле с условием продолжения [строки 33-49] с вызовами отправки сервера клиенту и обработке ответов от клиента. После аутентификации идентификационные данные аутентифицируемого клиента могут быть получены через звонок в getAuthorizedID() [строка 61]. Если уровень безопасности был согласован, сервер может обмениваться данными надежно с клиентом [строки 66,70].

Листинг кода для SaslTestServer.java.


  1. static class SaslServerAction implements PrivilegedExceptionAction {
  2. ...
  3.   public Object run() throws Exception {
  4.     // Create server socket for accepting connections
  5.     ServerSocket ss = new ServerSocket(localPort);

  6.     // Support all quality-of-protection options
  7.     HashMap<String,Object> props = new HashMap<String,Object>();
  8.     props.put(Sasl.QOP, "auth-conf,auth-int,auth");

  9.     while (true) {
  10.       // Create application-level connection to handle request
  11.       Socket socket = ss.accept();
  12.       AppConnection conn = new AppConnection(socket);

  13.       // Normally, the application protocol will negotiate which
  14.       // SASL mechanism to use. In this simplified example, we
  15.       // will always use "GSSAPI" (the name of the mechanism that does Kerberos via GSS-API)

  16.       // Create SaslServer to perform authentication
  17.       SaslServer srv = Sasl.createSaslServer("GSSAPI", service, serviceName, props, cbh);

  18.       if (srv == null) {
  19.         // ... handle error
  20.       }

  21.       // Read the initial response from client
  22.       byte[] response = conn.receive(AppConnection.AUTH_CMD);
  23.       AppConnection.AppReply clientMsg;
  24.       boolean auth = false;

  25.       // Perform authentication
  26.       while (!srv.isComplete()) {
  27.         try
  28.           // Generate challenge based on response
  29.           byte[] challenge = srv.evaluateResponse(response);
  30.           if (srv.isComplete()) {
  31.             conn.send(AppConnection.SUCCESS, challenge);
  32.             auth = true;
  33.           } else {
  34.             clientMsg = conn.send(AppConnection.AUTH_IN_PROGRESS, challenge);
  35.             response = clientMsg.getBytes();
  36.           }
  37.         } catch (SaslException e) {
  38.           // Send failure notification to client
  39.           conn.send(AppConnection.FAILURE, null);
  40.           break;
  41.         }
  42.       }

  43.       // Authentication completed!

  44.       // Check status of authentication
  45.       if (srv.isCompleted() && auth) {
  46.         System.out.println("authorized client is: " + srv.getAuthorizationID());
  47.       } else {
  48.         // Report failure ...
  49.       }

  50.       // Find out whether security layer was negotiated
  51.       String qop = (String) srv.getNegotiatedProperty(Sasl.QOP);
  52.       boolean sl = (qop.equals("auth-conf") || qop.equals("auth-int"));

  53.       // Read and decrypt message from client
  54.       byte[] msg = conn.receive(AppConnection.DATA_CMD);
  55.       byte[] realMsg = (sl ? srv.unwrap(msg, 0, msg.length) : msg);
  56.       ...
  57.       // Create and encrypt message to send to client
  58.       byte[] reply = ...;
  59.       byte[] realReply = (sl ? srv.wrap(reply, 0, reply.length) : reply);
  60.       conn.send(AppConnection.SUCCESS, realReply);
  61.     }
  62.   }
  63. }


  1. Скомпилируйте пример кода.
    % javac SaslTestServer.java
  2. Считайте следующий код. Это располагается в src/SaslTestClient.java. Этот фрагмент кода определяет действие, чтобы выполниться после того, как клиентский принципал аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Программа сначала определяет качество защиты, что это хочет (в этом случае, конфиденциальность) [строка 8] и затем создает экземпляр SaslClient, чтобы использовать для аутентификации [строки 11-12]. Это тогда проверяет, имеет ли механизм начальный ответ и если так, получает ответ, вызывая evaluateChallenge() с пустым байтовым массивом [строка 20]. Это тогда отправляет ответ на сервер, чтобы начать аутентификацию. Протокол ответа проблемы SASL выполняется в цикле с условием продолжения [строки 24-39] с клиентом, оценивающим проблемы, что это получает от сервера и отправки сервера соответствующие ответы на проблемы. После аутентификации клиент может продолжить, чтобы связаться с сервером, используя согласованный уровень безопасности [строки 48,55].

Листинг кода для SaslTestClient.java.


  1. static class SaslClientAction implements PrivilegedExceptionAction {
  2. ...
  3.   public Object run() throws Exception {
  4.     // Create application-level connection
  5.     AppConnection conn = new AppConnection(serverName, port);

  6.     HashMap<String,Object> props = new HashMap<String,Object>();
  7.     props.put(Sasl.QOP, "auth-conf"); // Request confidentiality

  8.     // Create SaslClient to perform authentication
  9.     SaslClient clnt = Sasl.createSaslClient(
  10.       new String[]{"GSSAPI"}, null, service, serverName, props, cbh);
  11.     if (clnt == null) {
  12.       // ... handle error
  13.     }

  14.     byte[] challenge;

  15.     // Get initial response for authentication
  16.     byte[] response = clnt.hasInitialResponse() ? clnt.evaluateChallenge(EMPTY) : EMPTY;
  17.     AppConnection.AppReply reply = conn.send(AppConnection.AUTH_CMD, response);

  18.     // Repeat until authentication terminates
  19.     while (!clnt.isComplete() &&
  20.       (reply.getStatus() == AppConnection.AUTH_INPROGRESS ||
  21.        reply.getStatus() == AppConnection.SUCCESS))
  22.       // Evaluate challenge to generate response
  23.       challenge = reply.getBytes()
  24.       response = clnt.evaluateChallenge(challenge)

  25.       if (reply.getStatus() == AppConnection.SUCCESS) {
  26.         if (response != null) {
  27.           throw new Exception("Protocol error")
  28.         }
  29.         break;
  30.       }
  31.       // Send response to server and read server's next challenge
  32.       reply = conn.send(AppConnection.AUTH_CMD, response);
  33.     }
  34.     // Authentication completed!
  35.     // Find out whether security layer was negotiated
  36.     String qop = (String) srv.getNegotiatedProperty(Sasl.QOP);
  37.     boolean sl = (qop.equals("auth-conf") || qop.equals("auth-int"));

  38.     byte[] msg = ...;

  39.     // Create and send encrypted data to server
  40.     byte[] encrypted = (sl ? clnt.wrap(msg, 0, msg.length) : msg);
  41.     reply = conn.send(AppConnection.DATA_CMD, encrypted);) {

  42.     ...

  43.     // Read and decrypt data from server
  44.     byte[] encryptedReply = reply.getBytes();
  45.     byte[] clearReply = (sl ? clnt.unwrap(encryptedReply, 0, encryptedReply.length)
  46.       : encryptedReply);
  47.     conn.close();
  48.     return null;
  49.   }
  50. }

  1. Скомпилируйте пример кода.
    % javac SaslTestClient.java
  2. Запустите новое окно и запустите сервер. SaslTestServer берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий.
    % xterm &
    % java
    -Djava.security.auth.login.config=jaas-krb5.conf \
    SaslTestServer host j1hol-001

  3. Выполните клиентское приложение. SaslTestClient берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit.
    % java -Djava.security.auth.login.config=jaas-krb5.conf \
    SaslTestClient размещают j1hol-001
  4. Наблюдайте следующий вывод в окнах приложений клиента и сервера.

Вывод для того, чтобы работать SaslTestServer пример.


  1. Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
  2. Waiting for incoming connections...
  3. Got connection from client /192.0.2.102
  4. Client authenticated; authorized client is: test@J1LABS.EXAMPLE.COM
  5. Negotiated QOP: auth-conf
  6. Received: Hello There!
  7. Sending: Hello There! Fri May 07 15:32:37 PDT 2005
  8. Received data "Hello There!" of length 12

Вывод для того, чтобы работать SaslTestClient пример.


  1. Kerberos password for test: changeit
  2. Authenticated principal: [test@J1LABS.EXAMPLE.COM]
  3. Connected to address j1hol-001/192.0.2.102
  4. Client authenticated.
  5. Negotiated QOP: auth-conf
  6. Sending: Hello There!
  7. Received: Hello There! Fri May 07 15:32:37 PDT 2005

  1. Чтобы попробовать программу, используя различное качество защиты, измените строку 8 в SaslTestClient. Например, замените строку 8 следующей строкой, чтобы использовать защиту целостности на (никакая конфиденциальность).
    props.put(Sasl.QOP, "auth-int");
    

Сводка:

В этом осуществлении Вы изучили, как записать клиент-серверное приложение, которое использует Java API SASL, чтобы аутентифицировать и связаться надежно друг с другом.

Следующие Шаги

  1. Продолжите к Упражнению 5, чтобы изучить, как записать клиент-серверное приложение, которое использует JSSE, чтобы аутентифицировать и связаться надежно друг с другом.
  2. Продолжите к Упражнению 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.

Ресурсы для этого осуществления:

  1. Расширение Защищенного сокета Java (JSSE) Справочник
  2. JSSE javadocs: javax.net и javax.net.ssl
  3. Версия 3.0 Протокола SSL
  4. Версия 1.0 Протокола TLS (RFC 2246)
  5. Добавление Комплектов Шифра Kerberos к TLS Безопасности Транспортного уровня (RFC 2712)
  6. Когда использовать Java GSS по сравнению с. JSSE

Краткий обзор этого осуществления:

Это осуществление является клиент-серверным приложением, которое демонстрирует, как передать надежно использование JSSE и комплектов шифра Kerberos. Части клиента и сервера сначала аутентифицируют к Kerberos, используя Упражнение 1. Это хранит учетные данные в предмете. Приложение тогда выполняет действие, которое выполняет операции JSSE (использующий комплект шифра Kerberos) в Subject.doAs, используя предмет. Реализация комплекта шифра Kerberos, потому что это выполняется в doAs, получает учетные данные Kerberos из предмета, и использует их, чтобы аутентифицировать с коллегой и обмениваться сообщениями надежно. Этот пример отправляет завершенные новой строкой сообщения, зашифрованное использование согласованного комплекта шифра и защищенный от целостности, назад и вперед между клиентом и сервером.

Согласно стандарту (RFC 2712) все поддерживающие Kerberos приложения TLS используют то же самое имя службы, а именно, "узел". Именно поэтому в этом осуществлении, Вы не должны явно предоставить имя службы Kerberos.

Шаги, чтобы следовать:

  1. Считайте следующий код. Это располагается в src/JsseServer.java

    Этот фрагмент кода определяет действие, чтобы выполниться после того, как принципал службы аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Сервер сначала создает SSLServerSocket [строки 5-8]. Это походит на приложение, создающее плоскость, ServerSocket кроме SSLServerSocket обеспечит автоматическую аутентификацию, шифрование и дешифрование, как необходимый. Сервер тогда устанавливает комплекты шифра, что он хочет использовать [строки 11-12]. Сервер тогда работает в цикле, принимая соединения от клиентов SSL [строка 17], и читает и пишет из сокета SSL [строки 23, 28]. Сервер может узнать идентификационные данные владельцев сокета, вызывая методы getLocalPrincipal() И getPeerPrincipal() [строки 32-33].

Листинг кода для JsseServer.java.


  1. static class JsseServerAction implements PrivilegedExceptionAction {
  2. ...
  3.   public Object run() throws Exception {
  4.     // Create TLS socket for accepting connections
  5.     SSLServerSocketFactory sslssf =
  6.       (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
  7.     SSLServerSocket sslServerSocket =
  8.       (SSLServerSocket) sslssf.createServerSocket(localPort);

  9.     // Enable only a Kerberos cipher suite
  10.     String enabledSuites[] = { "TLS_KRB5_WITH_3DES_EDE_CBC_SHA" };
  11.     sslServerSocket.setEnabledCipherSuites(enabledSuites);
  12.     // Should handle exception if enabledSuites is not supported

  13.     while (true) {
  14.       // Create socket to handle request
  15.       SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept();
  16.       BufferedReader in = new BufferedReader(new InputStreamReader(
  17.         sslSocket.getInputStream()));
  18.       BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
  19.         sslSocket.getOutputStream()));

  20.       String inStr = in.readLine();
  21.       // ... use inStr

  22.       // Compose and send reply
  23.       String outStr = inStr + " " + new Date().toString() + "\n";
  24.       out.write(outStr);
  25.       out.flush();

  26.       // Get names of principal at both ends of secure connection
  27.       Principal self = sslSocket.getSession().getLocalPrincipal();
  28.       Principal peer = sslSocket.getSession().getPeerPrincipal();

  29.       sslSocket.close();
  30.     }
  31.   }
  32. }


  1. Скомпилируйте пример кода.
    % javac JsseServer.java
  2. Считайте следующий код. Это располагается в src/JsseClient.java. Этот фрагмент кода определяет действие, чтобы выполниться после того, как клиентский принципал аутентифицировал к KDC. Это заменяет MyAction строки 11 из Упражнения 1. Отметьте выделенные строки. Клиент сначала создает SSLSocket. Клиент тогда устанавливает комплекты шифра, что это хочет использовать [строки 11-12]. Клиент тогда обменивается сообщениями с сервером, используя SSLSocket, читая и при записи во ввод/потоки вывода сокета. Клиент может узнать идентификационные данные владельцев сокета, вызывая методы getLocalPrincipal() И getPeerPrincipal() [строки 26-27].

Листинг кода для JsseClient.java


  1. static class JsseClientAction implements PrivilegedExceptionAction {
  2. ...
  3.   public Object run() throws Exception {
  4.     // Create SSL connection
  5.     SSLSocketFactory sslsf = (SSLSocketFactory) SSLSocketFactory.getDefault();
  6.     SSLSocket sslSocket = (SSLSocket) sslsf.createSocket(server, port);

  7.     // Enable only a Kerberos cipher suite
  8.     String enabledSuites[] = { "TLS_KRB5_WITH_3DES_EDE_CBC_SHA" };
  9.     sslSocket.setEnabledCipherSuites(enabledSuites);
  10.     // Should handle exception if enabledSuites is not supported

  11.     BufferedReader in = new BufferedReader(new InputStreamReader(
  12.       sslSocket.getInputStream()));
  13.     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
  14.       sslSocket.getOutputStream()));

  15.     String outStr = ...;
  16.     out.write(outStr);
  17.     out.flush();

  18.     String inStr = in.readLine();
  19.     // ... use inStr

  20.     // Get names of principal at both ends of secure connection
  21.     Principal self = sslSocket.getSession().getLocalPrincipal();
  22.     Principal peer = sslSocket.getSession().getPeerPrincipal();

  23.     sslSocket.close();
  24.     return null;
  25.   }
  26. }


  1. Скомпилируйте пример кода.
    % javac JsseClient.java
  2. Запустите новое окно и запустите сервер. JsseServer берет один параметр: имя сервера, на котором работает служба JSSE. Например, если это работает на машине j1hol-001, Вы ввели бы следующий.
    % xterm &
    % java
    -Djava.security.auth.login.config=jaas-krb5.conf \
    JsseServer j1hol-001

  3. Выполните клиентское приложение. JsseClient берет один параметр: имя сервера, на котором работает служба JSSE. Например, если служба работает на машине j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit.
    % java -Djava.security.auth.login.config=jaas-krb5.conf \
    JsseClient j1hol-001
  4. Наблюдайте следующий вывод в окнах приложений клиента и сервера.

Вывод для того, чтобы работать JsseServer пример.


  1. Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
  2. Waiting for incoming connections...
  3. Got connection from client /192.0.2.102
  4. Received: Hello There!
  5. Sending: Hello There! Fri May 07 15:32:37 PDT 2005
  6. Cipher suite in use: TLS_KRB5_WITH_3DES_EDE_CBC_SHA
  7. I am: host/j1hol-001@J1LABS.EXAMPLE.COM
  8. Client is: test@J1LABS.EXAMPLE.COM

Вывод для того, чтобы работать JsseClient пример.


  1. Kerberos password for test: changeit
  2. Authenticated principal: [test@J1LABS.EXAMPLE.COM]
  3. Sending: Hello There!
  4. Received: Hello There! Fri May 07 15:32:37 PDT 2005
  5. Cipher suite in use: TLS_KRB5_WITH_3DES_EDE_CBC_SHA
  6. I am: test@J1LABS.EXAMPLE.COM
  7. Server is: host/j1hol-001@J1LABS.EXAMPLE.COM

Сводка:

В этом осуществлении Вы изучили, как записать клиент-серверное приложение, которое использует JSSE, чтобы аутентифицировать и связаться надежно друг с другом, используя Kerberos в качестве базовой системы аутентификации.

Следующие Шаги

  1. Продолжите к Упражнению 6, чтобы изучить, как сконфигурировать примеры программ в Упражнениях 3, 4, и 5, чтобы достигнуть единственного входа в систему в среде Kerberos.


Oracle и/или его филиалы Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
Свяжитесь с Нами