2014-11-09 2 views
0

Я использую Java RMI для отправки объектов с Клиента -> на сервер. Примитивные объекты работают отлично (например, String и т. Д.) Объекты Java из библиотеки криптографических исключений. мне нужны эти Java объекты оседать на секретный ключ в DiffieHellman Key Exchange, Исключение здесь:Отправка криптографических объектов через Java RMI

Exception in thread "main" java.rmi.MarshalException: error marshalling arguments; nested exception is: 
    java.io.NotSerializableException: javax.crypto.spec.DHParameterSpec 
    at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) 
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) 
    at com.sun.proxy.$Proxy0.DiffieExchange(Unknown Source) 
    at rmihello.Client.main(Client.java:51) 
Caused by: java.io.NotSerializableException: javax.crypto.spec.DHParameterSpec 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at sun.rmi.server.UnicastRef.marshalValue(Unknown Source) 
    ... 5 more 

Код

//The Client 
public class Client { 
    public static void main(String[] args) throws Exception { 
     HelloService lookup = (HelloService) Naming.lookup("rmi://localhost:5099/hello"); 
     //Some crypto stuff 
     String username = console.next(); 
     BigInteger p1024 = BigInteger.probablePrime(1024, new SecureRandom()); 
     BigInteger g = BigInteger.valueOf(2); 
     DHParameterSpec dhParams = new DHParameterSpec(p1024,g); 
     //A Module I have that generates KeyPairs 
     KeyPair kp = DiffieHellmanModule.genDHKeyPair(dhParams); 
     PublicKey clientPubKey = kp.getPublic(); 
     //@@@@@@@[email protected]@@@@@@ 
     PublicKey serverPubKey = lookup.DiffieExchange(clientPubKey,dhParams,username); 
    } 
} 

//The interface for RMI 
public interface HelloService extends Remote{ 
    public PublicKey DiffieExchange(PublicKey clientPublicKey, 
       DHParameterSpec dhParams,String username) throws RemoteException; 
} 
//The server servant implementing the interface for RMI 
public class HelloServant extends UnicastRemoteObject implements HelloService{ 

    protected HelloServant() throws RemoteException { 
     super(); 
    } 

    @Override 
    public PublicKey DiffieExchange(PublicKey clientPublicKey, 
      DHParameterSpec dhParams, String username) throws RemoteException { 
     KeyPair key = DiffieHellmanModule.genDHKeyPair(dhParams); 
     PublicKey serverPubKey = key.getPublic(); 
     return serverPubKey; 
    } 
} 
//The Application server 
public class ApplicationServer { 
    public static void main(String[] args) throws RemoteException, AlreadyBoundException { 
     Registry registry = LocateRegistry.createRegistry(5099); 
     registry.rebind("hello", new HelloServant()); 
    } 
} 
+1

Я не уверен, есть ли способ решить это - некоторые классы просто не поддерживают сериализацию. – ntoskrnl

+1

Точно так. Если они не являются Serializable, вы не можете использовать их в удаленных методах. Тем не менее, вы можете получить их в виде байтов, отправить байты и восстановить их из байтов в приемнике. Взгляните на API для интересующих криптографических объектов. В основном они имеют методы getEndoded() 'и фабрики или конструкторы, которые могут создавать их из массивов байтов. – EJP

ответ

0

Если они не Serializable, вы не можете использовать их в удаленных методы.

Возможно, вы можете получить их в виде байтов, отправить байты и восстановить их из байтов в приемнике. Взгляните на API для интересующих криптографических объектов. Объекты Crypto в Java в основном имеют методы getEncoded(), а также фабрики или конструкторы, которые могут создавать их из массивов байт.

Смежные вопросы