我的博客

Apr 29, 2025

用gnupg创建自己的网络身份

前言

很久没有更新博客了,一是没时间,而是没心情

现在这几天要放五一假(虽然是调出来的,但也比没有好吧)

加之在接受痤疮的治疗

心情很不错

于是我花时间研究了一下gnupg的pgp签名相关内容

可以说这个身份认证是非常重要的

它相当于是分布式的实名认证,每个人都可以建立属于自己的信任网

有人可能奇怪,为什么需要这个呢?我微信聊天对面还能不是本人吗?

这是因为,世界上不是只有微信。

你使用微信的时候,如何确定对面是你要聊的人,本质在于你信任微信会通过实名认证确保你发出的消息会到那个人手机上对不对?

但你不可能跟谁都用微信,而且也不是什么时候聊天的双方都愿意通过微信交流一切

微信就是中心化的实名认证,你基于对它的信任来使用

而pgp(gnupg遵守的身份认证规范)是分布式的,你自己去对别人实名认证,比如约出来对比身份证之类,以及你可以信任你实名认证过的人实名认证的人。

注意,依照设计,这种信任的传递只有一层。

举个例子,你有个好朋友,可以线下见面并确认是本人的,你可以信任他,同时他有一个信任的朋友,但这个人你从未谋面,按照信任网的设计,你可以在与他那个朋友聊天时信任其身份,但他那个朋友信任的其他人在你这里就一点参考价值也没有了。

为什么呢?

原则是你只能信任自己信任的人。

在例子中,你信任好朋友,所以信任好朋友能实名认证他的好朋友,但朋友的朋友可不是朋友了,除非你某一天当面用检查身份证或驾驶证的方法实名认证他的好朋友。

大致理念就是这样。

我知道有人可能奇怪,说好的网上,结果还要当面实名,能当面实名不当面聊,而且也没见有人顶替自己发消息啊

说的很好,因为这不是pgp的全部

你信任一个人的身份,可以使用gnupg对他的凭证签名

相当于做担保

同理别人也可以给你签名

那么你的凭证上就可以附有别人的签名

试想,你现在要和一个素昧平生的人交流,但你没有办法对他实名认证

如何确认你对面那个人就是你想交流的那个人呢?

好,现在他要证明自己身份,拿出了凭证

你接过来检查,发现上面有一百多个签名,其中不乏业内名人

而那些业内名人你虽然也不认识,但你信任他们的影响力之大以至于这些名人身份的签名无法伪造

那么你是不是就比他拿出张空白凭证更加信任其身份了?

这就是信任网的意义,它真正的目的不是让你和本来就能私下见本人看身份证的人增进信任,而是让你能通过不受任何第三方控制的方式去信任你本来无法验证身份的人。

毕竟,网上从没见过的人你没法去要身份证,人家就是拍了你信吗?而且也不可能谁都愿意把微信号给网上陌生的你吧!这时候,信任网就派上了用场。

问题

但是,gnupg的使用很麻烦

不是说他生成凭证之类的麻烦,而是这种电子凭证你自己管理起来很麻烦

更别提电子的可复制性

这种网上的身份证如何防止偷窃?

真出问题了怎么办?

要知道,别人拿到你的凭证,是可以冒充你所有与之相关的网上身份的

总之是非常麻烦

解决方案

接下来呢,我将给出一个指导方案,以及傻瓜式的步骤教学

不过事先声明,我并不是密码学专业人士,也不是IT专业人士,更不是gnupg开发相关人士,只是一个end user终端用户。

我给出的方案,仅作为个人经验分享,如果你不信任我,就不要按我的步骤走。

我大篇幅参考了Alex Cabal关于如何生成完美密钥对的文章,建议对比阅读。

但请注意,由于我没有密码狗啊smartcard之类的设备,本文不会包含使用密码狗和智能卡的教学,但如果你有或者在意,应当按照相关文档去配置!

总原则是,日常只使用子密钥来签名加密,主密钥的公钥当作凭证给大家看,私钥则分开存放。

这样当别人获取你日常设备上的密钥时,你可以用分开的那个主要私钥来吊销这些子密钥并生成新的,避免你凭证上别人的签名丢失。否则,你也可以通知别人你的私钥被偷了那些操作不是你弄得,但你将只能从头开始生成新的空白凭证去见朋友,积攒签名(身份担保)。

公私钥系统简介

什么,你不明白公钥私钥是什么?

简单来说,是差不多的两个东西。

可以这么认为,每次生成一对钥匙,也就是两把电子钥匙

它们通过数学上精妙的构造保证被这把钥匙锁上的东西只有用那把钥匙才能打开,反之亦然

就像“鸳鸯锁”一样,这个你也不知道?好吧,正常,因为是我随口编的。

现在你拿着这两把钥匙能干什么呢?

我教你,你把其中一把钥匙藏起来收好,另一把到锁匠那里复制成无数把随意分发

假设我拿到了你分发的一把钥匙

现在你觉得我们能做什么?

如果我想给你发一个私密信息,就把它写在纸上,放进盒子,用随意分发的那把钥匙锁上

好了,现在全世界只有你藏起来的那把钥匙可以打开它

而我如何认为真的只有你能看信息呢,就是基于对生成这两把钥匙相关算法的信任(比如拿着一把计算出另一把应该长啥样需要的成本时间远大于我信息的价值)和只有你拥有那个藏起来的钥匙的信任!

不止于此,你可以用你藏起来的那把钥匙加密一个信息,然后公布加密后的信息,我们大家只要有你随便分发的钥匙就可以查看

你知道这有什么用吗?

我们再次基于两个信任知道那个信息真的是你发出的,由于别人没有你的私密钥匙,所以他们要么只能口胡,要么伪造一个锁上的盒子,但这没有用!

因为当我们拿着你分发的钥匙无法正确打开盒子的时候,就明白这不是你了!

是不是很奇妙,但这一切,都基于你藏起来的那把钥匙没有别人可以使用以及我们手上拿的钥匙真的是你分发的钥匙。

需要准备的器材

请准备好以下物品

  1. 可以正常使用的私有电脑

    推荐使用GNU/Linux操作系统,但其他操作系统也可以(我只提供Linux操作说明,小白建议用最简单易用且中文支持最舒适的Linux Mint发行版跟进本文操作,Windows用户不需要本文所述内容,MacOS用户请自行解决)

    注意,请确保环境安全私密,不要在后台运行任何闭源且带有“过滤”“杀毒”等功能的专有程序,确保没有键盘记录器、监控录像设备开启

    这里的原则是,除了你自己不要信任任何人。

    因为PGP身份的重要性不是你随手注册的网站申请的邮箱可以比拟的,它就是网上的你。不要用它类比身份证或银行卡,PGP比它们都更需要重视,因为一旦失窃你没有任何警察局或当地银行可以请求帮助,你能依靠的只有自己。

    Hold Your Life, in Your Own Hand.

  2. 一个至少8GB的空U盘

    U盘不是空的也没关系,但所有内容都会在安装tails之后丢失,请自行备份

具体步骤及说明

说明中傻瓜式操作仅涵盖Linux Mint Cinnamon,其余自行调整

  1. 安装gnupg(需要联网)

    你需要在电脑上安装GnuPG

    非Linux系统请到GnuPG官网下载页面自行下载安装并确保可以正常使用。Linux系统请先打开终端(应该是一个成为terminal或者console的软件,找不到就在应用里搜)

    Linux Mint Cinnamon: 按super键(一般是有windows标志的键),输入terminal或者console回车,只有一个是对的,弹出文本框表示成功。

    然后尝试gpg是否已经安装,只要输入gp然后按几次Tab键就可以了,按多也没事,如果输出有gpg或者gpg2表明已经安装,可以跳过此步骤,否则请继续。

    Linux Mint Cinnamon: 在文本框中输入gp,然后按2次Tab键,如果按第一次自动补全成gpg或gpg2,或者第二次结果出现gpg或gpg2,表明已经安装,可以跳过此步骤。

    如果没有安装,我们现在安装。这里没啥好说的,就是从系统包管理器安装,可能GNome Store之类的图形化也有,但我没查过就不演示了。

    Linux Mint Cinnamon: 按退格键直到退无可退,输入sudo apt install gnupg回车就可以,然后等待。如果你很久没有用过电脑了,建议先升级系统,通过命令sudo apt update && sudo apt upgrade。

    一般来说gpg是默认安装在发行版里的,如果你的电脑上没有而且你没有明确删过,可能得联系一下。

  2. 制作tail系统U盘

    这一步需要我们按照tails官网的安装说明制作一个tail os的U盘

    tail作为面向洋葱暗网的临时操作系统加上国内无法直连的官网我就不具体介绍了,不过值得注意的是,本篇解决方案不涉及暗网内容,用tail也建议完全在断网环境下使用。

    有人可能要说,不用暗网你用tail干啥,我只想说,难道你用puppy吗?真的,密钥管理这边还就只有tail有较好支持,如果你有几个tail的U盘的话甚至可以一键备份密钥,方便安全,普通pgp用户的最佳选择(不能因为它支持暗网就避尤不及,这种对技术一知半解成天谈虎色变的人建议退网,99.9999%的互联网内容都不在你可以百度到的范围,谷歌也搜不到。)

    你不用真的把自己家路由器关掉,tail启动时自带断网选项,你到时候点上就可以了。

    准确来说,我们要用tail的gnupg钥匙对管理功能,也只需要用这个功能。

    问题在于,tail官网并没有中文翻译,所以我还是给一下安装步骤吧。

    你到了那个页面后,先点绿色的Download按钮或者下面的BT种子链接

    友情提醒:这两个指向的网站目前都不能稳定直连,实在连不上建议按照Alex Cabal关于如何生成完美密钥对的文章操作,不要跟了,后面把tails当gnupg私钥管理盘用的。

    假设你怎么着就是下好了,哎,假设你也验证过完整性了,哎!虽然不知道过程,但结果是就行。

    那么用dd命令if啊of啊看一看给它烧录到U盘上再sync确认一下就可以,也可以用rufus(限Windows)或Etcher(通用)来烧录。

  3. 启动tail

    现在我们把电脑关机,插入U盘,开机,从U盘启动。

    这里从U盘启动要配置uefi选项,也可能是bios,每个机子不一样。

    如果你的设备默认不能启动U盘,那么可能Esc或者F1到F12中某个键在开机时按可以让你选择从U盘启动,具体我也不清楚,自己按自己电脑型号厂商查查吧。

    经过漫长的等待,你应该看到一个蓝色底的英文界面,在Language那里鼠标点击,选择Simplified Chinese简体中文,additional options附加选项关闭网络进入离线模式(默认是联网的),同时开启管理员账户,这里输入两次一样的密码随便,它重启就忘了。然后Create Persistant Storage创建永久存储并确保点亮了GnuPG那一行。

    具体顺序可能不大对,如果有出入请自行辨别。

    最后启动tails,我们走!

    注意,你不用管自动弹出的tor连接助理窗口,第一我们是离线模式横竖上不了网,第二它也帮不上啥忙,直接点叉关掉。

  4. 生成钥匙对

    下面我们要生成一个钥匙环,再添加一个用于签名的副钥匙,最后导出除了主钥匙对的私钥以外的所有钥匙到电脑硬盘上(也就是我们最终导出的钥匙环缺最核心的私钥)。

    打开一个普通终端,方式是按super键然后输入terminal,应该看到了吧。

    不用开那个红色的,暂时用不到。

    在终端输入gpg2 --expert --full-generate-key回车

    接下来你可以一路回车默认值,也可以输入数字回车选择更新更安全但没有计入PGP标准的ECC椭圆曲线算法

    大概这样

    ```
    Please select what kind of key you want:
    (1) RSA and RSA
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
    (7) DSA (set your own capabilities)
    (8) RSA (set your own capabilities)
    (9) ECC (sign and encrypt)
    (10) ECC (sign only)
    (11) ECC (set your own capabilities)
    (13) Existing key
    (14) Existing key from card
    Your selection? 9
    Please select which elliptic curve you want:
    (1) Curve 25519
    (2) Curve 448
    (3) NIST P-256
    (4) NIST P-384
    (5) NIST P-521
    (6) Brainpool P-256
    (7) Brainpool P-384
    (8) Brainpool P-512
    (9) secp256k1
    Your selection? 1
    Please specify how long the key should be valid.
    0 = key does not expire
    <n>  = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
    Key is valid for? (0) 0
    Key does not expire at all
    Is this correct? (y/N) y
    
    GnuPG needs to construct a user ID to identify your key.
    
    Real name: 小明
    Email address: 1234567@qq.com
    Comment: 王小明
    You are using the 'utf-8' character set.
    You selected this USER-ID:
    "小明 (王小明) <1234567@qq.com>"
    
    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? 
    ```
    

    最后一行的意思是输入N回车重新写Real Name真实姓名,C重新写Comment备注,E重新写Email address邮箱地址,O确认正确生成凭证,Q回车取消操作退出。

    确认无误我们就可以输入O回车,很快命令运行完成。

    中途它会要你设定password密码,请设定一个强密码,我建议使用diceware方法生成一个passphrase口令然后记住它,而不是说“我在生日后随便输了5个字符,没有人可以攻破它”之类的傻话

    由于这个密码是别人拿到你的凭证后能保护你身份的唯一屏障,请把它当作银行卡密码对待,没有二重认证(就是给你发短信问验证码或浏览器人脸识别)的那种!

    现在我们有了钥匙环还要做什么呢?

    输入gpg2 --edit-key 1234567@qq.com回车,我们要给这个主密钥再添加一个签名密钥(默认已经有一个加密密钥了,所以我们只要创建一个用于签名的)

    这里邮箱地址你得写自己的明白不?

    接下来输入addkey回车

    请选择写着“签名”或者sign的行,它会产生一个用于签名的密钥

    中间会弹输密码,你得输入之前设定的password密码

    结束后输入save回车

    好,现在可以关闭终端了。

    下面为了方便起见,我们通过KDE社区出品的Kleopatra继续操作

    打开那个像带红帽子小人头的应用

    在右侧选择my certificates我的证书

    右键单击你刚才创建的凭证并选择details详细内容

    将第2、3个密钥导出,一般第一个的primary主要栏是打勾的

    总之你要把不是主要的钥匙的secret key私钥导出,就导出到默认目录就可以

    要输两遍密码,输吧。

    然后关闭详细内容窗口,点击export key把主公钥导出到刚才那个目录

    接下来关闭Kleopatra,打开蓝色的文件应用

    进入刚才那个目录,右键空白处点击open terminal here在此处打开终端

    输入tar -cf keys.tar <子密钥1的私钥完整文件名> <子密钥2的私钥完整文件名> <主公钥完整文件名>回车

    记得替换,文件名很长,按Tab自动补全就好

    它会产生一个keys.tar文件

    当然你把keys.tar换成其他文件名也行,无所谓的

    接下来我们要加密这个文件

    输入gpg2 --symmetric keys.tar回车

    按照提示设置密码

    这里千万注意,这个密码你能整多复杂就弄多复杂,因为我们只会用一次,但被它加密的内容可能被放在FBI的手里审视无数次!

    开个玩笑,但请按我的步骤继续,原因之后解释

    完成后会生成keys.tar.gpg文件

    现在按super键输disk回车

    在Disk Utility磁盘工具中挂载你的电脑硬盘

    点那个播放键就可以了

    会提示输入管理员密码,就是启动tail时设置的那个

    挂载完成后你应当能在蓝色文件应用的other locations+计算机上其他位置看到你的硬盘

    接下来把keys.tar.gpg复制或移动到你硬盘上自己顺手的位置

    细心的同学可能想到用一个空闲U盘中转也行,那是当然,总之我们目的是电脑正常使用时能拿到这个keys.tar.gpg嘛。

    只复制这个加密后的gpg文件,千万不要把那两个明文私钥文件或者没加密的tar文件弄到硬盘上!

    完成后点击右上角然后shut down关机

    在电脑断电后拔出U盘

    这个U盘现在要保存好,它在你给别人的凭证签名,吊销被盗取的副钥匙,生成新的钥匙甚至改变凭证上的照片时都需要使用

    鉴于U盘读写次数比硬盘少得多,之后可能需要备份,这是很简单的,你只需要再弄一个不少于8G的空U盘

    然后用tail自带的clone复制以及persistant storage backup备份工具完成

    这里我并没有尝试过只是理论表述,所以我们就不深入细节了,如果不是这样的欢迎告知(有一种需要屯U盘的预感呢……)

  5. 导入钥匙对

    现在让我们把U盘收好放在一边,将电脑正常开机。

    下面我们需要开一个ramfs(仅存在于内存的文件系统),把keys.tar.gpg移动到ramfs里并解密,将里面的三个文件导入GnuPG,最后设置对这个钥匙对的信任为ultimate trust始终信任。

    我完全不知道在Linux之外的系统上如何实现这个,而且我完全参照Alex Cabal关于如何生成完美密钥对的文章来开ramfs。

    所以其他系统,你懂的,自己琢磨吧。

    注意我们可能得给这个ramfs开一个稍大一些的空间,按Alex的size=1m目前可能够,但未来不一定,万一你哪天电脑上这个钥匙对坏了要重新导入整个而且你凭证上一堆签名加多个子钥匙是吧?

    打开一个终端运行

    ```bash
    mkdir /tmp/gpg
    sudo mount -t ramfs -o size=1M ramfs /tmp/gpg
    sudo chown $(logname):$(logname) /tmp/gpg
    ```
    

    运行完就可以关闭这个终端,一面后面弄混

    好的,抄完Alex的作业,我们下面步骤会略有不同

    值得注意的是,在后续步骤中,你可能需要用gpg2代替gpg

    只有gpg没有gpg2的朋友可以通过gpg --version查看,如果版本是2.x.y那么就是正确的。

    我们开始

    首先,打开文件应用,找到/tmp/gpg文件夹和keys.tar.gpg

    然后,把keys.tar.gpg移动到/tmp/gpg文件夹里

    现在右键这个文件夹空白处打开打开终端,输入gpg --decrypt keys.tar.gpg | tar -x回车,在对话框输入刚才说好只用一次的密码就可以

    好了,你应该能在/tmp/gpg文件夹下找到刚才那三个钥匙文件

    注意,克制自己再检查一遍的冲动,不要打开它们,不要去点它们,更不要想着把内容抄在纸上!要备份就再买一个8GB的U盘做tail备份!

    接下来我们要导入这三个钥匙文件到电脑的gpg配置中去

    输入gpg --import <子密钥1的私钥完整文件名> <子密钥2的私钥完整文件名> <主公钥完整文件名>回车

    在导入成功后,我们将这个钥匙对设置为无条件信任,因为这是我们自己的钥匙,总没有人连自己都怀疑吧,哈哈。

    输入gpg --edit-key 1234567@qq.com回车,然后输入trust回车,看看哪个数字对应的行有ultimate trust或者中文的类似等价选上回车就可以

    选择后输入y回车表示同意

    示例

    ```
    Please decide how far you trust this user to correctly verify other users' keys
    (by looking at passports, checking fingerprints from different sources, etc.)
    
    1 = I don't know or won't say
    2 = I do NOT trust
    3 = I trust marginally
    4 = I trust fully
    5 = I trust ultimately
    m = back to the main menu
    
    Your decision? 5
    Do you really want to set this key to ultimate trust? (y/N) y
    ```
    

    然后输入save回车完成。

  6. 上传公钥到公开的服务器

    现在我们要把公钥上传到keys.openpgp.org

    在终端输入gpg --export 1234567@qq.com | curl -T - https://keys.openpgp.org回车

    用浏览器打开它返回的验证链接。

    然后在你邮箱里点击它发送的另一个验证链接。

    完成后别人就可以通过邮箱地址搜索或下载你的公钥了。

    你可以把自己公钥的指纹尽可能的告知天下,以免别人下到冒充者的公钥却以为是你。

    这个指纹可以认为对每个凭证而言是独一无二的,你可以理解成身份证号码,不包含个人信息的那种。

    怎么查看指纹呢?

    输入gpg --fingerprint 1234567@qq.com回车

    你可能会看到这样的输出

    ```
    pub   ed25519 2025-04-29 [SC]
          EB85 BB5F A33A 75E1 5E94 4E63 F231 550C 4F47 E38E
    uid           [ultimate] 小明 (王小明) <1234567@qq.com>
    sub   cv25519 2025-04-29 [E]
    sub   ed25519 2025-04-29 [S]
    ```
    

    看见第二行四个四个一组的东西没有

    在这个例子中,小明的指纹就是EB85 BB5F A33A 75E1 5E94 4E63 F231 550C 4F47 E38E

    你不输入空格也行,只是这样方便他人用肉眼或者屏幕阅读器来比对嘛。

    你的指纹肯定不是这个,自己大致类比着去找一下吧。

到这里,六步,我们已经配置好可以日常使用的PGP密钥了。

但有些注意事项还是要提一下。

注意

现在,电脑上的钥匙对是没有最重要的私钥的

所以你想吊销凭证之类的操作只能进tail,改好之后再走一遍导出步骤

但是呢,一般你不用每次都完整导出,你可以只导出修改后的主公钥

gpg在import导入时会自动合并属于同一个钥匙对的内容

签名之类的由于要使用你的主私钥,所以也是需要进tail的

不过这种事很少发生,即便你就是社牛天天给人认证跑各种会议交换凭证

也可以集中找一个时间签名。

鉴于篇幅原因,和我本身没有经历,就不展开说了。

有个bug得小心,虽然没有私钥也可以修改照片,但你不要这么做,会弄坏你的凭证,结果是只能手动重新完整导入。

后记

总体来说,确实不方便

但你懂的,自立根生就是这样。

这篇文章只是帮助你弄一个2025年的gnupg完美配置(这里说的完美,不是最安全,只是你手头只有U盘和电脑的个人认为的最佳实践。目前最安全就是硬件密码,也就是密码狗之类的!)

没有包含如何使用,比如日常的签名,加密,他人公钥的管理等等。

我写这些的目的,就是因为相关资源太少,英文都只有大体相同的寥寥几篇,更别说简中圈了。

希望能帮助到你,陌生人:)

Mar 14, 2025

第一次体验云服务器

体验

很差,真的是吃一堑长一智

我本来想吧,99一年还可以,反正准备做个WP网站面向国内的就买国内的服务器吧

于是我买了阿里云,没想到和以前网友说的不一样

服务器不备案根本没法公网访问,用ip地址是不行的

服务器内也没法访问诸如github之类的网站,底层还有云盾盯着

有人可能会说不能访问就不能访问吧,家里也访问不了,ok。

还有人会说云盾盯着怎么了,身正不怕影子斜。对这种人,我希望你带着常识告诉我,你做作业的时候父母坐边上眼睛不眨的盯着你你舒不舒服?本来阿里云就有内部的防火墙,还需要“云助手”监视服务器内部操作,真是和尚打伞,无法无天。

自己上传ISO也不允许,严格来说允许但要装好监控程序,说的好听,不就是给你后门吗?就好像去直播公司问能不能在自己家直播,人家说可以,但是你家里得装满摄像头,无敌!其实我是不介意按它要求装好,这样或许可以跑guix之类的系统,但是它在这方面的说明又言简意赅,我看半天才发现满纸都是AlibabaOS,离谱。

这质量我捏着鼻子9.9差不多,还99,还原价3000+,真的是山中无老虎,猴子当大王

有人可能奇怪,你备案不就好了?

我是备案啊,域名和阿里云帐号实名两次了我还怕备案吗?结果怎么着,阿里云傻逼服务非说我浏览器不支持,中国银行的人脸识别都没嫌弃我浏览器你阿里云哪里来的底气?

这波肯定不是我浏览器真的不安全,而是阿里云锁浏览器,恐怕只有QQ啊360啊之类的浏览器安全可控,非常自信!

最后我让家里人实名,结果搞了好几天,又是宣言又是视频,又是保证书又是签字,入党啊办签证啊都没这么多步骤,结果还万分挑剔,到现在又是打回来说重新录视频这个字要怎么读的,警察局笔录都没这个挑吧!现在家里人已经放弃,摆明了就是不让个人搞网站嘛。

对策

现在这个服务器只能icmp ping一ping(这是测试到目标机器网络延迟的方式)和ssh连接,其他全部封了。

我就想啊,icmp自然是没用的,光ssh能干啥,我就是开发服务在自己电脑上弄不就好了还需要ssh隧道到你服务器上吗?

理论上应该可以通过精心设计用户权限,甚至定制shell,然后当freeshell分享,但这个用户权限什么的我是一点都不会弄,到现在添加用户和删除用户都需要现搜,暂时放弃。

最后我发现可以当网盘,就是先用sshfs挂载下来,然后套一层cryfs,这样我这里只要消耗算力(用于加密解密),不用花空间存储。

不过呢这里有个雷点,不能在sshfs上弄word之类,会崩,可能和它运行方式有关系。

简单来说呢sshfs+cryfs只能当成冷存储用,频繁写入读取是不行的。再加上阿里云下午晚上网很差(明显,流量存在超额售卖行为,估计n个ECS共享一点流量),真的得悠着点。

感想

目前的感受呢,就是白花了99。

虽然我可以ssh进去跑一些脚本啊什么的,但我的家人或者朋友是完全用不上,因为我不可能让他们在需要访问服务前先开ssh转发(ios上甚至无法实现这个功能,除非用最新的系统和一个专有软件)。

但我本来手边就有电脑,为啥还要ssh到它服务器上跑脚本呢,目前没有这方面需要。

Feb 27, 2025

给Debian电脑配置Howdy人脸识别

起因

人在学校,不方便输入密码,一输入就不是密码了。

于是我就想啊能不能应用其他认证方式。 搜了一下密码狗,非常好,可惜我没有。 指纹登录需要买专门的扫描仪,我也没有。

我这里的选择只剩声纹和人脸识别了吧。 我知道还有其他认证方式,但是你们看我连密码狗都没有怎么可能有那些设备,像弄个谜题代替gdm进门输密码的那种不是我这类连源代码都没编译过几次的人要考虑的问题……

声纹算了,没看到现成的。只有人脸识别的Howdy感觉非常好。

警告

本博客只是个人经历,虽然我的电脑上是配置好了,但不代表你按照我的来也能成。不过本着乐于助人的精神,我将把我电脑相关的配置列一下,如果你恰好全部符合,不妨尝试一下。

  • 电脑系统:Debian 12 Bookworm

    (内核用的是Linux 6.1.0 amd64,由于libre内核我的网卡和蓝牙都不支持,也就是启动了没网,所以我默认还是用普通内核)

  • 电脑上存在如下路径: + /etc/pam.d/ + /usr/share/pam-configs/ + /usr/local/

  • 愿意使用命令行

注意,这次我们几乎全部操作都是命令行操作,没有什么图形界面。不喜欢的现在可以走。

步骤

  1. 将github上的仓库克隆到本地,目前默认是beta分支,别改。

    运行git clone https://github.com/boltgolt/howdy.git得到howdy文件夹。什么?你没有git这个命令?先用sudo apt install git wget curl安装吧,顺便弄上wget和curl两个下载工具,以免等下又缺斤少两的。

  2. 安装需要的依赖。

    运行sudo apt-get update && sudo apt-get install -y python3 python3-pip python3-setuptools python3-wheel cmake make build-essential libpam0g-dev libinih-dev libevdev-dev python3-opencv python3-dev libopencv-dev meson等它下载完,需要root权限。

    这里要注意,目前Debian Bookworm的meson包是以ninja-build为依赖的,所以不用特别安装,你害怕打上ninja-build也行。github主页上的INIReader就是那个libinih-dev,libevdev就是后面那个不用我多说了吧。

    注意,你要是现在尝试就会发现它就是少一个dlib模块没有,当然了要是想用howdy-gtk可能会遇到elevate之类的也缺,哈哈。我已经放弃elevate了,也就是不用howdy-gtk,那个现在bookworm里根本没有可能会弄坏系统吧————反正也不是要紧功能,算了,这种自己重启用sudo的其实可以去掉,记得sudo howdy-gtk之类的就行了嘛(目前已经没有gksudo之类的包了,好像使用一些默认配置让你在sudo图形程序时自动的进入根用户的环境,总之安全),但我懒得碰,主要是不会meson,到时候手动删除肯定很麻烦。

    那么,这个dlib从哪里弄呢,参考这里

    想自己编译的可以试试,我没弄,py2dsc在debian-unstable里,懒得开,像pypi-download嘛我怎么觉得直接pip download就可以?反正我直接从这里下载末尾写着deb12的dlib安装包

    可以运行wget https://github.com/eatyourbaby/howdy/releases/download/3.0.0-git20230625.c17a834/python3-dlib_19.24.2-1_amd64_deb12.deb将安装包下载到本地,然后用sudo apt install python3-dlib_19.24.2-1_amd64_deb12.deb完成安装。我这里没有遇到任何报错,如果你不幸碰上了,噢哄,gameover。

    到这里如果没有问题,我们就可以开始编译安装了。

  3. 按要求编译安装

    首先我们要进入刚才git clone的文件夹,直接cd howdy

    接着,一条条输入github主页指导

    meson setup build
    meson compile -C build
    meson install -C build
    

    用没有报错?没有的话,恭喜你,我们还剩最后几步。

  4. 下载dlib所需额外数据

    通过cd /usr/local/share/dlib-data/进入相关文件夹

    你应该可以看到里面有一个install脚本和一个readme,我们直接运行这个脚本,输入./install.sh

    待三个文件下载好后它会unpack解开压缩包。

    到这里,我们就完成了howdy的安装。

  5. 测试howdy能否正常工作

    sudo howdy add添加你的脸,中间会等你输入这个人脸数据的名称,不重要但你写清楚不是自己看着方便嘛!

    在摄像头旁边小灯亮起后,请直视摄像头,可以稍微动动,熄灭后如果没有报错就说明成功了,可以用sudo howdy list查看。

    如果add的时候直接报错怎么办,这时候很可能是摄像头没有成功自动识别,你得手动配置,先cd /usr/local/etc/howdy/, 然后sudo nano config.ini或者sudo gnome-text-editor config.ini或者你喜欢的方式,总之我们现在要修改这个config.ini配置文件,而且它需要root权限。

    看见device_path那条没有,不用找,直接用查找与替换之类的功能跳转过去。

    这个就自己在/dev/下面找有没有video加数字的就行,具体可以通过ls /dev | grep video来查看,可能会有好几个,一个个尝试吧,我们需要的是add时可以打开摄像头灯光的。

    现在如果你成功add了(可以添加多个,没关系),我们使用sudo howdy test来测试,它会打开一个窗口。

    窗口是黑白的,有你的人头在动,应该会有个圈圈在你的脸上,表示它识别出这是人脸。如果圈圈是红色的表示不成功,绿色表示匹配成功,你可以多试试,用Ctrl+C停止(点击关闭窗口没有用)。这是用来帮助你决定要不要sudo howdy clear或者sudo howdy remove来清空或移除人脸数据并重新sudo howdy add

    确认无误后让我们进入下一步。

  6. 配置pam

    如果不配置pam(Pluggable Authentication Modules),howdy是不会工作的。就好像你购买了一把电子指纹门锁,却不把它装在门上,只是插着电摆在车库的工作台上一样!

    有的人建议直接修改/etc/pam.d/common-auth,或者在/etc/pam.d/sudo里添加规则尝试,都是很好的,只是我最终没有这么做。

    原因是改common-auth会导致每当系统需要问你要密码,你都得先对着镜头等半天,要是光线不好可能几次都卡着,而且在无限循环要求认证的场景下(比如gdm开机后第一次要你输密码登录),你可能就卡死在那里了!而改sudo,你懂的,只有sudo会调用。

    最大的问题在于,即便我们忽略gdm开机吊死在人脸识别的尝试这棵树的情况,无法在gdm原本请求密码时选择桌面环境也是很要命的事情,不是不能选,而是刚出来你就认证成功进桌面了。不像原本问密码,认证模块加载时会等你输入,howdy目前加载并不会让gdm开放选项,等它认证结束选项才出来!来不及!你看,本来挺方便的桌面切换变成只能手动改/var/lib/AccountsService/users/<你的用户名>了。

    不过我也是发现了解决办法,不算解决,算是workaround吧。

    就是我们不要动那个/etc/pam.d/文件夹,我们在/usr/share/pam-configs/文件夹里新建一个howdy文件,纯文本。(这里更好的选择是放在/usr/local/share/pam-configs/下面,但那样还要调pam-auth-update,更麻烦)

    假设你已经在那个/usr/share/pam-configs/文件夹里,不在的话用cd /usr/share/pam-configs进,输入下面的命令来生成文件,这里我写了个简单的, 当然你可以自己改,具体我不大懂,照着旁边unix文件写的。

    cat > howdy << EOF
    Name: Howdy the face recognization for Linux just like Hello in Windows
    Default: yes
    Priority: 128
    Auth-Type: Primary
    Auth:
        sufficient   /usr/local/lib/x86_64-linux-gnu/security/pam_howdy.so
    EOF
    

    这里有一点要注意,这个到pam_howdy.so的路径你那里可能和我不一样,具体看当时meson install -C build的输出把pam_howdy.so下到哪里去了,或者在/usr/local/lib/里找一找有没有类似的,看看。

    生成好后,运行sudo pam-auth-update,应该是个tui界面,你按一下Tab键再回车就可以。

  7. 亲身尝试

    现在可以试试,另开一个终端sudo个什么东西,或者注销重进。

我配置好后的效果是,它先让我输密码,不论输入什么都会开启人脸识别。识别成功直接通过,不成功才会检查密码对不对。不过呢,注销后或者刚开机,gdm会强制要求给它正确密码,否则不允许登录,即使人脸识别通过————这可以开启自动登录来绕开,但是怎么说呢,你终归得输入一次密码,因为howdy只是负责认证,我知道你是谁而已,你的密码不给电脑,密钥串什么的都解不开。虽然密钥串在部分高端配置下并不是好的选择,但首次登录输入密码又不费事,何乐而不为呢?更何况,只是刚开机和注销后不能用,锁定屏幕后的解锁还是可以的。

关键是,由于有了输入密码这一步,我们可以在gdm登录页面选择桌面环境。每次开机不乱注销的话只需要输入一次用户密码,可以说足够方便了!

你也是这样吗?是的话恭喜你,配置成功。目前我们只要在第一次要密码时输入,后续都可以随便回车让它人脸识别啦!

感想

很可惜,目前这个项目有些年久失修的样子,这次是冒着弄坏系统的风险手动装了一堆东西,dlib,说的就是你!不过还好是弄成了,现在用着还可以。至于我比较关心的guix,压根就没有howdy相关的配置。

还是挺开心的,虽然弄了很久。再怎么说,咱也是用过人脸识别的人,走路都硬气许多!哈哈!

Feb 15, 2025

2025新年计划

回首过去

简单来说,真可谓雄心壮志撼天地,其实啥也没干成。

本来想学着用guile scheme写东西,结果haunt还停留在快速开始的水平,chickadee没写出过一个像样的东西。但是也不是全无收获,就是切身体会到部分软件包的缺陷————haunt我没仔细看,不提;chickadee那里我发现最方便的方式还是直接写一个文件而不是用hall开项目或者用模板(可能是我不大会用guix那套工具吧,不过真不好弄,光是需要guile -L <path>才能加载模块就很麻烦),而且所吹嘘的repl热重载并不稳定,一不小心改个变量就卡死……总之除非找到自动重载模块的办法,加上定制的run-game包装函数,体验不大好。

这里碰壁,我就想着学学common-lisp吧。说实话,我本身也是minimalist极简主义者,不喜欢common-lisp这种风格的标准,但其实和scheme语法类似,倒可以接受。于是我配置了slysbcl,甚至把quicklispclml(一个用CL来做机器学习的库)配置好,但是却一直停留在用随机树这步,其他的不懂也不会!比如PCA,啥?降维!所以?不晓得……

大家应该注意到了,我自称喜欢scheme,这个github项目的pages却是完全靠python旗下的优秀库pelican以及配套github action实现的。我为啥不用haunt呢?是的,我幻想过写一个用它生成pages的github action,却没有足够动力啃文档实验。有个小思路,可以用Install GNU Guix的github action配置环境,添加guix install haunt之类的命令,然后对写着配置和内容的文件运行haunt build,最后用能pulish to gh-pages之类的action完成。但还停留在猜想阶段,具体连语法都不清楚。

网页和游戏都搁置之下,基础能力的线性代数之类也是未达预期。究其原因,我发现热情是时有时无的,没有热情的时候是根本无法前进的,更别提预期了。

这有没有办法解决呢?我认为没有,除非有办法人为产生热情————这是不可能的,如果肾上腺素不在待选列表的话。那么既然没有热情,即使一直在“弄”,也只是自我安慰罢了。应对办法倒是有,就是只在有热情的时候着手,其他时间做不得不做的事(譬如说音乐人的主工作day job,学校布置的作业或者一些躲不掉的汇报ppt制作)。总之尽可能保证有热情的时候能安心的全情投入,而不是因为手头有其他事要做耽误。毕竟在无法避免浪费的情况下,完整利用可控时间已经是最好假设啦!

展望未来

在新的时间里,我决定严格贯彻下述信条:

(是否有热情做某事
  (啥也别管去做)
  (别管那些有热情会做的事完成作业之类的琐事))

用伪代码说,大概是

(if (enthusiastic? thing)
    (do thing)
    (do day-job))

希望我能严格遵守这一准则,但愿结果能令人满意吧!不知道scheme,CL,建模,绘画之类能长到几分呢?

赠言

送给每个追逐梦想的人:)

我知道你很急,但你先别急。

你不急,有的是人急。

找到方向,前进就完事了,其他的管一分便是对自己梦想的一分自残。

————Flurando撰于2025年2月16日夜

Feb 13, 2025

exwm如何与gnome和谐共存

事情没有结束

大家还记得上次那篇如何安装exwm的文章吗?

我用着就特别难受。不是不喜欢exwm,而是很多事还是gnome方便————可是之前那样配置导致在gnome下emacs也会运行exwm,虽然可以手动选择不替换,但明显变长的加载时间怎么能忍?

问题根源

当时我的exwm加载放在主配置里,只要开emacs就会运行,严重影响体验。我尝试了手动用独立配置,开机先开守护进程(daemon),但是也非常麻烦。

下定决心

在痛苦的迫使下,我再次打开了system-crafter的网站仔细查看。

解决方案应运而生————抄!

过程

主要办法是,把exwm配置分离出来由.desktop文件单独加载

这样主配置就不会受影响了,非常聪明。

这里难点在于use-package的使用。我鼓起勇气查阅了文档,才发现其实不难。配合quelpa、quelpa-use-package和system-package三个包,可以说非常方便!(也有麻烦的地方,就是每次出现新包use-package都会自动拉取包目录,而Melpa又常常连不上……)

这里给个例子:

;; Magit, the git interface for emacs
(use-package magit
  :ensure t
  :ensure-system-package git)

这个代码片段来自我的emacs配置,可以说,用上use-package确实清晰很多。具体能做什么,可以去看我emacs配置的init.el文件。

值得注意的两个点:

  • 可以:custom的可自定义变量可以通过C-h v来查看。
  • 不清楚就用:config在模块加载后修改,不完美但一般是安全的。

后记

感觉没啥好说的,因为主要就是看看system-crafter和一些文档,抄啊抄。没有什么自己原创的东西。

不过quelpa有一点很不好,"git://"链接是支持的,但是文档里没说————可能写的人觉得显然,但是对大多数人来说链接的scheme只能是http或ftp之类的吧!

Next → Page 1 of 3