Spec-Zone .ru
спецификации, руководства, описания, API
|
В настоящий момент единственной безопасностью mechansim доступный с Java GSS является "Kerberos". Цель этого осуществления состоит в том, чтобы изучить, как использовать другой Java механизмы GSS, такие как SPNEGO, чтобы защитить ассоциацию. Эта функция доступна от Java SE 6 вперед.
Каков SPNEGO?
GSS Java является платформой, которая может поддерживать многократные механизмы безопасности; способ согласовать механизм безопасности под GSS-API необходим. Это доступно через SPNEGO.
SPNEGO является Простым и Защищенным Механизмом Согласования GSS-API, стандартизированным в IETF в
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.102
Context Established!
Client principal is test@J1LABS.EXAMPLE.COM
Server principal is host/j1hol-001@J1LABS.EXAMPLE.COM
Mutual authentication took place!
Received data "Hello There!" of length 12
Confidentiality applied: true
Sending: Hello There! Thu May 06 12:11:15 PDT 2005
Вывод для того, чтобы работать GssSpNegoClient
пример.
Kerberos password for test: changeit
Authenticated principal: [test@J1LABS.EXAMPLE.COM]
Connected to address j1hol-001/129.145.128.102
Context Established!
Client principal is test@J1LABS.EXAMPLE.COM
Server principal is host@j1hol-001
Mutual authentication took place!
Sending message: Hello There!
Will read token of size 93
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".