ST-LINK转gnuk!年轻人的第一款低成本gunk
前言
Gnuk做出来了,但是,用处呢?
事实是,Gnuk、PKCS#11、FIDO,三家完全不互通
而且opengpg的市面上使用率实在是低。
致谢 - 主要文章:
- https://www.cnblogs.com/tibrella/p/17816505.html#fn2
看到的第一篇文章,也是兴趣的起源,但可惜我没有也不打算为了这个弄一个arch - https://tccmu.com/2024/08/05/gnuk/#Gnuk重新写入
ubuntu上进行的文章,流程非常、非常舒适,每一步我都能看懂,大赞。
(小声:除了./configure --vidpid=234b:0000 以外,但我丢给ai问了一下,似乎不是很重要的部分,跳过。) - https://nx3d.org/gnuk-st-link-v2/
重刷的部分,感谢博主提供的短接方法。
致谢 - 其他文章:
- https://docs.nitrokey.com/zh_CN/nitrokeys/start/setting-kdf-do
我当时kdf出现问题,查阅这篇文章后才知道什么是kdf,然后毫不犹豫的关闭了kdf功能。
成本与需求
- 一台windows电脑
- vmware + 一台debian虚拟机,我这里使用kali(可选,或者可以直接用我编译好的固件,当然,最好还是自己编译,博主不对此负责。)
- 网络环境,windows和kali都要下载东西。
- 耐心
- 6.40 + 9.80 + 7.70 = 23.9元 ( 6.40的电线建议换成别的,用第二篇引用文章上提到的杜邦线最好,这个面包板电线贼软,一掰就弯,但还好不需要太用力)
- 一把螺丝刀,一字的,ST-LINK的外壳贼硬。



【时间:2025-12-17。仅代表这段时间的商品价格】
其实这里9.8的进口芯片完全可以用国产芯片,我目前没发现任何区别,但毕竟是第一次买,也是第一次刷,还是第一次接触这类东西,buff叠满了,所以看到推荐进口芯片想着多几块钱多一份保险吧。
(仅代表我自己的情况,两个都没踩坑)
原理
用9.8的那个ST-LINK把7.7的ST-LINK刷成Gnuk,就是可惜了我刚买的ST-LINK,但是八块钱买不到别的,能买到快乐~折腾的快乐。
步骤 - kali
以下命令最好一条一条执行,慢慢看输出。不然可能报错了都不知道。
# 下载必要依赖,会用大概500+MB
sudo apt-get install gcc-arm-none-eabi picolibc-arm-none-eabi make
git clone git://git.gniibe.org/gnuk/gnuk.git
cd gnuk/
git submodule update --init
cd src/
# ----- 确认按钮部分,详见主要文章2,我不需要,所以注释了 -----
# curl -O https://techie-s.work/shares/gnuk/0001-add-pa5-as-switch-pin-for-st-dongle.patch
# patch ../chopstx/contrib/ackbtn-stm32f103.c < ./0001-add-pa5-as-switch-pin-for-st-dongle.patch
# ----- 确认按钮部分 -----
# 最好设置为optional,我这里windows上的Kleopatra对kdf适配存在问题。
# 因此不能使用kdf,有需要的可以自己注释掉。
export kdf_do=optional # recommended(?) for v1.2.19
# 这里开启了factory reset功能,不需要的可以自己注释掉。
./configure --enable-factory-reset --target=ST_DONGLE --vidpid=234b:0000 --enable-certdo
make build/gnuk-vidpid.bin
完事后用vmtools把 gnuk/src/build/gnuk-vidpid.bin 复制到windows里备用。
不希望编译固件/懒得弄虚拟机的可以使用我编译好的固件,不保证任何可用性,自己斟酌。
因为附上了编译好的固件,因此本教程可以仅通过windows完成。
通过网盘分享的文件:gnuk-vidpid.bin
链接: https://pan.baidu.com/s/1Oe6S1jimOLDd-9hRH8FIIw?pwd=fdxv 提取码: fdxv
步骤 - windows
实际上我看到的某一篇文章是用windows执行后续流程了,但是我现在已经刷好了,重新找这篇文章的时候已经找不到了,不好意思那位博主~~~~
下载
下载软件:(可以直接搜opensc,因为读者看到这篇文章的时候可能已经除了新版本)
https://altushost-swe.dl.sourceforge.net/project/opensc/OpenSC/opensc-0.15.0/opensc-0.15.0-win32.msi?viasf=1
下载软件:nc(那把瑞士军刀)或者任何能够telnet的工具
配置opensc
- openocd
在 gunk\OpenOCD-20251211-0.12.0\bin 下新建openocd.cfg
内容如下:
telnet port 4444
source [find interface/stlink.cfg]
source [find target/stm32f1x.cfg]
set WORKAREASIZE 0x20000
警告:由于opensc更新,我这里的cfg和参考文章中略有不同
因此建议固定版本,或者自己稍微变通一下都行。opensc-0.15.0
- 固件
移动从linux拿到或者从网盘中下载好的gnuk-vidpid.bin到本目录下。
运行前准备
正常安装,然后 cmd 开两个窗口准备,一个准备openocd,一个准备 nc 127.0.0.1 4444

图片中openocd显示的是未找到st-link,这很正常。因为我没插入,但能运行就可以了。
硬件操作
----- (这部分与本教程无关) -----
听说这里需要安装stlink的驱动,但我直接跳过了,我也不知道原因,可能是因为我之前用 STM32CubeIDE 1.19.0 搞了第一个stm32程序的原因吧

就是这么简单的一个小程序(笑)
所以我不用安装驱动了,不知读者需不需要。
----- (上面那部分与本教程无关) -----
掏出螺丝刀,或者任何一个能翘东西的铁片
翘的这个是7.7的,要做成gnuk的这一个st-link。


好了,然后就没有螺丝刀什么事了。

【我的】这个st-link从左到右分别是 GND、CLK、DIO、3.3V
警告:不同st-link可能存在差异,我买的两个一致。如果读者看到的插口顺序和我的不一样,建议自己判断后决定如何行动。
掏出另一个ST-link。


连接远离缺口的部分,黑色、棕色、黄色、红色分别对应: CLK、DIO、GND、3.3V

GND和3.3V可以直接接后面。不记得线序可以临时套上壳子看看位置。
(悄悄说)我在这里接反了,一定要确认缺口的位置是正面。当然,要是你买的st-link和我的不同那就得自己确定了。
此时可以将完整的那个ST-LINK插入电脑。

6.40的电线在本教程中唯一的作用如上图所示,因此如果有什么,回形针之类的,可以代替。
母对母杜邦线是st-link送的,一家送4根,两家一共送了8根。
黑色连CLK,棕色连DIO。完事。
接下来请用手保持这个接触,不要断开。
这期间会非常折磨。但实测没有那么难。
运行openocd,此处我会附上几个错误案例在折叠内,如果你在这一步遇到了错误,可以根据这些来判断一下。
错误示例1
未连接到st-link,检查你的usb连通性。

错误示例2
未连接到【被刷的那个st-link,即gnuk】,检查你的线序是否正确、手指是否按稳

错误示例3
你是不是以前刷过了这个st-link?
我这里是因为已经刷好了gnuk,因此打开会提示这个东西。

如果刷成了gnuk,想重新刷,请参照 主要文章3
我的这个芯片短接的那两引脚分别是这两个,中间塞一铁片就可以了。
找到圆点,逆时针,第七、八。

和文章中不一样的是,文章中表示led会低速闪烁,我这里短接后led直接熄灭了,我一度害怕是不是烧了,但后续可以刷进去。
因为我已经刷过gnuk了,所以这里就不重刷一遍了,“借用”一下文章中的图,感谢原作者!
此时打开nc那边,回车连接openocd。

然后输入这些命令
reset halt
stm32f1x unlock 0
reset halt
flash write_bank 0 ./gnuk-vidpid.bin 0
stm32f1x lock 0
reset halt
重要:如果运行期间突然出现很长一串的东西,那很有可能是接触不良。参照给出的运行截图作为标准。
然后两个窗口ctrl+C断开连接,这个时候就可以松手了。
然后就可以慢悠悠的弹出st-link,拔出来,这下,完成。
恭喜:你已经拥有了第一个gnuk!
配置工作
其他博客基本都是在linux上进行的gpg配置,我这里讲一下windows如何配置吧
大佬轻喷。
插入新做好的gnuk。

等待这个转一万圈,之前试过关闭连接网络,还是转圈,没办法,不管了。

我的建议是先创建key,再将key导入到gnuk中。这样有更完整而且更不容易出错的操作选项。
另外,我额外创建密钥,而非在主密钥下直接创建子密钥,是因为使用kleopatra的时候,似乎会倾向于优先使用我usb里面的密钥,这会导致我在不插入gnuk的时候无法使用我的主密钥。挺麻烦的,所以我倾向于把这个gnuk使用的密钥独立开来。

创建好后,额外添加两种子密钥。

右键,把三个密钥逐个迁移到gnuk中。
如果像这样,没有亮起,说明没插好。我已经迁移过了就不演示了。
输入的Admin Pin在出厂时是12345678,User Pin是123456
注意三次输错会锁卡,要么重刷要么factory reset要么PUK解锁
如果出现card error,检查kdf是否正确设置,我直接关掉了这个功能(前面的optional),所以不担心这个问题。
第一次会提示是否备份一份密钥,避免gnuk丢失导致无法解密,自己斟酌。
第二次会提示是否删除本机上的密钥以确保密钥只存在于gnuk中,自己斟酌。

打开智能卡页面

这里可以修改两个PIN,注意输入原PIN的时候看清楚他要输入哪个PIN。

这里会提示每个PIN的剩余可尝试次数,为0的时候会锁卡。
如果输错了可以通过重新输入正确的PIN恢复到3次
成果与结语

说实话折腾这个对我没啥用,我又不是什么银行行长手握那种机密,然后密钥得放在地下金库层层保护的那种。
但是帅啊,很有科幻片的感觉说是。
(而且便宜)
还有,这个视频我用gif导出了三四次每次都超10MB限制,webp是好东西,感谢webp



浙公网安备 33010602011771号