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

Часть V: Безопасная Аутентификация, используя Java SPNEGO механизм GSS (Java SE 6.0)

Упражнение 8: Используя Java Универсальные Службы безопасности (GSS) API с SPNEGO

Цель этого осуществления:

В настоящий момент единственной безопасностью mechansim доступный с Java GSS является "Kerberos". Цель этого осуществления состоит в том, чтобы изучить, как использовать другой Java механизмы GSS, такие как SPNEGO, чтобы защитить ассоциацию. Эта функция доступна от Java SE 6 вперед.

Каков SPNEGO?

GSS Java является платформой, которая может поддерживать многократные механизмы безопасности; способ согласовать механизм безопасности под GSS-API необходим. Это доступно через SPNEGO.

SPNEGO является Простым и Защищенным Механизмом Согласования GSS-API, стандартизированным в IETF в RFC 4178. Это - механизм псевдобезопасности, используемый, чтобы согласовать базовый механизм безопасности. Это обеспечивает гибкость для клиента и сервера, чтобы надежно согласовать общий механизм безопасности GSS.

Microsoft делает интенсивное использование SPNEGO. SPNEGO может использоваться, чтобы взаимодействовать с Microsoft Server по HTTP, поддерживать основанную на HTTP Межплатформенную аутентификацию через Согласовывать Протокол.

Что делает я должен сделать, чтобы использовать SPNEGO в Java GSS?

В настоящий момент при использовании Java GSS с Kerberos, мы определяем OID Kerberos, чтобы использовать Kerberos.

Oid krb5Oid = new Oid("1.2.840.113554.1.2.2");

Чтобы использовать SPNEGO, Вы только должны определить SPNEGO OID как follows:-

Oid spnegoOid = new Oid("1.3.6.1.5.5.2");

И впредь используйте SPNEGO OID создавая GSSCredential, GSSContext, и т.д.

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

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

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


  1. static class GssSpnegoClientAction 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 spnegoOid = new Oid("1.3.6.1.5.5.2");
  11.     GSSName serverName = manager.createName(serverPrinc, GSSName.NT_HOSTBASED_SERVICE, spnegoOid);

  12.     // Get the context for authentication
  13.     GSSContext context = manager.createContext(serverName, spnegoOid, 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 GssSpNegoClient.java
  2. Считайте следующий код. Это располагается в src/GssSpNegoServer.java

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

  1. static class GssSpNegoServerAction 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 spnegoOid = new Oid("1.3.6.1.5.5.2");
  9.     GSSCredential serverCreds = manager.createCredential(null,
  10.       GSSCredential.DEFAULT_LIFETIME, spnegoOid, 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 GssSpNegoServer.java
    
  2. Запустите новое окно и запустите сервер.
    
    % xterm &
    % java -Djava.security.auth.login.config=jaas-krb5.conf GssSpNegoServer
    
  3. Выполните клиентское приложение. GssClient берет два параметра: имя службы и имя сервера, на котором работает служба. Например, если служба host работа машины j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit.
    
    % java -Djava.security.auth.login.config=jaas-krb5.conf \
    GssSpNegoClient host j1hol-001
    

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

  1. Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]
  2. Waiting for incoming connections...
  3. Got connection from client /129.145.128.102
  4. SPNEGO Согласованный Механизм = 1.2.840.113554.1.2.2 Kerberos V5
  5. Context Established!
  6. Client principal is test@J1LABS.EXAMPLE.COM
  7. Server principal is host/j1hol-001@J1LABS.EXAMPLE.COM
  8. Mutual authentication took place!
  9. Received data "Hello There!" of length 12
  10. Confidentiality applied: true
  11. Sending: Hello There! Thu May 06 12:11:15 PDT 2005


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

  1. Kerberos password for test: changeit
  2. Authenticated principal: [test@J1LABS.EXAMPLE.COM]
  3. Connected to address j1hol-001/129.145.128.102
  4. SPNEGO Согласованный Механизм = 1.2.840.113554.1.2.2 Kerberos V5
  5. Context Established!
  6. Client principal is test@J1LABS.EXAMPLE.COM
  7. Server principal is host@j1hol-001
  8. Mutual authentication took place!
  9. Sending message: Hello There!
  10. Will read token of size 93
  11. Received message: Hello There! Thu May 06 12:11:15 PDT 2005


Сводка:

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

Отметьте: Microsoft реализовала определенные изменения протокола SPNEGO, следовательно чтобы взаимодействовать с Microsoft, мы добавили режим MS через новое системное свойство "sun.security.spnego.msinterop". Это свойство включается к "истине" по умолчанию. Чтобы отключить это, Вы должны явно установить это свойство в "ложь". Чтобы включить отладке SPNEGO, можно установить системное свойство "солнце security.spnego.debug=true".




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