0
Java RMI를 사용하여 클라이언트 -> 서버에서 객체를 보냅니다. 기본 객체가 정상적으로 작동합니다 (예 : 문자열 등) 암호화 라이브러리의 Java 객체가 예외를 throw합니다. 여기 사용해 DiffieHellman 키 교환 예외의 비밀 키에 정착이 자바 객체가 필요합니다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());
}
}
이 문제를 해결할 수있는 방법이 있는지 모르겠습니다. 일부 클래스는 직렬화를 지원하지 않습니다. – ntoskrnl
정확합니다. Serializable이 아닌 경우 원격 메소드에서 사용할 수 없습니다. 그러나 바이트로 가져 와서 바이트를 보내고 수신기의 바이트에서 다시 구성 할 수 있습니다. 관심있는 암호화 객체에 대한 API를 살펴보십시오. 그것들은 대부분'getEndoded()'메쏘드와 바이트 배열로부터 그것들을 빌드 할 수있는 팩토리 나 생성자를 가지고 있습니다. – EJP