当前位置: 首页 > 科技观察

Java使用Jsch和sftp服务器实现ssh免密码登录详解

时间:2023-03-15 13:13:42 科技观察

在实际项目中,经常会遇到需要连接服务器获取文件的场景。比如会计系统需要连接到银行的sftp服务器拉回单文件。本文将主要讨论在Java中使用jsch和sftpserver实现ssh免密连接。1、什么是SFTP?SFTP是一种安全的文件传输协议,它为传输文件提供了一种安全的加密方法。SFTP是SSH的一部分,是一种将文件传输到服务器的安全方式。SFTP使用加密来传输认证信息和传输的数据,所以使用SFTP是非常安全的。但由于这种传输方式采用了加密/解密技术,传输效率比普通FTP要低很多。如果你对网络安全有更高的要求,可以使用SFTP代替FTP。2.什么是Jsch及其作用?Jsch是一个纯java库,在java中实现SSH功能。要想了解Jsch的功能,首先要了解SSH。SSH是一种用于不同系统或服务器之间安全连接的安全协议,在连接和数据传输过程中进行加密。SSH一般是基于客户端或者Linux命令行。比如window使用OpenSSH、putty等客户端工具。在Linux上,您可以使用sshusername@host命令进行连接。但是如何在Java中实现SSH呢?这个时候这个功能是通过JSCH来实现的。三、JSCH的依赖com.jcraftjsch0.1.51四、Jsch详解1、Jsch提供四种Type认证机制:passwordpasswordpublickey(DSA,RSA)public-privatekeykeyboard-interactivegss-api-with-mic常用的认证方式是password认证,本文接下来主要讨论基于publickey的认证。对后两种认证方式感兴趣的朋友可以参考相关资料,本文不做赘述。二、SSH免密码配置步骤概述在Linux下执行ssh-keygen-trsa,生成一对对应的公私钥。将公钥复制到要连接的目标服务器,放在对应用户的.ssh目录下。进入.ssh:cd~/.ssh,将公钥导入authorized_keys信任列表:catpublickey>>authorized_key更新权限:chmod600authorized_keys,至此SSH免密登录配置完成。3.jsch基于publickey认证Demo//从配置文件中读取目标服务器ip、端口、用户名、私钥路径StringftpHost=prop.getProperty("downloadHost");Stringport=prop.getProperty("downloadftpPort");StringftpUserName=prop.getProperty("downloadUserName");StringpriKeyBasePath=prop.getProperty("priBaseKeyPath");//创建JSch对象JSchjsch=newJSch();Sessionsession=null;ChannelSftpchannelSftp=nulltry{//添加私钥jsch.addIdentity(priKeyBasePath);session=jsch.getSession(userName,hostIp,port);PropertiessessionConfig=newProperties();//SSH公钥校验机制no,ask,yessessionConfig.put("StrictHostKeyChecking","no");session.connect();channelSftp=(ChannelSftp)session.openChannel("sftp");//打开SFTP通道channelSftp.connect();//进入指定文件夹等操作channelSftp.cd(config.getFileDir());}catch(JSchExceptione){logger.error("sftpgetConnecterror:"+e);}4.ChannelSftp类ChannelSftp是JSch实现SFTP的核心类,包含了SFTP的所有方法,如put()--文件上传get()--文件下载cd()--进入指定目录ls()--获取指定目录下的文件列表rename()--重命名指定文件或目录rm()--删除指定文件mkdir()--创建目录rmdir()--删除目录本Demo摘录Jsch核心主要代码进行讨论,省略其他codes网上也有很多基于集成其他认证方式的完整工具,需要的朋友可以自行查找。5、SSH公钥校验机制:公钥校验机制是一种可以防止中间人劫持等黑客攻击的安全机制。当SSH连接到远程主机时,它会检查主机的公钥。如果是第一次主持,会显示主持人的公钥摘要,提示用户是否信任该主持人。接受后,主机的公钥将附加到文件~/.ssh/known_hosts。再次连接主机时,不会再提示该问题。但是在一些特殊情况下,严格的SSH公钥校验可能会破坏一些依赖SSH协议的自动化任务,比如Java的Jsch免密码登录sftp程序。解决方法是调整StrictHostKeyChecking配置命令。StrictHostKeyChecking选项如下:no最不安全的级别,当然没有那么多烦人的提示,推荐用于相对安全的内网测试。如果连接服务器的key在本地不存在,会自动添加到文件中(默认为known_hosts),并给出警告。默认的ask级别就是刚才的提示。如果连接和密钥不匹配,则提示并拒绝登录。yes是最安全的级别,如果连接和密钥不匹配,将拒绝连接而不提示详细信息。5.总结Jsch是一个用Java实现SSH功能的Java库,可以用来连接sftp服务器。它有4种认证方式,其中publickey方式通过配置公钥和私钥实现SSH免密码登录。在Java程序中,使用Jsch核心类ChannelSftp进行sftp操作。连接过程中的SSH公钥校验机制可以根据实际情况进行调整。