자체 제작 SSH 클라이언트: 2. 대문 두드리기
서버의 ssh 서비스를 연결합니다
ClientSocket client = new ClientSocket(socket);
client.setClientListener(listener);
client.start();
ssh = new SSH(client.getName());
여기에서 클라이언트 리스너의 인터페이스 리셋을 실현한 것을 볼 수 있습니다. 이 인터페이스는 장기적으로 서버와 접촉할 것입니다.
static ClientListener listener = new ClientListener() {
@Override
public void onSendData(ClientSocket client, byte[] data) {
System.out.println(" ");
}
@Override
public void onReceiveData(ClientSocket client, byte[] data) {
System.out.println(" :" + client.getName());
System.out.println("" + new String(data));
ClientSocket.outHexByteArgs(data);
switch (index) {
case 0://
String version = new String(data);
String serverVersion = ssh.version(version);
client.send(data);
System.out.println("ServerVersion:" + serverVersion
+ "| ");
index++;
break;
case 1://
client.send(data);
System.out.println(" ");
index++;
break;
case 2:
}
}
@Override
public void onConnect(ClientSocket client) {
System.out.println(" ");
}
@Override
public void onClose(ClientSocket client) {
System.out.println(" ");
}
};
이곳에서 나는 이미 앞의 두 악수를 실현했다.
전체 통신 과정에서 SSH의 안전한 연결을 실현하기 위해 서버 측과 클라이언트는 다음과 같은 다섯 단계를 거쳐야 한다.
* 버전 번호 협상 단계, SSH는 현재 SSH1과 SSH2 두 버전을 포함하고 있으며, 양측은 버전 협상을 통해 사용할 버전을 결정합니다.
* 키 및 알고리즘 협상 단계에서 SSH는 다양한 암호화 알고리즘을 지원하며 쌍방은 본 측 및 본 측 지원 알고리즘에 따라 최종 사용 알고리즘을 협상합니다.
* 인증 단계에서 SSH 클라이언트가 서버 측에 인증 요청을 하고 서버 측이 클라이언트를 인증합니다.
* 세션 요청 단계, 인증이 통과되면 클라이언트가 서버 측에 세션 요청을 보냅니다.
* 대화식 세션 단계, 세션 요청 통과 후 서버 측 및 클라이언트가 정보를 상호 작용
일.버전 번호 협상 단계
1.서버가 클라이언트 연결을 기다리기 위해 포트 22를 엽니다.
2.클라이언트가 서버 측에 TCP 초기 연결 요청을 하고 TCP 연결이 설정되면 서버는 클라이언트에게 버전 플래그 문자열을 포함하여 첫 번째 메시지를 보냅니다. 형식은 "SSH – <마스터 프로토콜 버전 번호>.<보조 프로토콜 버전 번호> – <소프트웨어 버전 번호>"이고 프로토콜 버전 번호는 마스터 버전 번호와 보조 버전 번호로 구성되며 소프트웨어 버전 번호는 디버깅에 주로 사용됩니다.
3.클라이언트가 메시지를 받은 후에 이 데이터 패키지를 분석합니다. 만약에 서버 측의 프로토콜 버전 번호가 자신보다 낮고 클라이언트가 서버 측의 낮은 버전을 지원할 수 있다면 서버 측의 낮은 버전 프로토콜 번호를 사용하십시오. 그렇지 않으면 자신의 프로토콜 버전 번호를 사용합니다.
4.클라이언트는 클라이언트가 사용하기로 결정한 프로토콜 버전 번호를 포함하는 서버에 응답합니다.서버는 클라이언트가 보낸 버전 번호를 비교하여 클라이언트와 함께 작업할 수 있는지 여부를 결정합니다.
5.협상이 성공하면 키와 알고리즘 협상 단계에 들어가고, 그렇지 않으면 서버 측에서 TCP 연결을 끊습니다.
Note: 버전 번호 협상 단계의 메시지는 모두 명문 방식으로 전송됩니다.
2. 키와 알고리즘 협상 단계
1.서버 측과 클라이언트는 각각 알고리즘 협상 메시지를 상대방에게 보내고 메시지에는 자신이 지원하는 공공 키 알고리즘 목록, 암호화 알고리즘 목록, MAC(Message Authentication Code, 메시지 검증 코드) 알고리즘 목록, 압축 알고리즘 목록 등이 포함된다.
2.서버 측과 클라이언트는 쌍방과 본 측이 지원하는 알고리즘 목록에 따라 최종적으로 사용하는 알고리즘을 얻어낸다.
3.서버 측과 클라이언트는 DH 교환(Diffie-Hellman Exchange) 알고리즘, 호스트 키 등가 매개 변수를 이용하여 세션 키와 세션 ID를 생성합니다.
상기 절차를 통해 서버 측과 클라이언트는 같은 세션 키와 세션 ID를 얻었다.
* 이후에 전송되는 데이터의 경우 양쪽 모두 세션 키를 사용하여 암호화 및 복호화하여 데이터 전송의 안전을 보장합니다.
* 인증 단계에서 양쪽 끝에는 세션 ID가 인증 프로세스에 사용됩니다.
Note:
협상 단계에 앞서 서버 측은 세션 키 생성에 참여하는 RSA 또는 DSA 키 쌍을 생성했습니다.
3. 인증 단계
1.클라이언트는 서버 측에 인증 요청을 발송하는데 인증 요청에는 사용자 이름, 인증 방법, 이 인증 방법과 관련된 내용(예를 들어password 인증 시 내용은 비밀번호)이 포함되어 있다.
2.서버 측은 클라이언트에 대해 인증을 하고 인증이 실패하면 클라이언트에게 인증 실패 메시지를 보냅니다. 인증할 수 있는 방법 목록이 포함되어 있습니다.
3.클라이언트는 인증 방법 목록에서 인증 방법을 선택하여 다시 인증합니다.
4.이 과정은 인증이 성공하거나 인증 횟수가 상한선에 도달하고 서버가 연결을 닫을 때까지 반복적으로 진행된다.
SSH는 두 가지 인증 방식을 제공합니다.
1. password 인증: 클라이언트가 서버에password 인증 요청을 보내고 사용자 이름과 비밀번호를 암호화하여 서버에 보냅니다.서버는 이 정보를 복호화한 후 사용자 이름과 비밀번호의 명문을 얻어 장치에 저장된 사용자 이름과 비밀번호를 비교하고 인증에 성공하거나 실패한 메시지를 되돌려줍니다.
2. publickey 인증: 디지털 서명 방법으로 클라이언트를 인증합니다.현재 장치에서는 RSA와 DSA 두 가지 공통 키 알고리즘을 이용하여 디지털 서명을 할 수 있다.클라이언트는 사용자 이름, 공공 키, 공공 키 알고리즘을 포함하는publickey 인증 요청을 서버에 보냅니다.서버가 공공 키에 대해 합법성 검사를 하고 합법적이지 않으면 실패 메시지를 직접 보냅니다.그렇지 않으면 서버는 디지털 서명을 이용하여 클라이언트를 인증하고 인증 성공 또는 실패 메시지를 되돌려줍니다.
SSH2.0은 password-publickey 인증과 any 인증도 제공합니다.
1. password-publickey 인증: 이 사용자의 인증 방식을 password와publickey 인증으로 동시에 만족시키도록 지정합니다.클라이언트 버전이 SSH1인 사용자는 인증 중 하나만 통과하면 로그인할 수 있습니다.클라이언트 버전이 SSH2인 사용자는 두 인증 모두 통과해야 로그인할 수 있습니다.
2. any 인증: 이 사용자의 인증 방식은password일 수도 있고,publickey일 수도 있습니다.
4. 세션 요청 단계
1.서버가 클라이언트의 요청을 기다립니다.
2.인증이 통과되면 클라이언트는 서버에 세션 요청을 보냅니다.
3.서버가 클라이언트의 요청을 처리합니다.요청이 성공적으로 처리되면 서버는 클라이언트에게 SSH_SMSG_SUCCESS 패키지, SSH 대화식 세션 단계 진입;그렇지 않으면 SSH_ 응답SMSG_서버 처리 요청이 실패했거나 요청을 인식할 수 없음을 나타내는 FAILURE 패키지입니다.
5. 대화식 세션 단계
이 모드에서 데이터는 양방향으로 전송됩니다.
1.클라이언트가 실행할 명령을 암호화하여 서버에 전송하기;
2.서버가 메시지를 수신하여 복호화한 후 이 명령을 실행하고 실행 결과를 암호화하여 클라이언트에게 돌려보냅니다.
3.클라이언트가 받은 결과를 복호화하여 터미널에 표시합니다.
모든 자료는 스스로 찾습니다. 다행히도 OpenSSH가 있고 후기에 자료를 찾지 못하면 원본 코드를 참고할 수 있습니다.
SSH 프로토콜에 대한 설명은 다음으로 이동하십시오. (참고 자료를 찾을 수 있도록 두 분이 게시한 블로그에 감사드립니다.)
http://blog.csdn.net/macrossdzh/article/details/5691924
http://blog.sina.com.cn/s/blog_3f76315e0101rst2.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.