|
Spec-Zone .ru
спецификации, руководства, описания, API
|
В настоящий момент единственной безопасностью mechansim доступный с Java GSS является "Kerberos". Цель этого осуществления состоит в том, чтобы изучить, как использовать другой Java механизмы GSS, такие как SPNEGO, чтобы защитить ассоциацию. Эта функция доступна от Java SE 6 вперед.
Каков SPNEGO?
GSS Java является платформой, которая может поддерживать многократные механизмы безопасности; способ согласовать механизм безопасности под GSS-API необходим. Это доступно через SPNEGO.
SPNEGO является Простым и Защищенным Механизмом Согласования GSS-API, стандартизированным в IETF в Это - механизм псевдобезопасности, используемый, чтобы согласовать базовый механизм безопасности. Это обеспечивает гибкость для клиента и сервера, чтобы надежно согласовать общий механизм безопасности 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, и т.д.
src/GssSpNegoClient.javaЛистинг кода для GssSpNegoClient.java.
static class GssSpnegoClientAction 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()); // Get service's principal name GSSManager manager = GSSManager.getInstance(); Oid spnegoOid = new Oid("1.3.6.1.5.5.2"); GSSName serverName = manager.createName(serverPrinc, GSSName.NT_HOSTBASED_SERVICE, spnegoOid); // Get the context for authentication GSSContext context = manager.createContext(serverName, spnegoOid, null, GSSContext.DEFAULT_LIFETIME); context.requestMutualAuth(true); // Request mutual authentication context.requestConf(true); // Request confidentiality // Do the context establishment loop byte[] token = new byte[0]; while (!context.isEstablished()) { token = context.initSecContext(token, 0, token.length); outStream.writeInt(token.length); outStream.write(token); outStream.flush(); // Check if we're done if (!context.isEstablished()) { token = new byte[inStream.readInt()]; inStream.readFully(token); } } // Context established! // Create MessageProp for use with unwrap (true means request confidentiality) MessageProp prop = new MessageProp(0, true); // Create encrypted message and send to server byte[] reply = ...; token = context.wrap(reply, 0, reply.length, prop); outStream.writeInt(token.length); outStream.write(token); outStream.flush(); // Read token from server token = new byte[inStream.readInt()]; inStream.readFully(token); // Unwrap (decrypt) token sent by server byte[] input = context.unwrap(token, 0, token.length, prop); ... context.dispose(); socket.close(); return null; }}% javac GssSpNegoClient.java
src/GssSpNegoServer.javaЛистинг кода для GssSpNegoServer.java.
static class GssSpNegoServerAction 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 GSSManager manager = GSSManager.getInstance(); Oid spnegoOid = new Oid("1.3.6.1.5.5.2"); GSSCredential serverCreds = manager.createCredential(null, GSSCredential.DEFAULT_LIFETIME, spnegoOid, GSSCredential.ACCEPT_ONLY); while (true) { Socket socket = ss.accept(); DataInputStream inStream = new DataInputStream(socket.getInputStream()); DataOutputStream outStream = new DataOutputStream(socket.getOutputStream()); GSSContext context = manager.createContext((GSSCredential)serverCreds); // Do the context establishment loop byte[] token = null; while (!context.isEstablished()) { // Read token token = new byte[inStream.readInt()]; inStream.readFully(token); // Process token token = context.acceptSecContext(token, 0, token.length); // Send a token to the peer if one was generated by acceptSecContext outStream.writeInt(token.length); outStream.write(token); outStream.flush(); } // Context established! // Create MessageProp for use with unwrap (will be set upon return from unwrap) MessageProp prop = new MessageProp(0, false); // Read token from client token = new byte[inStream.readInt()]; inStream.readFully(token); // Unwrap (decrypt) token sent by client byte[] input = context.unwrap(token, 0, token.length, prop); ... // Create new token and send to client byte[] reply = ...; token = context.wrap(reply, 0, reply.length, prop); outStream.writeInt(token.length); outStream.write(token); outStream.flush(); context.dispose(); socket.close(); } }}% javac GssSpNegoServer.java
% xterm & % java -Djava.security.auth.login.config=jaas-krb5.conf GssSpNegoServer
host работа машины j1hol-001, Вы ввели бы следующий. Когда запрошено пароль, введите changeit. % java -Djava.security.auth.login.config=jaas-krb5.conf \ GssSpNegoClient host j1hol-001
Вывод для того, чтобы работать GssSpNegoServer пример.
Authenticated principal: [host/j1hol-001@J1LABS.EXAMPLE.COM]Waiting for incoming connections...Got connection from client /129.145.128.102Context Established!Client principal is test@J1LABS.EXAMPLE.COMServer principal is host/j1hol-001@J1LABS.EXAMPLE.COMMutual authentication took place!Received data "Hello There!" of length 12Confidentiality applied: trueSending: Hello There! Thu May 06 12:11:15 PDT 2005Вывод для того, чтобы работать GssSpNegoClient пример.
Kerberos password for test: changeitAuthenticated principal: [test@J1LABS.EXAMPLE.COM]Connected to address j1hol-001/129.145.128.102Context Established!Client principal is test@J1LABS.EXAMPLE.COMServer principal is host@j1hol-001Mutual authentication took place!Sending message: Hello There!Will read token of size 93Received 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".