Linux安全之SSH 密钥创建及密钥登录

2023-10-27

在我们平时使用Linux系统时候,通常使用的Linux SSH登录方式是用户名加密码的登录方式,今天来探讨另外的一种相对安全的登录方式——密钥登录。

我们知道SSH登录是用的RSA非对称加密的,所以我们在SSH登录的时候就可以使用RSA密钥登录,SSH有专门创建SSH密钥的工具ssh-keygen,下面就来一睹风采。

首先进入Linux系统的用户目录下的.ssh目录下,root用户是/root/.ssh,普通用户是/home/您的用户名/.ssh,我们以root用户为例:

 

cd /root/.ssh

  可以先看看目录下,如果没有进行过ssh密钥创建是长这样子的:

 

 执行ssh-keygen命令创建密钥对,

 

ssh-keygen -t rsa -b 4096

这里笔者加了-b 参数,指定了长度,也可以不加-b参数,直接使用ssh-keygen -t rsa,ssh-keygen命令的参数后文再介绍。

 

执行密钥生成命令,基本上是一路回车既可以了,但是需要注意的是:执行命令的过程中是会提示呢输入密钥的密码的(如下图中红色箭头处,输入两次相同的,即是又一次确认密码),不需要密码直接回车就行。

密钥生成后会在当前目录下多出两个文件,id_rsa和id_rsa.pub,其中id_rsa是私钥(敲黑板:这个很重要,不能外泄),id_rsa.pub这个是公钥,

把公钥拷贝到需要登录的远程服务器或Linux系统上,这里可以使用ssh-copy-id自动完成,也可以手动追加秘钥到远程服务器。

方法一(推荐):

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.100.10

执行命令了会要求输入远程机器的密码,输入密码即可。

注:ssh-copy-id默认端口是22,如果您的SSH端口不是22,也就是远程服务器端口修改成其他的了,那就要得加上 -p +端口。

方法二:

进入远程服务器需要SSH登录的用户的目录下,这里仍然用root用户,cd /root/.ssh,执行ls看看目录下是否有authorized_keys文件没有的话则执行以下命令创建:

 

touch authorized_keys

 

执行成功会创建空authorized_keys文件,授予600权限(注意:此处权限必须是600):

 

chmod 600 /root/.ssh/authorized_keys

 

如果已经有了authorized_keys文件,这直接执行以下的密钥追加工作。

将上面生成的公钥id_rsa.pub追加到authorized_keys文件中:

 

cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

如下图所示,注意图中红色箭头处,是>>而不是>,双尖括号>>表示像向文件中追加

 


单尖括号>表示将文件内容全部替换掉;也就是说使用单尖括号>,authorized_keys文件里面如果原来有内容的话就全部不在了。


密钥准备好了接下来就可以使用密钥登录了,

 

ssh -i ./id_rsa root@192.168.100.39
或者ssh root@192.168.100.39 -i ./id_rsa

注意:id_rsa是私钥,笔者这里是进入私钥的目录下操作的,如果没在私钥的目录下,请写全目录,比如/mnt/id_rsa,也可以是您自定义的目录。执行命令过程中,如果创建密钥对的时候设置了密码,则会提示您输入密码,没有的话会直接登录。

 


在Windows系统上使用密钥的话要看您使用的工具是否支持密钥登录, 笔者这里使用Xshell 5 演示,

在输入密码处选择Public key,可以在浏览处添加密钥,这里添加的是私钥id_rsa,如果创建密钥对的时候设置密码了,需要在下方的密码框中输入密码,没有密码直接确定登录。

小贴士:

 

ssh-keygen可用的参数选项有:

     -a trials
             在使用 -T 对 DH-GEX 候选素数进行安全筛选时需要执行的基本测试数量。

     -B      显示指定的公钥/私钥文件的 bubblebabble 摘要。

     -b bits
             指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。

     -C comment
             提供一个新注释

     -c      要求修改私钥和公钥文件中的注释。本选项只支持 RSA1 密钥。
             程序将提示输入私钥文件名、密语(如果存在)、新注释。

     -D reader
             下载存储在智能卡 reader 里的 RSA 公钥。

     -e      读取OpenSSH的私钥或公钥文件,并以 RFC 4716 SSH 公钥文件格式在 stdout 上显示出来。
             该选项能够为多种商业版本的 SSH 输出密钥。

     -F hostname
             在 known_hosts 文件中搜索指定的 hostname ,并列出所有的匹配项。
             这个选项主要用于查找散列过的主机名/ip地址,还可以和 -H 选项联用打印找到的公钥的散列值。

     -f filename
             指定密钥文件名。

     -G output_file
             为 DH-GEX 产生候选素数。这些素数必须在使用之前使用 -T 选项进行安全筛选。

     -g      在使用 -r 打印指纹资源记录的时候使用通用的 DNS 格式。

     -H      对 known_hosts 文件进行散列计算。这将把文件中的所有主机名/ip地址替换为相应的散列值。
             原来文件的内容将会添加一个".old"后缀后保存。这些散列值只能被 ssh 和 sshd 使用。
             这个选项不会修改已经经过散列的主机名/ip地址,因此可以在部分公钥已经散列过的文件上安全使用。

     -i      读取未加密的SSH-2兼容的私钥/公钥文件,然后在 stdout 显示OpenSSH兼容的私钥/公钥。
             该选项主要用于从多种商业版本的SSH中导入密钥。

     -l      显示公钥文件的指纹数据。它也支持 RSA1 的私钥。
             对于RSA和DSA密钥,将会寻找对应的公钥文件,然后显示其指纹数据。

     -M memory
             指定在生成 DH-GEXS 候选素数的时候最大内存用量(MB)。

     -N new_passphrase
             提供一个新的密语。

     -P passphrase
             提供(旧)密语。

     -p      要求改变某私钥文件的密语而不重建私钥。程序将提示输入私钥文件名、原来的密语、以及两次输入新密语。

     -q      安静模式。用于在 /etc/rc 中创建新密钥的时候。

     -R hostname
             从 known_hosts 文件中删除所有属于 hostname 的密钥。
             这个选项主要用于删除经过散列的主机(参见 -H 选项)的密钥。

     -r hostname
             打印名为 hostname 的公钥文件的 SSHFP 指纹资源记录。

     -S start
             指定在生成 DH-GEX 候选模数时的起始点(16进制)。

     -T output_file
             测试 Diffie-Hellman group exchange 候选素数(由 -G 选项生成)的安全性。

     -t type
             指定要创建的密钥类型。可以使用:"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2)

     -U reader
             把现存的RSA私钥上传到智能卡 reader

     -v      详细模式。ssh-keygen 将会输出处理过程的详细调试信息。常用于调试模数的产生过程。
             重复使用多个 -v 选项将会增加信息的详细程度(最大3次)。

     -W generator
             指定在为 DH-GEX 测试候选模数时想要使用的 generator

     -y      读取OpenSSH专有格式的公钥文件,并将OpenSSH公钥显示在 stdout 上。
ssh-copy-id的参数有:

    -i #指定密钥文件
    -p #指定端口,默认端口号是22
    -o <ssh -o options>
    user@]hostname #用户名@主机名
    -f: force mode -- copy keys without trying to check if they are already installed
    -n: dry run    -- no keys are actually copied
    -h|-?: 显示帮助

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux安全之SSH 密钥创建及密钥登录 的相关文章

  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 如何以编程方式启动 ssh 服务器 android,以及如何获取连接到设备的用户名和密码

    我正在开发像这样的应用程序sshdroid 我想在 Android 操作系统上打开 ssh 连接 并且我想从电脑连接应用程序 我使用了 JSCH lib 但是这个lib用于将android连接到pc 我的要求是pc到android 任何人都
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • Linux 上有关 getBounds() 和 setBounds() 的 bug_id=4806603 的解决方法?

    在 Linux 平台上 Frame getBounds 和 Frame setBounds 的工作方式不一致 这在 2003 年就已经有报道了 请参见此处 http bugs java com bugdatabase view bug do
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

    如何确定是否可以将给定数量的字节写入文件句柄 实际上是套接字 或者 如何 取消读取 我从其他文件句柄读取的数据 我想要类似的东西 n how much can I write w handle n read r handle buf n a
  • 无法连接到 EC2 - ssh:连接到主机端口 22:连接被拒绝

    我目前在海外 尝试通过 ssh 连接到我的 EC2 实例 但收到错误ssh connect to host ec2 34 207 64 42 compute 1 amazonaws com port 22 Connection refuse
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • Linux 上的基准测试程序

    对于一项任务 我们需要使用不同的优化和参数来对我们的实现进行基准测试 有没有一种可行的方法可以在Linux命令行 我知道时间 上使用不同的参数对小程序进行基准测试 从而为我提供CSV或类似内容的时间数据 输出可能类似于 Implementa
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • 如何从 PROC 获取有关子进程的信息

    我正在尝试编写一个以几个进程作为参数的程序 然后父进程执行每个子进程并打印出一些相关的统计信息 示例 generate ls l 将生成一个程序 打印出有关 ls l 的一些统计信息 特别是其系统时间 用户时间和上下文切换次数 我不想使用

随机推荐

  • wedo巡线机器人编程教程_这是一个机器人和编程的时代

    图中在草地上自在奔跑的机器人是波士顿动力公司 BostonDynamics 开发的类人双足机器人Atlas 由麻省理工 MIT 电子工程与计算机科学系的教授马克 雷波特在1992年创立 一直致力于将机器人变成自然界的一个新物种 经过20多年
  • Springboot集成knife4j实现风格化API文档

    Springboot集成knife4j实现风格化API文档 POM引入插件
  • GoLang之使用uber-go/dig进行依赖注入

    文章目录 GoLang之使用uber go dig斤进行依赖注入 1 依赖输注入介绍 2 main函数反面例子 3 下载DI依赖 4 main函数使用DI优化 5 注意点 GoLang之使用uber go dig斤进行依赖注入 注 本文是基
  • AtomicInteger、Unsafe类、ABA问题

    AtomicInteger Java中的AtomicInteger大家应该很熟悉 它是为了解决多线程访问Integer变量导致结果不正确所设计的一个基于多线程并且支持原子操作的Integer类 AtomicInteger内部有一个变量UnS
  • Linux 中的 chroot 命令及示例

    Linux Unix系统中的chroot命令用于更改根目录 Linux Unix 类系统中的每个进程 命令都有一个称为root 目录的当前工作目录 它更改当前正在运行的进程及其子进程的根目录 在此类修改的环境中运行的进程 命令无法访问根目录
  • 巧用redis实现点赞功能,它不比mysql香吗?

    提到点赞 大家一想到的是不是就是朋友圈的点赞呀 其实点赞对我们来说并不陌生 我们经常会在手机软件或者网页中看到它 今天就让我们来了解一下它的实现吧 我们常见的设计思路大概分为两种 一种自然是用MySQL等数据库直接落地存储 另外一种就是将点
  • 常见linux服务器存储空间,怎么在linux上查看服务器的存储空间多大

    1 Linux下可以在 proc cpuinfo中看到每个cpu的详细信息 但是对于双核的cpu 在cpuinfo中会看到两个cpu 常常会让人误以为是两个单核的cpu 其实应该通过Physical Processor ID来区分单核和双核
  • 【linux系统编程】基础开发工具:vi/vim

    Linux文本编辑器 vim 正文开始 Assassin 目录 Linux文本编辑器 vim 1 vim基本介绍 2 vim下各模式的切换 3 vim命令模式 4 vim底行模式 5 vim可视化模式 6 额外补充 6 1 非法退出 6 2
  • 解密SVM系列(二):SVM的理论基础

    上节我们探讨了关于拉格朗日乘子和KKT条件 这为后面SVM求解奠定基础 本节希望通俗的细说一下原理部分 一个简单的二分类问题如下图 我们希望找到一个决策面使得两类分开 这个决策面一般表示就是 WTX b 0 W TX b 0 现在的问题是找
  • 如何进阶TypeScript功底?一文带你理解TS中各种高级语法

    引言 TypeScript 的重要性我不在强调了 我相信仍然会有大多数前端开发者碰到复杂类型一概使用 any 处理 我写这篇文章的目的就是为了让你告别 AnyScript 文章告别晦涩的概念结合实例来为你讲述一系列 TS 高级用法 分发 循
  • ipad横屏怎么设置方法,如何使ipad横屏

    ipad怎么设置横屏竖屏 具体如下 1 首先打开我们的平板 之后在屏幕上由下往上滑 如图 请点击输入图片描述请点击输入图片描述2 之后会出现一个菜单设置界面 点击选项右侧的 圆形 按钮 就可以锁定当前屏幕的方向 我们再点击一下就可以取消锁定
  • Golang协程,通道详解

    进程 线程以及并行 并发 关于进程和线程 进程 Process 就是程序在操作系统中的一次执行过程 是系统进行资源分配和调度的基本单位 进程是一个动态概念 是程序在执行过程中分配和管理资源的基本单位 每一个进程都有一个自己的地址空间 一个进
  • ChatGPT Sorry, you have been blocked(抱歉,您已被屏蔽)的解决方法

    最近在使用 ChatGPT 时大家遇到的最多的问题就是 Sorry you have been blocked 抱歉 您已被屏蔽 了 之前的 Access denied 似乎都不常见了 今天老王就分享下这个问题的原因和解决方法 一 Chat
  • 两年外包生涯做完,感觉自己废了一半....

    先说一下自己的情况 大专生 17年通过校招进入湖南某软件公司 干了接近5年的点点点 今年年上旬 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了五年的功能测试 已经让我变得不思进取 谈了1年的女朋友
  • java 微信提现(复制即用)

    微信的支付是麻烦 但支付很简单 直接上代码 有详细注释 一共四个文件 重点 调用微信提现 import back minsu configure Token import back minsu param TiXianParam impor
  • 局部变量作为返回值

    一般来说 函数是可以返回局部变量的 局部变量的作用域只在函数内部 在函数返回后 局部变量的内存已经释放了 因此 如果函数返回的是局部变量的值 不涉及地址 程序不会出错 但是如果返回的是局部变量的地址 指针 的话 程序运行后会出错 因为函数只
  • NIO 简单封装

    对NIO进行封装 使其方便使用 UML类图 DatagramChannel 打开一个指定端口或随机端口 并可以接收任何发到本端口的数据报 也可以发送数据报到任何一个远程的地址 一个 DatagramChannel 即可以做为Server端
  • Jmeter(三十二) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy5(详解教程)

    1 简介 这一篇文章 主要想讲解一下 录制完脚本不是就完事了 我们有时候还需要断言 看结果是否和我们预期的结果一致 这在测试中都是很重要的 用句老话说 只看结果不看过程 2 录制脚本 想要断言 我们就必须的有脚本 才能断言 没有脚本我们就无
  • 警告 Invalid cookie header: "Set-Cookie:

    1 根据网上的办法设置cookie if httpGet getFirstHeader Set Cookie null String cookie httpGet getFirstHeader Set Cookie getValue htt
  • Linux安全之SSH 密钥创建及密钥登录

    在我们平时使用Linux系统时候 通常使用的Linux SSH登录方式是用户名加密码的登录方式 今天来探讨另外的一种相对安全的登录方式 密钥登录 我们知道SSH登录是用的RSA非对称加密的 所以我们在SSH登录的时候就可以使用RSA密钥登录