这一周好忙
新公司的网络居然可以直连谷歌,香港的出口IP,Zenlayer的线路哈哈,而且还能直接用Gemini神奇。
发现git默认生成的密钥对改成了ed25519,问了下AI如下:
ssh-keygen
是一个非常实用的命令行工具,用于生成 SSH (Secure Shell) 协议使用的密钥对。这个密钥对通常由一个私钥和一个公钥组成。它们是 SSH 安全通信的基石,允许用户在不传输密码的情况下安全地认证到远程服务器。
密钥对的核心概念
- 公钥 (Public Key):
- 这是您可以安全地共享给任何人的部分。
- 您需要将它放在您想要连接的远程服务器上(通常在
~/.ssh/authorized_keys
文件中)。 - 公钥用于加密数据,并且可以验证私钥签名的数据。
- 它不能用来解密数据或进行身份认证,只能用于验证私钥持有者的身份。
- 私钥 (Private Key):
- 这是您需要严格保密的部分。绝不能与任何人共享。
- 它通常存储在您的本地计算机上(例如
~/.ssh/id_rsa
)。 - 私钥用于解密由对应公钥加密的数据,并用于向远程服务器签名认证请求。
- 如果私钥泄露,您的 SSH 连接安全就会受到威胁。
ssh-keygen
的基本用法
最简单的生成命令是:
ssh-keygen
执行这个命令后,ssh-keygen
会引导您完成以下几个步骤:
-
文件保存路径: 它会提示您选择密钥对的保存位置。默认情况下,私钥会保存在
~/.ssh/id_rsa
(对于 RSA 算法)或~/.ssh/id_ed25519
(对于 Ed25519 算法),公钥则会是相同路径加上.pub
后缀(例如~/.ssh/id_rsa.pub
)。Enter file in which to save the key (/home/user/.ssh/id_rsa):
如果您不输入任何内容直接回车,就会使用默认路径。如果您想生成多个密钥对用于不同目的,可以输入不同的文件名。
-
密码短语 (Passphrase):
Enter passphrase (empty for no passphrase): Enter same passphrase again:
这是非常重要的一步。
- 作用: 为您的私钥加密。即使私钥文件被盗,没有密码短语也无法使用。这提供了额外的安全层。
- 建议: 强烈建议设置一个强密码短语。虽然每次使用私钥时都需要输入密码短语会增加一点点不便,但它能极大地提升安全性。您可以使用
ssh-agent
来缓存密码短语,避免每次都输入。 - 留空: 如果您留空(不设置密码短语),私钥将不加密,这意味着任何获得该私钥文件的人都可以直接使用它。在自动化脚本等特定场景下可能会留空,但请务必了解其安全风险。
-
密钥指纹和随机艺术图: 生成完成后,
ssh-keygen
会显示密钥的指纹 (fingerprint) 和一个随机生成的艺术图 (randomart image)。这些信息用于视觉验证密钥的唯一性。Your identification has been saved in /home/user/.ssh/id_rsa Your public key has been saved in /home/user/.ssh/id_rsa.pub The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@hostname The key's randomart image is: +---[RSA 3072]----+ | . . | | . + | | o + | | E o + | | . o + o . | | . + = + o | | . + O . | | . = . | | + | +----[SHA256]-----+
ssh-keygen
的常用选项
ssh-keygen
提供了许多选项来定制密钥生成过程:
-t <type>
:指定密钥类型。rsa
(默认):最常用的类型,通常足够安全。dsa
:较旧,不推荐使用。ecdsa
:椭圆曲线数字签名算法,通常提供与 RSA 相同安全级别但密钥更短。ed25519
:目前推荐的算法,基于 Edwards 曲线,速度快且安全性高,抗量子攻击特性更好。- 示例:
ssh-keygen -t ed25519
-b <bits>
:指定密钥的位数 (bits)。- 适用于 RSA、DSA、ECDSA。对于 Ed25519,位数是固定的,不需要指定。
- RSA 建议至少 2048 位,更安全的选择是 3072 或 4096 位。
- 示例:
ssh-keygen -t rsa -b 4096
-f <filename>
:指定密钥文件保存的路径和名称。- 示例:
ssh-keygen -f ~/.ssh/my_webserver_key
- 示例:
-P <passphrase>
:指定旧的密码短语。 (用于更改密码短语时)-N <new_passphrase>
:指定新的密码短语。 (用于更改密码短语时)-C <comment>
:为公钥添加注释。- 这个注释不会影响密钥的功能,但有助于您识别密钥的用途。
- 默认注释是
user@hostname
。 - 示例:
ssh-keygen -t rsa -b 4096 -C "My key for production server"
-q
:静默模式。 减少输出信息。-p
:改变现有私钥的密码短语。- 示例:
ssh-keygen -p -f ~/.ssh/id_rsa
- 示例:
-y
:从私钥中提取公钥。- 如果您不小心删除了
.pub
文件,可以用这个命令重新生成。 - 示例:
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
- 如果您不小心删除了
生成的密钥文件内容
-
私钥文件 (
id_rsa
或id_ed25519
):-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAAZXNjZHNhLXNoYTItbmlzdHAyNTYAAA... -----END OPENSSH PRIVATE KEY-----
这是一个 PEM 编码的文件,包含您的私钥信息。绝对不能泄露。
-
公钥文件 (
id_rsa.pub
或id_ed25519.pub
):ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFf... user@hostname
或者对于 Ed25519:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICL... user@hostname
公钥文件通常只有一行。它包含三个部分:
- 密钥类型:
ssh-rsa
或ssh-ed25519
。 - 公钥本身: 一长串 Base64 编码的字符串。
- 注释: 默认是
user@hostname
,或您用-C
指定的注释。
- 密钥类型:
密钥对的使用流程
- 生成密钥对: 在您的本地计算机上使用
ssh-keygen
生成私钥和公钥。 - 上传公钥: 将生成的公钥 (
.pub
文件) 的内容复制到您想要连接的远程服务器的~/.ssh/authorized_keys
文件中。如果~/.ssh
目录或authorized_keys
文件不存在,您需要手动创建它们,并确保它们有正确的权限(chmod 700 ~/.ssh
和chmod 600 ~/.ssh/authorized_keys
)。 - 安全连接: 从本地计算机使用
ssh user@remote_host
命令连接。SSH 客户端会自动查找并使用您的私钥进行身份认证。如果私钥有密码短语,SSH 客户端会提示您输入。
通过理解 ssh-keygen
及其生成的密钥对,您可以更安全、高效地管理您的 SSH 连接。
排查了一天的网络不通的问题,最后重启一下好了,额有些东西搞不出来就先睡一觉吧。
试了下 k3s 还是有点意思的,我以前以为只嵌入了控制面,才发现是全部都嵌入了,一个可执行文件就搞定了。
试用了一下WSL2,最大的败笔就是不能同时启动多个发行版,多个发行版默认还是共享网络的,对于分布式开发就很不舒服。
从 XML 到 JSON 再到 CBOR 尽管 Kubernetes API Server 使用 HTTPS 协议提供 RESTful API,但它确实使用了 Protocol Buffers (Protobuf) 来进行数据序列化。 同时 gRPC-Web 这可以说是将 Protobuf over HTTP 概念推广得最成功的项目之一。
排查一个服务连不上etcd的问题,最后发现是没有配置证书,首先要自己用证书去尝试,如果etcdctl没问题的话,就是应用的问题,最后还是靠chatgpt结局了:
2025-07-30 01:47:11.007657 I | embed: rejected connection from "10.40.242.88:47286" (error "tls: failed to verify client's certificate: x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"demo\")", ServerName "default-etcd-client.demo.svc")
helm 居然还会去检查资源有没有冲突:
Error: INSTALLATION FAILED: Unable to continue with install: StorageClass "local-path" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "default"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "demo"
使用wsl安装的ubuntu 24 在pod挂载hostpath的遇到了一个问题:
inux mounts: Path /opt/kubelet/dev is mounted on / but it is not a shared or slave mount. 执行此命令
mount --make-rshared /
即可,解决方法见。