基本原理
SSH(Secure Shell)是一个提供数据通信安全、远程登录、远程指令执行等功能的安全网络协议。SSH发展了两个大版本SSH-1和SSH-2,目前主流的是SSH-2协议。SSH的主要特性,避免数据内容泄漏,数据被篡改,以及发送或接受地址伪装。SSH登录中主要分为认证阶段和传输阶段。由于非对称加密解密(公钥私钥)时间较慢,所以只在登录认证阶段使用。认证成功后通信双方使用在认证阶段两者约定的对称加密算法对传输内容进行加密解密。下面介绍客户端认证的两种主要登录方式,Password和Public Key。
Password
Password方式既客户端提供用户和密码,服务端对用户和密码进行匹配,完成认证。类Unix系统中,如OpenSSH的框架,一般通过系统的本地接口完成认证。Password的优势是简单,无需任何而外的配置就可以使用。缺点密码不便于记忆。
Public Key
Public Key认证的基本原理是基于非对称加密,分别在服务端对一段数据通过公钥进行加密,如果客户端能够证明其可以使用私钥对这段数据进行解密,则可以说明客户端的身份。因为服务端需要使用客户端生成的密钥对的公钥对数据首先加密,所以需要先将公钥存储到服务端的密钥库(Auhtorized Key)。关于非对称加密,本质来说就是利用数学上因式分解难度的非对称性。
实践例子
Java客户端
JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。maven如下。
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.50</version>
</dependency>
远程执行shell
import static java.lang.String.format;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jcraft.js