centos(18)-putty/winscp实现ssh密钥登录

本文详细介绍了SSH密码登录和密钥登录的过程,分析了密码登录的安全隐患,并深入讲解了更安全的SSH密钥登录方式,包括密钥生成、配置及流程,以及如何关闭密码登录增强服务器安全性。

第3篇,我讲过用putty/winscp输入用户名/密码,远程登录服务器,这种登录方式存在一些安全隐患。而本篇讲的密钥登录是一种安全性别更高的登录方式。关于密钥及其他本篇讲到的一些安全性知识概念,参考web安全 (1)

ssh密码登录

linux远程连接是使用的ssh,和https有点类似,流程如下:

1.服务器开启时默认会打开ssh服务,ssh服务会检测服务器私钥/公钥,如果不存在就自动生成。

2.用户请求连接服务器。

3.服务器发送公钥给客户端。我在第3篇讲过,如果用户是第一次连接服务器,会弹出一个窗口。提示大意是收到了来自服务器的公钥,而且它是未知的,是否信任它?如果选是,会将这个公钥保存在客户端,以后再次登录时,将新收到的公钥和之前的对比一致,说明它是可信的,不再弹出提示。如果和之前的不一致,可能是服务器修改了密钥,或者遇到了黑客。此时也会有提示:

4.客户端生成对称密钥,使用服务器的公钥加密,发给服务器。

5.服务器用自己的私钥解密,拿到对称密钥。

6.安全通道建立,客户端和服务器使用对称密钥完成登录和通信。

以上过程看似安全,但仍然有隐患:

1.我在web安全 (1)中讲过,公钥分配并不是安全的,所以如何保证客户端第一次拿到公钥是真实的?这一点最后再讲。

2.密码虽然加了密,但只要开放了密码登录,就存在被黑客攻破的可能性。而ssh密钥登录就是要关闭密码登录。

ssh密钥登录

用户生成一对公钥/私钥,公钥放在服务器,私钥放在客户端。每次登录通过公钥和私钥进行认证,而不再使用密码。如下:

生成公钥/私钥

这里用root登录服务器,执行生成密钥命令:ssh-keygen -t rsa

rsa是现在主流的非对称加密算法,执行过程中途会问你密钥保存位置,以及是否需要密码,如果设了密码以后提取密钥的时候都需要输入密码,如果密钥被盗,而对方不知道密码将无法正常使用密钥。这里全部回车跳过,全默认不设密码。默认会将公钥/私钥保存在当前用户的.ssh即/root/.ssh/目录下。

服务器公钥配置

上图最后一条命令:cat ./.ssh/id_rsa.pub >> ./.ssh/authorized_keys

将生成的公钥文件id_rsa.pub的内容,写入/root/.ssh/authorized_keys文件中,密钥登录时,服务器就是用当前用户.ssh目录下的authorized_keys文件进行认证的。登录其他用户也是一样。

客户端私钥配置(winscp)

客户端以winscp为例,将上面生成的私钥文件/root/.ssh/id_rsa复制到window中来。在登录winscp时选择高级,如下配置:

上图右下角选择你的id_rsa私钥文件,文件类型选择全部才能看到,会弹出以下提示,确定转换格式并会保存为id_rsa.ppk文件,如上红框密钥文件处。私钥配置完毕。

winscp密钥登录

此时,不需要输入密码,直接用root登录winscp,会提示公钥认证,如下

我在第3篇绑定了winscp和putty,此时会自动用密钥登录绑定的putty

putty密钥登录配置

如果要单独登录putty,配置如下

密钥登录流程

1.客户端请求连接,服务器分配公钥,这个过程和上面ssh密码登录一样,这里省略。

2.客户端请求使用密钥登录。

3.服务器生成随机字符串,使用用户的公钥加密,发给客户端。

4.客户端用自己的私钥解密随机字符串,生成md5散列值,发回给服务器。

5.服务器用原始随机字符串同样生成md5散列值,与客户端的比对一致,认证登录成功。

以上过程中,不需要输入密码,而一次性的随机数即使泄露了也没有任何意义。

关闭密码登录

修改/etc/ssh/sshd_config文件,将其中PasswordAuthentication 参数从yes改为no:PasswordAuthentication no

执行命令重启ssh服务:systemctl restart sshd

第一次登录的问题

ssh不像https有证书,所以如何保证第一次登录的安全性?

第一次登录时,服务器上通常什么资料也没有,此时并没有多大风险,而且有足够的时间检查你所连接的服务器是否真实,以及检查是否有人登录过,曾经执行过的命令历史等。假如真的有黑客在第一次入侵,可以参考我在第11篇讲的方法,找到他的id,执行kill,立即修改密码。然后建立密钥登录方式,关闭密码登录。此时即使第一次登录的密码泄露了也没事。

<think>我们正在编写一个Windows环境下的Java自动部署脚本。该脚本需要完成以下步骤: 1. 使用Maven打包项目。 2. 将打包后的文件(通常是war包或jar包)压缩(如果需要的话)。 3. 上传压缩后的文件到服务器的指定路径(例如:/csdn/kw-portal-ui/)。 4. 在Tomcat服务器上执行发布命令(例如:将war包放到webapps目录下并重启Tomcat)。 注意:由于是Windows环境,我们使用批处理脚本(.bat)或PowerShell脚本(.ps1)来实现。这里我们选择使用批处理脚本,因为其兼容性较好。 步骤分解: 1. Maven打包:在项目根目录下执行`mvn clean package`命令。 2. 压缩:如果上传需要压缩,我们可以使用Windows的压缩工具(如7zip、WinRAR)或者使用Java程序进行压缩。但为了简化,假设我们直接上传war包(通常不需要压缩)。 3. 上传到服务器:我们可以使用SCP(Secure Copy Protocol)或SFTP。在Windows上,我们可以使用pscp(PuTTY SCP)或WinSCP的命令行,或者使用PowerShell的SCP功能。这里我们使用pscp(需要提前安装PuTTY并设置环境变量)。 4. 执行Tomcat发布命令:通过SSH连接到服务器,执行一系列命令(如停止Tomcat、备份旧包、部署新包、启动Tomcat)。 因此,我们需要准备以下工具: - Maven:已安装并配置环境变量。 - PuTTY:安装并设置环境变量(以便使用pscp和plink)。 - 服务器信息:包括服务器IP、SSH端口、用户名、密码(或密钥)。 由于脚本中会包含敏感信息(如密码),在实际使用中应考虑使用密钥认证或加密存储密码,但为了简化,我们这里使用明文(注意安全)。 脚本流程: 1. 设置变量(项目路径、服务器信息、文件路径等)。 2. 执行Maven打包。 3. 使用pscp上传文件到服务器。 4. 使用plink(PuTTYSSH命令行工具)在服务器上执行命令。 假设我们的项目打包后生成一个war包,位于`target`目录下。 示例脚本(batch脚本): ```batch @echo off setlocal REM 设置项目路径(当前目录为项目根目录) set PROJECT_PATH=%~dp0 set TARGET_PATH=%PROJECT_PATH%target REM 设置服务器信息 set SERVER_IP=your_server_ip set SSH_PORT=22 set USERNAME=your_username set PASSWORD=your_password set REMOTE_DIR=/csdn/kw-portal-ui/ REM 设置war包名称(根据实际项目修改) set WAR_FILE=your-project-name.war REM 步骤1:Maven打包 echo 正在使用Maven打包... cd /d %PROJECT_PATH% call mvn clean package -DskipTests if %errorlevel% neq 0 ( echo Maven打包失败! exit /b 1 ) REM 检查war包是否存在 if not exist "%TARGET_PATH%\%WAR_FILE%" ( echo 未找到war包:%TARGET_PATH%\%WAR_FILE% exit /b 1 ) REM 步骤2:上传到服务器 echo 正在上传war包到服务器... pscp -P %SSH_PORT% -pw %PASSWORD% "%TARGET_PATH%\%WAR_FILE%" %USERNAME%@%SERVER_IP%:%REMOTE_DIR% if %errorlevel% neq 0 ( echo 上传失败! exit /b 1 ) REM 步骤3:在服务器上执行发布命令(通过SSH) echo 正在在服务器上执行发布命令... plink -P %SSH_PORT% -pw %PASSWORD% %USERNAME%@%SERVER_IP% "cd %REMOTE_DIR%; sh deploy.sh" if %errorlevel% neq 0 ( echo 执行远程命令失败! exit /b 1 ) echo 自动部署成功! endlocal ``` 注意:上面的脚本中,我们假设服务器上已经有一个部署脚本`deploy.sh`,它负责停止Tomcat、备份旧包、部署新包、启动Tomcat等操作。这样我们可以将复杂的部署逻辑放在服务器端的脚本中。 服务器端`deploy.sh`示例(需要提前放在服务器的`/csdn/kw-portal-ui/`目录下): ```bash #!/bin/bash # 设置Tomcat目录 TOMCAT_HOME=/path/to/tomcat # 设置备份目录 BACKUP_DIR=/csdn/kw-portal-ui/backup # 新war包路径 NEW_WAR=/csdn/kw-portal-ui/your-project-name.war # 停止Tomcat $TOMCAT_HOME/bin/shutdown.sh # 等待一段时间确保Tomcat停止 sleep 10 # 备份旧war包和已解压的目录 TIMESTAMP=$(date +%Y%m%d%H%M%S) mv $TOMCAT_HOME/webapps/your-project-name.war $BACKUP_DIR/your-project-name.war.$TIMESTAMP rm -rf $TOMCAT_HOME/webapps/your-project-name # 部署新war包 cp $NEW_WAR $TOMCAT_HOME/webapps/ # 启动Tomcat $TOMCAT_HOME/bin/startup.sh ``` 注意:服务器端脚本需要赋予执行权限:`chmod +x deploy.sh`。 安全提示:在脚本中直接使用明文密码存在安全风险。建议使用密钥认证(无密码登录)来替代。对于pscp和plink,可以使用私钥文件(通过`-i`参数指定)。 改进:使用密钥认证 1. 在Windows上生成密钥对(使用PuTTYgen),将公钥上传到服务器。 2. 在脚本中使用私钥文件(.ppk)进行连接。 修改上传和远程执行命令的部分: ```batch REM 设置私钥文件路径 set PRIVATE_KEY_PATH=C:\path\to\private_key.ppk REM 使用pscp上传(使用密钥) pscp -P %SSH_PORT% -i %PRIVATE_KEY_PATH% "%TARGET_PATH%\%WAR_FILE%" %USERNAME%@%SERVER_IP%:%REMOTE_DIR% REM 使用plink执行远程命令(使用密钥) plink -P %SSH_PORT% -i %PRIVATE_KEY_PATH% %USERNAME%@%SERVER_IP% "cd %REMOTE_DIR%; sh deploy.sh" ``` 这样就不需要在脚本中写密码了。 以上是一个基本的自动部署脚本框架,根据实际环境可能需要调整。 相关问题: 1. 如何为Windows上的pscp和plink设置密钥认证? 2. 如何编写更健壮的服务器端部署脚本(例如处理Tomcat未正常停止的情况)? 3. 在自动部署过程中,如何实现回滚机制? 4. 如何优化部署脚本以减少部署时的服务中断时间?</think>以下是一个完整的 Windows 环境下 Java 自动化部署脚本解决方案,包含 Maven 打包、文件压缩、上传到服务器以及 Tomcat 发布的全流程实现: ### 自动化部署脚本 (`deploy.bat`) ```batch @echo off setlocal enabledelayedexpansion REM ===== 配置参数 ===== set PROJECT_DIR=C:\your\project\path set TARGET_DIR=%PROJECT_DIR%\target set WAR_NAME=your-webapp.war set REMOTE_IP=your.server.ip set REMOTE_USER=username set REMOTE_PATH=/csdn/kw-portal-ui/ set TOMCAT_BIN=C:\Program Files\Apache Software Foundation\Tomcat 9.0\bin REM ===== 1. Maven打包 ===== echo [Step 1] 执行Maven打包... cd /d "%PROJECT_DIR%" call mvn clean package -DskipTests if %errorlevel% neq 0 ( echo [错误] Maven打包失败! exit /b 1 ) REM ===== 2. 压缩文件 ===== echo [Step 2] 压缩部署包... cd /d "%TARGET_DIR%" "C:\Program Files\7-Zip\7z.exe" a -tzip !WAR_NAME!.zip !WAR_NAME! if not exist "!WAR_NAME!.zip" ( echo [错误] 文件压缩失败! exit /b 1 ) REM ===== 3. 上传到服务器 ===== echo [Step 3] 上传到服务器... set PSCP="C:\Program Files\PuTTY\pscp.exe" -pw your_password !WAR_NAME!.zip !REMOTE_USER!@!REMOTE_IP!:!REMOTE_PATH! %PSCP% if %errorlevel% neq 0 ( echo [错误] 文件上传失败! exit /b 1 ) REM ===== 4. 执行部署命令 ===== echo [Step 4] 执行Tomcat发布... set PLINK="C:\Program Files\PuTTY\plink.exe" -pw your_password !REMOTE_USER!@!REMOTE_IP! %PLINK% "cd !REMOTE_PATH! && unzip -o !WAR_NAME!.zip && cp !WAR_NAME! /opt/tomcat/webapps/ && /opt/tomcat/bin/shutdown.sh && sleep 5 && /opt/tomcat/bin/startup.sh" echo [成功] 部署流程完成! endlocal ``` ### 服务器端准备 1. **安装必要工具** (在目标服务器执行): ```bash # CentOS示例 sudo yum install -y unzip mkdir -p /csdn/kw-portal-ui/ chmod 777 /csdn/kw-portal-ui/ ``` 2. **Tomcat 配置** (确保有执行权限): ```bash chmod +x /opt/tomcat/bin/*.sh ``` ### 客户端环境准备 1. **必需软件**: - 安装 [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) 提供 `pscp/plink` - 安装 [7-Zip](https://www.7-zip.org/) 用于压缩 - 配置 Maven 环境变量 2. **权限配置**: - 在服务器创建专用部署用户 - 配置 SSH 密钥认证(更安全): ```batch REM 替换密码认证为密钥 set PSCP="C:\Program Files\PuTTY\pscp.exe" -i C:\path\to\private_key.ppk ... ``` ### 脚本优化建议 1. **版本控制**: ```batch REM 添加时间戳版本 set TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2% set WAR_NAME=portal-v!TIMESTAMP!.war ``` 2. **回滚机制** (在服务器端添加): ```bash #!/bin/bash # rollback.sh BACKUP_DIR=/csdn/backups cp $TOMCAT_HOME/webapps/$1 $BACKUP_DIR/ rm -rf $TOMCAT_HOME/webapps/$1 unzip $BACKUP_DIR/$1.zip -d $TOMCAT_HOME/webapps/ ``` 3. **健康检查** (部署后验证): ```batch %PLINK% "curl -sI http://localhost:8080/!WAR_NAME!/health | grep '200 OK'" if %errorlevel% neq 0 ( echo [警告] 应用健康检查失败! ) ``` ### 安全注意事项 1. 使用 **SSH 密钥** 替代密码(在 `plink/pscp` 中使用 `-i key.ppk` 参数) 2. 敏感信息存储在加密配置文件中 3. 服务器配置严格的目录权限: ```bash chown -R tomcat:deploy /csdn/kw-portal-ui chmod 750 /csdn/kw-portal-ui ``` > **重要提示**:实际部署前需测试所有步骤,Tomcat 热部署可能导致类加载问题,生产环境建议使用完整重启[^5]。对于持续集成场景,可结合 Jenkins Pipeline 实现更复杂的部署流程[^1]。 --- ### 相关问题 1. 如何在 Windows 脚本中实现安全的密码管理? 2. Tomcat 热部署与冷部署有何性能差异? 3. 如何实现部署失败时的自动回滚? 4. 在容器化环境中(如 Docker),此部署流程需要怎样调整? 5. 如何监控 Java Web 应用部署后的内存和线程状态? > 引用说明: > [^1]: 关于容器启动检测机制,存活性探针确保应用可用性[^5] > [^2]: Java 项目部署规范可参考 Google Java Style Guide[^4] > [^3]: 实际部署流程需结合具体应用特性调整[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值