jsch配置sftp服务器ssh免密登录
前期对接了一个通过ssh免密登录的需求,是基于原先密码登录sftp服务器的代码上进行改造,实际上代码改动量非常少,趁此机会对自己整理的资料做一下总结。
1. 什么是SFTP
SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。
2. 什么是Jsch以及它的作用
Jsch是一个纯粹的用java实现SSH功能的java library。如果要知道Jsch的功能需先了解一下SSH。SSH是一个安全协议,用来在不同系统或者服务器之间进行安全连接,在连接和传送数据的过程中会进行加密。SSH一般是基于客户端的或者Linux命令行,比如window同过OpenSSH、putty等客户端的工具,在linux上可以通过ssh username@host命令进行连接。但是如果在Java中如何实现SSH呢?这时候便是通过JSCH来实现此的功能。
3. sftp服务器认证机制
Jsch提供了四种认证机制:
- password 密码方式
- publickey(DSA,RSA) 公私钥方式
- keyboard-interactive
- gss-api-with-mic
其中publickey方式通过配置公私钥实现SSH免密登录,这里也只是简单讲一下它的使用,深入使用和需要自己研究。
4. publickey和password两种方式登录sftp的API调用
SSH公钥检查机制:
公钥检查机制是一个安全机制,可以防范中间人劫持等黑客攻击。SSH连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机。当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 但是在某些特殊的情况下,严格的SSH公钥检查可能会破坏一些依赖SSH协议的自动化任务如Java的Jsch免密登录sftp程序。解决方式为调整StrictHostKeyChecking配置指令。StrictHostKeyChecking选项如下3种:
- no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
- ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
- yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。
下面根据password来分析publickey方式与其区别:
- 原来password方式需要这样一段代码来设置密码:session.setPassword (properties.getPassword ()); ,但是ssh key的方式就没有password了,所以这段要删掉。
- publickey需要设置我们的ssh私钥文件的全路径(privateKeyFile):jsch.addIdentity (properties.getPrivateKeyFile ());
- 一般私钥文件需要口令(passphrase)才能读取,这需要设置一个配置类对象,在jsch里其实需要自己搞一个简单的接口实现(如下:SftpAuthKeyUserInfo类 ),然后增加:session.setUserInfo(new SftpAuthKeyUserInfo (properties.getPassphrase ()));
因此代码可以如下改造:
1. 设置配置类对象
SftpAuthKeyUserInfo.java
import com.jcraft.jsch.UserInfo;
import lombok.extern.slf4j.Slf4j; /**
* ssh private key passphrase info
*/
@Slf4j
public class SftpAuthKeyUserInfo implements UserInfo {
/**
* ssh private key passphrase
*/
private String passphrase; public SftpAuthKeyUserInfo (String passphrase) {
this.passphrase = passphrase;
} @Override
public String getPassphrase() {
return passphrase;
} @Override
public String getPassword() {
return null;
} @Override
public boolean promptPassphrase(String s) {
return true;
} @Override
public boolean promptPassword(String s) {
return false;
} @Override
public boolean promptYesNo(String s) {
return true;
} @Override
public void showMessage(String message) {
log.info ("SSH Message:{}", message);
}
}
2. 改造以适配publickey登录方式
JSch jsch = new JSch();
if (StringUtils.isNotBlank(properties.getPrivateKeyFile())) {
jsch.addIdentity(properties.getPrivateKeyFile());
}
// 根据用户名,主机ip,端口获取一个Session对象
Session session = jsch.getSession(properties.getUsername(), properties.getHost(), properties.getPort());
switch (properties.getAuthType()) {
case PASSWORD:
Objects.requireNonNull(properties.getPassword());
session.setPassword(properties.getPassword());
break;
case PUBLIC_KEY:
Objects.requireNonNull(properties.getPrivateKeyFile());
if (StringUtils.isBlank(properties.getPassphrase())) {
throw new IllegalArgumentException("口令不为能空(私钥未加密时填任意值)");
}
session.setUserInfo(new SftpAuthKeyUserInfo(properties.getPassphrase()));
break;
}
// 设置timeout时间
session.setTimeout(properties.getConnectTimeout());
// 设置keep-alive消息发送间隔(milliseconds)
session.setServerAliveCountMax(properties.getServerAliveCountMax());
// 设置发送keep-alive消息的最大次数
session.setServerAliveInterval(properties.getServerAliveInterval());
//第一次登陆时候,是否需要提示信息
session.setConfig("StrictHostKeyChecking", "no");
//设置ssh的DH秘钥交换
session.setConfig("kex", "diffie-hellman-group1-sha1");
//跳过Kerberos username 身份验证提示
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
// 通过Session建立链接
synchronized (properties) {
session.connect();
}
// 打开SFTP通道
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
// 建立SFTP通道的连接
channel.connect();
if (log.isDebugEnabled()) {
log.debug("SSH Channel connected.session={},channel={}", session, channel);
}
参考: https://www.jb51.net/article/172545.htm
jsch配置sftp服务器ssh免密登录的更多相关文章
- 多台服务器-SSH免密登录设置
在4台服务器-SSH免密登录设置,如以下4台服务器 master1 node001 node002 node003 我想在master1对4台服务器进行拉取或者分发任务或者是集群服务器的批量操作,但是 ...
- 【Linux】两台服务器ssh免密登录
背景: 有些场景可能用到两台服务器ssh免密登录.比如服务器自动化部署 开始准备: 服务器A linux ip: 192.168.1.1 服务器B linux ip: 192.168.1. ...
- linux服务器ssh免密登录
环境:两台服务器,Park01.Park02,配置ssh免密登录 在Park01执行:ssh-keygen 然后一直回车 生成节点的公钥和私钥,生成的文件会自动放在/root/.ssh目录下 然后 ...
- Centos服务器ssh免密登录以及搭建私有git服务器
一.概述 服务器的免密登录和git服务器的搭建,关键都是要学会把自己用的机器的公钥添加到服务器上,让服务器“认识”你的电脑,从而不需要输入密码就可以远程登录服务器上的用户 免密登录当然是登录root用 ...
- 吴裕雄--天生自然 HADOOP大数据分布式处理:使用XShell远程连接主机与服务器并配置它们之间SSH免密登录
- ssh免密登录linux服务器
Ssh免密登录 sshd服务 sshd简介: SSH 密钥为登录 Linux 服务器提供了更好且安全的机制.运行 ssh-keygen 后,将会生成公私密钥对.你可以将公钥放置到任意服务器,从持有私钥 ...
- Centos7配置ssh免密登录群发
ssh免密登录是客户端发送自己的公钥到服务器.用公钥进行解密,自己生成的私钥进行加密. 首先在客户端查看sshd服务是否启动 [zhiwei@zhiwei1 ~]$ ps -Af|grep sshd; ...
- Cmder下ssh免密登录配置
1.本地生成ssh-key 在本地cmder终端下运行下面的命令生成ssh的公钥和私钥文件: ssh-keygen -t rsa 其中,.ssh/id_rsa为私钥文件,留在本地使用,而.ssh/id ...
- 记一次Xshell配置ssh免密登录时的问题
问题: 今天在配置SSH免密登录连接自己的阿里云服务器,在将RSA加密生成的公钥放到服务器后,用Xshell连接服务,出现所选的用户密钥未在远程主机上注册这样的提示,一时懵逼,不知所措,后面终于找到了 ...
随机推荐
- 英语hecatolite月长石hecatolite月光石
月长石英文名字为hecatolite即月光石.当白色的光照到宝石上因宝石内特殊的结构而产生干涉颜色,在宝石表面可见到白至淡蓝色的闪光,犹如朦胧月光.这是由于正长石出溶有钠长石,钠长石在正长石晶体内定向 ...
- 环境搭建:Jupyter Notebook 密码设置
原文参考:关于jupyter notebook密码设置 原文博主: 一.windows下,打开命令行,重新生成一个jupyter配置文件 jupyter notebook --generate-con ...
- likely和unlikely是如何对代码的优化?
在执行if判断时,可以使用GCC提供了__builtin_expect对代码进行优化,可以提高代码的运行速度,参考GCC手册的"3.10 Options That Cont ...
- backtrace() returns only one stack frame
参考: 在Linux中如何利用backtrace信息解决程序崩溃的问题 linux 打印堆栈方法 https://devtalk.nvidia.com/default/topic/987279/jet ...
- [图解]Windows下使用Zend Studio 10和XAMPP 1.8搭建开发环境,ZendFramework 2 HelloWorld
1.下载并安装 ZendStudio,搜一个破解版 XAMPP,官网下载:https://www.apachefriends.org/index.html 2.打开ZendStudio新建一个php项 ...
- Elasticsearch 概念理解
官方文档地址 Filebeat: https://www.elastic.co/cn/products/beats/filebeat https://www.elastic.co/guide/en/b ...
- discuz! X3.4特殊字符乱码解决方案
Discuz! X3.4升级后,帖子内容使用Unicode编码会出现直接显示源码问题 打开:source\function\function_core.php $string = str_replac ...
- Redis Cluster数据分片机制
复制粘贴自: https://www.e-learn.cn/content/redis/2344485, 点击链接访问原文 仅供个人学习参考之用, 如有侵权, 请联系删除! 高级开发不得不懂的Redi ...
- js事件绑定方法
最近收集了一些关于JavaScript绑定事件的方法,汇总了一下,不全面,但是,希望便于以后自己查看. JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScr ...
- vector rIterator
#include<vector> #include<iostream> using namespace std; void main() { vector<int> ...