ST-LINK转gnuk!年轻人的第一款低成本gunk

前言

Gnuk做出来了,但是,用处呢?
事实是,Gnuk、PKCS#11、FIDO,三家完全不互通
而且opengpg的市面上使用率实在是低。

致谢 - 主要文章:

  1. https://www.cnblogs.com/tibrella/p/17816505.html#fn2
    看到的第一篇文章,也是兴趣的起源,但可惜我没有也不打算为了这个弄一个arch
  2. https://tccmu.com/2024/08/05/gnuk/#Gnuk重新写入
    ubuntu上进行的文章,流程非常、非常舒适,每一步我都能看懂,大赞。
    (小声:除了./configure --vidpid=234b:0000 以外,但我丢给ai问了一下,似乎不是很重要的部分,跳过。)
  3. https://nx3d.org/gnuk-st-link-v2/
    重刷的部分,感谢博主提供的短接方法。

致谢 - 其他文章:

  1. https://docs.nitrokey.com/zh_CN/nitrokeys/start/setting-kdf-do
    我当时kdf出现问题,查阅这篇文章后才知道什么是kdf,然后毫不犹豫的关闭了kdf功能。

成本与需求

  1. 一台windows电脑
  2. vmware + 一台debian虚拟机,我这里使用kali(可选,或者可以直接用我编译好的固件,当然,最好还是自己编译,博主不对此负责。)
  3. 网络环境,windows和kali都要下载东西。
  4. 耐心
  5. 6.40 + 9.80 + 7.70 = 23.9元 ( 6.40的电线建议换成别的,用第二篇引用文章上提到的杜邦线最好,这个面包板电线贼软,一掰就弯,但还好不需要太用力)
  6. 一把螺丝刀,一字的,ST-LINK的外壳贼硬。
    PixPin_2025-12-17_14-45-18
    PixPin_2025-12-17_14-45-41
    PixPin_2025-12-17_14-45-51
    【时间: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

  1. 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

  1. 固件

移动从linux拿到或者从网盘中下载好的gnuk-vidpid.bin到本目录下。

运行前准备

正常安装,然后 cmd 开两个窗口准备,一个准备openocd,一个准备 nc 127.0.0.1 4444

PixPin_2025-12-17_15-14-22

图片中openocd显示的是未找到st-link,这很正常。因为我没插入,但能运行就可以了。

硬件操作

----- (这部分与本教程无关) -----
听说这里需要安装stlink的驱动,但我直接跳过了,我也不知道原因,可能是因为我之前用 STM32CubeIDE 1.19.0 搞了第一个stm32程序的原因吧

PixPin_2025-12-17_15-17-22
就是这么简单的一个小程序(笑)
所以我不用安装驱动了,不知读者需不需要。
----- (上面那部分与本教程无关) -----

掏出螺丝刀,或者任何一个能翘东西的铁片
翘的这个是7.7的,要做成gnuk的这一个st-link。
PixPin_2025-12-17_15-21-19
PixPin_2025-12-17_15-21-55
好了,然后就没有螺丝刀什么事了。

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

掏出另一个ST-link。
97920b6006195d297250f2d31ddea957_720
a8ee5090eac0c060e98e56d43c635013
连接远离缺口的部分,黑色、棕色、黄色、红色分别对应: CLK、DIO、GND、3.3V

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

此时可以将完整的那个ST-LINK插入电脑。

3322b40a0bbfeddc0d2a12dd24562cfe_720

6.40的电线在本教程中唯一的作用如上图所示,因此如果有什么,回形针之类的,可以代替。
母对母杜邦线是st-link送的,一家送4根,两家一共送了8根。

黑色连CLK,棕色连DIO。完事。

接下来请用手保持这个接触,不要断开。
这期间会非常折磨。但实测没有那么难。

运行openocd,此处我会附上几个错误案例在折叠内,如果你在这一步遇到了错误,可以根据这些来判断一下。

错误示例1

未连接到st-link,检查你的usb连通性。
PixPin_2025-12-17_15-38-27

错误示例2

未连接到【被刷的那个st-link,即gnuk】,检查你的线序是否正确、手指是否按稳
PixPin_2025-12-17_15-39-57

错误示例3

你是不是以前刷过了这个st-link?
我这里是因为已经刷好了gnuk,因此打开会提示这个东西。
PixPin_2025-12-17_15-45-18
如果刷成了gnuk,想重新刷,请参照 主要文章3

我的这个芯片短接的那两引脚分别是这两个,中间塞一铁片就可以了。
找到圆点,逆时针,第七、八。
PixPin_2025-12-17_15-47-43
和文章中不一样的是,文章中表示led会低速闪烁,我这里短接后led直接熄灭了,我一度害怕是不是烧了,但后续可以刷进去。

因为我已经刷过gnuk了,所以这里就不重刷一遍了,“借用”一下文章中的图,感谢原作者!

此时打开nc那边,回车连接openocd。
PixPin_2025-12-17_15-51-42
然后输入这些命令

reset halt
stm32f1x unlock 0
reset halt
flash write_bank 0 ./gnuk-vidpid.bin 0
stm32f1x lock 0
reset halt

这张运行截图来自 https://tccmu.com/2024/08/05/gnuk/#固件编译
PixPin_2025-12-17_15-50-15

重要:如果运行期间突然出现很长一串的东西,那很有可能是接触不良。参照给出的运行截图作为标准。
然后两个窗口ctrl+C断开连接,这个时候就可以松手了。

然后就可以慢悠悠的弹出st-link,拔出来,这下,完成。
恭喜:你已经拥有了第一个gnuk!

配置工作

其他博客基本都是在linux上进行的gpg配置,我这里讲一下windows如何配置吧
大佬轻喷。

插入新做好的gnuk。
PixPin_2025-12-17_15-56-23
等待这个转一万圈,之前试过关闭连接网络,还是转圈,没办法,不管了。

PixPin_2025-12-17_16-03-36
我的建议是先创建key,再将key导入到gnuk中。这样有更完整而且更不容易出错的操作选项。
另外,我额外创建密钥,而非在主密钥下直接创建子密钥,是因为使用kleopatra的时候,似乎会倾向于优先使用我usb里面的密钥,这会导致我在不插入gnuk的时候无法使用我的主密钥。挺麻烦的,所以我倾向于把这个gnuk使用的密钥独立开来。
PixPin_2025-12-17_16-04-53
创建好后,额外添加两种子密钥。
PixPin_2025-12-17_16-07-05
右键,把三个密钥逐个迁移到gnuk中。
如果像这样,没有亮起,说明没插好。我已经迁移过了就不演示了。

输入的Admin Pin在出厂时是12345678,User Pin是123456
注意三次输错会锁卡,要么重刷要么factory reset要么PUK解锁
如果出现card error,检查kdf是否正确设置,我直接关掉了这个功能(前面的optional),所以不担心这个问题。

第一次会提示是否备份一份密钥,避免gnuk丢失导致无法解密,自己斟酌。
第二次会提示是否删除本机上的密钥以确保密钥只存在于gnuk中,自己斟酌。

PixPin_2025-12-17_16-08-59
打开智能卡页面

PixPin_2025-12-17_16-09-57

这里可以修改两个PIN,注意输入原PIN的时候看清楚他要输入哪个PIN。
PixPin_2025-12-17_16-11-45
这里会提示每个PIN的剩余可尝试次数,为0的时候会锁卡。
如果输错了可以通过重新输入正确的PIN恢复到3次

成果与结语

PixPin_2025-12-17_16-22-46

说实话折腾这个对我没啥用,我又不是什么银行行长手握那种机密,然后密钥得放在地下金库层层保护的那种。
但是帅啊,很有科幻片的感觉说是。
(而且便宜)

还有,这个视频我用gif导出了三四次每次都超10MB限制,webp是好东西,感谢webp
PixPin_2025-12-17_16-25-46

posted @ 2025-12-17 16:26  Timmoc  阅读(51)  评论(0)    收藏  举报