Nitrokey Start上的OpenPGP主密钥

自2006年以来,我一直使用硬件支持的OpenPGP密钥,当时我将新生成的rsa1024子密钥导入到FSFE公司联谊卡。这几年来效果很好,我记得我买了更多的ZeitControl卡用于多机使用和备份。作为附带说明,我记得当时我对弱1024位RSA子密钥不满意——我的主键是2002年创建的一个略强一些的1280位RSA密钥,但当时OpenPGP卡不支持超过1024位的RSA,而且(现在仍然是)还限于我不喜欢的两种RSA密钥大小的幂

我在磁盘上有一段时间的主密钥和一个强密码,主要是为了刷新子密钥的到期时间和签署其他人的OpenPGP密钥。在某个时候,我不再随身携带主密钥的加密副本。这是我迁移到新的早在2014年,YubiKey近地天体上的RSA 3744位密钥更强大,带有rsa2048子密钥当时,签署他人的OpenPGP密钥是一件非常罕见的事情,我决定让我的脱机机器执行此操作,将公钥传输到USB记忆棒上进行签名。2019年I重新评估了我的OpenPGP设置最终创建了一个运行Gnuk的FST-01G上带子键的脱机Ed25519密钥。我签署他人OpenPGP密钥的方法仍然是拿出我的脱机机器,使用USB记忆棒存储和传输主密钥签署东西。这意味着我几乎从未这样做过,因为这需要太多的努力。因此,我2019年的Ed25519密钥上仍然只有少数签名,因为我基本上已经停止了签名他人的密钥,这是获得签名的传统方式。

所有这些都没有给我带来任何严重问题,因为我继续使用旧的2014-era RSA3744密钥,同时使用新的2019-era Ed25519密钥,因为太多的系统无法处理Ed25519。然而,在2022年,情况发生了变化,我仍然使用我的RSA3744密钥的唯一剩余环境是Debian公司-和它们需要OpenPGP签名以允许它替换旧密钥。2022年,我否认了这种次优解决方案,并忍受了它的实际后果,只得将YubiKey NEO(我在某些时候用永久插入的YubiKey Nano取代了它)用于Debian相关目的。

2022年12月我买了一台新笔记本电脑用我的Ed25519设置FST-01SZ虽然我已经从Debian休假了,但我继续延长旧的RSA3744密钥的有效期,以防再次使用,因此OpenPGP的总体设置仍然是次优的。同时拥有两个有效的OpenPGP密钥会导致人们使用这两个密钥进行电子邮件加密(导致我必须同时使用这两种设备)WKD密钥发现协议也不喜欢两个有效的密钥。FOSDEM’23年我遇到了GnuPG的Andre Heinecke我忍不住抱怨所有与OpenPGP相关的事情是多么复杂和令人不满意,他温和地忽视了我的咆哮,问我为什么不把主钥匙放在另一张智能卡上。当我回到家时,评论开始流行起来,最近我把所有的点都连接起来了,这篇文章是我将离线OpenPGP主密钥移动到Nitrokey Start的总结。

首先,关于设备选择,我仍然倾向于使用尽可能与自由软件兼容的硬件设备,但FST-01G或FST-01SZ不再容易购买。我收到了关于Nitrokey在我上一篇文章中开始,并有两个可以进行实验。与YubiKey相比,Nitrokey Start有一些不喜欢的地方(例如,相对不安全的芯片架构、更笨重的外形以及缺乏FIDO/U2F/OATH支持),但据我所知,没有更广泛的可用性所有者控制为实现OpenPGP卡的预期目的而制造的设备。因此,它击中了我的最佳位置。

Nitrokey启动

第一步是在Nitrokey Start上运行最新固件,用于错误文件和重要的OpenSSH 9.0兼容性–有可复制的固件发布了您可以安装使用pynitrokey。我跑了Trisquel 11 aramo公司在我的笔记本电脑上,它不包括Python Pip包(可能是因为它促进了非自由软件的安装),所以这有点复杂。在本地构建固件可能奏效了,我希望最终能够确认发布的固件,但为了节省时间,我决定在我的机器上安装Ubuntu 22.04包:

$sha256sum python三端口*ded6b3867a4a4cbaff0940cab366975d6aeecc76b9f2d2efa3deceb062668b1c python3-pip_22.0.2+dfsg-1ubuntu0.2_all.debe1561575130c41dc3309023a345de337e84b4b04c21c74db57f599e267114325 python3-pip-whl_22.0.2+dfsg-1ubuntu0.2_all.deb$doas dpkg-i python三端口*...$doas apt安装-f...$

安装pynitrokey下载了一系列依赖项,最好能审核每个依赖项的许可证和安全漏洞。(下面的详细输出略有删减。)

贾斯@kaka:~$pip3安装--用户pynitrokey收集pynitrokey下载pynitrokey-0.4.34-py3-none-any.whl(572 kB)收集冻结数据~=2.3.4下载frozendict-2.3.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(113 kB)已满足要求:在/usr/lib/python3/dist-packages(来自pynitrokey)(8.0.3)中单击<9,>=8.0.0收集ecdsa下载ecdsa-0.18.0-py2.py3-none-any.whl(142 kB)收集python-ateutil~=2.7.0下载python_dateutil-2.7.5-py2.py3-none-any.whl(225 kB)收集fido2<2,>=1.1.0下载fido2-1.1.0-py3-none-any.whl(201 kB)收集tlv8下载tlv8-0.10.0.tar.gz(16 kB)正在准备元数据(setup.py)。。。完成已满足要求:/usr/lib/python3/dist-packages中的certificat>=14.5.14(来自pynitrokey)(2020.6.20)已经满足的要求:/usr/lib/python3/dist-packages中的pyusb(来自pynitrokey)(1.2.1.post1)正在收集urllib3~=1.26.7下载urllib3-1.26.15-py2.py3-none-any.whl(140 kB)收集spsdk<1.8.0,>=1.7.0下载spsdk-1.7-py3-none-any.whl(684 kB)收集typeing_extensions ~=4.3.0下载typeing_extensions-4.3.0-py3-none-any.whl(25 kB)已满足要求:/usr/lib/python3/dist-packages中的加密<37,>=3.4.4(来自pynitrokey)(3.4.8)收集intelhex下载intelhex-2.3.0-py2.py3-none-any.whl(50 kB)收集nkdfu下载nkdfu-0.2-py3-none-any.whl(16 kB)已经满足的需求:/usr/lib/python3/dist-packages中的请求(来自pynitrokey)(2.25.1)收集tqdm下载tqdm-4.65.0-py3-none-any.whl(77 kB)收集nrutil<7,>=6.1.4下载nrfutil-6.1.7.tar.gz(845 kB)正在准备元数据(setup.py)。。。完成已经满足的要求:/usr/lib/python3/dist-packages中的cffi(来自pynitrokey)(1.15.0)收集crcmod下载crcmod-1.7.tar.gz(89 kB)正在准备元数据(setup.py)。。。完成正在收集libusb1==1.9.3下载libusb1-1.9.3-py3-none-any.whl(60 kB)收集pc_ble_driver_py>=0.16.4下载pc_ble_driver_py-0.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl(2.9 MB)收集piccata下载piccata-2.0.3-py3-none-any.whl(21 kB)收集协议<4.0.0,>=3.17.3下载protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl(1.1 MB)正在收集pyserial下载pyserial-3.5-py2.py3-none-any.whl(90 kB)收集尖晶石>=1.0.0a3下载pyspinel-1.0.3.tar.gz(58 kB)正在准备元数据(setup.py)。。。完成已经满足的要求:/usr/lib/python3/dist-packages中的pyyaml(来自nrfutil<7,>=6.1.4->pynitrokey)(5.4.1)已满足要求:六个>=1.5 in/usr/lib/python3/dist-packages(来自python-ateutil~=2.70->pynitrokey)(1.16.0)收集pylink-平方<0.11.9,>=0.8.2下载pylink_square-0.11.1-py2.py3-none-any.whl(78 kB)采集jinja2<3.1,>=2.11下载Jinja2-3.0.3-py3-none-any.whl(133 kB)收集bincopy<17.11,>=17.10.2下载bincopy-17.10.3-py3-none-any.whl(17 kB)收集fastjsonschema>=2.15.1下载fastjsonschema-2.16.3-py3-none-any.whl(23 kB)收集astunparse<2,>=1.6下载astunparse-1.6.3-py2.py3-none-any.whl(12 kB)收集oscrypto~=1.2下载oscrypto-1.3.0-py2.py3-none-any.whl(194 kB)收集deepmerge==0.3.0下载deepmerge-0.3.0-py2.py3-none-any.whl(7.6 kB)收集pyocd<=0.31.0,>=0.28.3下载pyocd-0.31.0-py3-none-any.whl(12.5 MB)收集点击选项组<0.6,>=0.3.0下载click_option_group-0.5.5-py3-none-any.whl(12 kB)收集pycryptodome<4,>=3.9.3下载pycryptodome-3.17-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86~64.whl(2.1 MB)收集pyocd-pemicro<1.2.0,>=1.1.1下载pyocd_pemicro-1.1.5-py3-none-any.whl(9.0 kB)已满足要求:colorama<1,>=0.4.4 in/usr/lib/python3/dist-packages(来自spsdk<1.8.0,>=1.7.0->pynitrokey)(0.4.4)收集评论<1,>=0.9下载commentjson-0.9.0.tar.gz(8.7 kB)正在准备元数据(setup.py)。。。完成已满足要求:/usr/lib/python3/dist-packages中的asn1crypto<2,>=1.2(来自spsdk<1.8.0,>=1.7.0->pynitrokey)(1.4.0)收集pypemicro<0.2.0,>=0.1.9下载pypemicro-0.1.11-py3-none-any.whl(5.7 MB)收集libusbsio>=2.1.11下载libusbsio-2.1.11-py3-none-any.whl(247 kB)收集sly==0.4下载sly-0.4.tar.gz(60 kB)正在准备元数据(setup.py)。。。完成收集ruamel.yaml<0.18.0,>=0.17下载ruamel.yaml-0.17.21-py3-none-any.whl(109 kB)收集cmsis-pack-manager<0.3.0下载cmsis_pack_manager-0.2.10-py2.py3-none-manylinux1_x86_64.whl(25.1 MB)收集点击命令树==1.1.0下载click_command_tree-1.1.0-py3-none-any.whl(3.6 kB)已满足要求:/usr/lib/python3/dist-packages中的位字符串<3.2,>=3.1(来自spsdk<1.8.0,>=1.7.0->pynitrokey)(3.1.7)收集十六进制数据~=3.3下载hexdump-3.3.zip(12 kB)正在准备元数据(setup.py)。。。完成正在收集火灾下载fire 0.5.0.tar.gz(88 kB)正在准备元数据(setup.py)。。。完成已满足要求:/usr/lib/python3/dist包中的wheel<1.0,>=0.23.0(来自astunparse<2,>=1.6->spsdk<1.8.0,>=1.7.0->pynitrokey)(0.37.1)收集人性化下载humanfriendly-10.0-py2.py3-none-any.whl(86 kB)正在收集argparse插件>=0.4.0下载argparse_addons-0.12.0-py3-none-any.whl(3.3 kB)收集肾盂工具下载pyelftools-0.29-py2.py3-none-any.whl(174 kB)采集奶蛇>=0.1.2下载milksnake-0.1.5-py2.py3-none-any.whl(9.6 kB)已满足要求:/usr/lib/python3/dist-packages中的appdirs>=1.4(来自cmsis-pack-manager<0.3.0->spsdk<1.8.0,>=1.7.0->pynitrokey)(1.4.4)收集百灵鸟解析器<0.8.0,>=0.7.1下载lark-parser-0.7.8.tar.gz(276 kB)正在准备元数据(setup.py)。。。完成已满足要求:/usr/lib/python3/dist-packages中的MarkupSafe>=2.0(来自jinja2<3.1,>=2.11->spsdk<1.8.0,>=1.7.0->pynitrokey)(2.0.1)收集为加密<2,>=1.2下载asn1crypto-1.5.1-py2.py3-none-any.whl(105 kB)收集包装下载wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86=64.manillinux_2_17_x86-64.manylinux2014_x86_64.whl(78 kB)收集未来下载future-0.18.3.tar.gz(840 kB)正在准备元数据(setup.py)。。。完成收集psutil>=5.2.2下载psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64收集顶石<5.0,>=4.0下载capstone-4.0.2-py2.py3-none-manylinux1_x86_64.whl(2.1 MB)收集自然排序<2.0,>=1.5下载naturalsort-1.5.1.tar.gz(7.4 kB)正在准备元数据(setup.py)。。。完成收集prettytable<3.0,>=2.0下载prettytable-2.5.0-py3-none-any.whl(24 kB)采集间隔树<4.0,>=3.0.2下载intervaltree-3.1.0.tar.gz(32 kB)正在准备元数据(setup.py)。。。完成收集ruamel.yaml.clib>=0.2.6下载ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_ 64.manillinux_2_24_x86 _64.whl(485 kB)收集术语颜色下载termcolor-2.2.0-py3-none-any.whl(6.6 kB)收集分拣容器<3.0,>=2.0下载分拣容器-2.4.0-py2.py3-none-any.whl(29 kB)已经满足的要求:/usr/lib/python3/dist-packages中的wcwidth(来自prettytable<3.0,>=2.0->pyocd<=0.31.0,>=0.28.3->spsdk<1.8.0,>=1.7.0->pinitrokey)(0.2.5)为收集的包构建轮子:nrfutil、crcmod、sly、tlv8、commentjson、hexdump、pyspinel、fire、intervaltree、lark-parser、naturalsort、future正在为nrutil构建轮子(setup.py)。。。完成已为nrfutil创建轮子:filename=nrfutil-6.1.7-py3-none-any.whl size=889520 sha256=de6f8803f51d6c26d24dc7df6292064a468ff3f389d73370433fde582b84a10存储在目录:/home/jas/.cache/pip/wheels/39/2b/9b/98ab2dd716da746290e6728bdb557b14c1c9a54cb9ed86e13b正在为crcmod构建轮子(setup.py)。。。完成已为crcmod创建轮子:filename=crcmod-1.7-cp310-cp310-linux_x86_64.whl size=31422 sha256=5149ac56fcbfa0606760eef5220cedc66be60adf68cf38c604af3a14a8b0存储在目录:/home/jas/.cache/pip/wheels/85/4c/07/72215c529bd59d67e3dac29711d7aba1b692f543c808ba9e86正在为sly(setup.py)构建轮子。。。完成为sly创建轮子:filename=sly-0.4-py3-none-any.whl size=27352 sha256=f614e413918de45c73d1e9a8dca61ca07dc760d9740553400efc234c891f7fde存储在目录:/home/jas/.cache/pip/wheels/a2/23/4a/6a84282a0d2c29f003012dc565b3126e427972e8b8157ea51f正在构建tlv8的轮子(setup.py)。。。完成为tlv8创建了轮子:filename=tlv8-0.10.0-py3-none-any.whl size=11266 sha256=3ec8b3c45977a3addbc66b7b99e1d81b146607c3a269502b9b5651900a0e2d08存储在目录:/home/jas/.cache/pip/wheels/e9/35/86/66a473cc2abb0c7f21ed39c30a3b2219bd2cdb4b33cfc2c正在构建评论轮(setup.py)。。。完成创建评论轮:filename=commentjson-0.9.0-py3-none-any.whl size=12092 sha256=28b6413132d6d7798a18cf8c76885dc69f676ea763ffcb08775a3c2c43444f4a存储在目录:/home/jas/.cache/pip/wheels/7d/90/23/6358a234ca5b4ec0866d447079b97fedf9883387d1d7d074e5正在为hexdump构建轮子(setup.py)。。。完成为hexdump创建轮子:filename=hexdump-3.3-py3-none-any.whl size=8913 sha256=79dfadd42edbc9aceac1987464f2df4053784fff18b96408c1309b74fd09f50存储在目录:/home/jas/.cache/pip/wheels/26/28/f7/f47d7ecd9ae44c4457e72c8bb617ef18ab332ee2b2a1047e87正在为pyspinel构建轮子(setup.py)。。。完成为pyspinel创建了轮子:filename=pyspinel-1.0.3-py3-none-any.whl size=65033 sha256=01dc27f81f28b4830a0cf2336dc737ef309a1287fcf33f57a8a4c5bed3b5f0a6存储在目录:/home/jas/.cache/pip/wheels/95/ec/4b/6e3e2ee18e7292d26a65659f75d07411a6e69158bb05507590构建火轮(setup.py)。。。完成创建消防轮子:filename=fire 0.5.0-py2.py3-none-any.whl size=116951 sha256=3d2885478c91a6914629eb739ea789828eb2d0267febc7c5390cb24ba153e8存储在目录:/home/jas/.cache/pip/wheels/90/d4/f7/9404e5db0116bd4d43e5666eaa3e70ab53723e1e3ea40c9a95正在为intervaltree构建轮子(setup.py)。。。完成为intervaltree创建轮子:filename=intervaltree-3.1.0-py2.py3-none-any.whl size=26119 sha256=5ff1def22ba883af25c90d90ef7c6518496fcd47dd2cbc53a57ec04cd60dc21d存储在目录:/home/jas/.cache/pip/wheels/fa/80/8c/43488a924a046b733b64de3fac99252674c892a4c3801c0a61正在为lark-parser构建轮子(setup.py)。。。完成为lark-parser创建了轮子:filename=lark_parser-0.7.8-py2.py3-none-any.whl size=62527 sha256=3d2ec1d0f926fc2688d40777f7ef93c9986f874169132b1af590b6afc038f4be存储在目录:/home/jas/.cache/pip/wheels/29/30/94/33e8b58318aa05cb1842b365843036e0280af5983abb966b83正在为自然排序构建轮子(setup.py)。。。完成为naturalsort创建轮子:filename=naturalsort-1.5.1-py3-none-any.whl size=7526 sha256=bdecac4a49f241692454848cae6c124c85d5333e9e61c563232678ed182969d453存储在目录:/home/jas/.cache/pip/wheels/a6/8e/c9/98cfa614fff2979b457fa2d9ad45ec85fa417e7e3e2e43be51为未来构建轮子(setup.py)。。。完成为未来创建轮子:filename=future-0.18.3-py3-none-any.whl size=492037 sha256=57a01e68feca2b5563f5f62411267f399082d2f05f55886f71b5d6e6cf2b02c存储在目录:/home/jas/.cache/pip/wheels/5e/a9/47/f118e66afd12240e4662752cc22cefae5d97275623aa8ef57d成功构建nrfutil crcmod sly tlv8 commentjson hexdump pyspinel fire intervaltree lark-parser naturalsort future安装收集的包:tlv8、sortedcontainers、sly、pyserial、pyelftools、piccata、naturalsort、libusb1、lark-parser、intelhex、hexdump、fastjsonschema、crcmod、asn1crypto、wrapt、urllib3、typeing_extensions、tqdm、termcolor、ruamel.yaml.clib、python-ateutil、pyspinel、pypemicro、pycryptodome、psutil、protobuf、prettytytytable、oscrypto,milksnake、libusbsio、jinja2、intervaltree、human-friendly、future、frozendict、fido2、ecdsa、deepmerge、commentjson、click-option group、click-command-tree、capstone、astunparse、argparse-addons、ruamel.yaml、pyocd-pemicro、pylink-square、pc_ble_driver_py、fire、cmsis-pack-manager、bincopy、pyocd、nrfutil、nkdfu、spsdk、pynitrokey警告:脚本nitpy安装在“/home/jas/.local/bin”中,该文件不在PATH上。考虑将此目录添加到PATH,或者,如果您希望取消显示此警告,请使用--no-warn-script-location。成功安装argparse-addons-0.12.0 asn1crypto-1.5.1 astunparse-1.6.3 bincopy-17.10.3 capstone-4.0.2 click-command-tree-1.1.0 click-option group-0.5.5 cmsis-pack-manager-0.2.10注释-0.9.0 crcmod-1.7 deepmerge-0.3.0 ecdsa-0.18.0 fastjsonschema-2.16.3 fido2-1.1.0 fire 0.5.0 frozendict-2.3.5 future-0.18.3 hexdump-3.3人性化-10.0 intelhex-2.3.0 intervaltree-3.1.0 jinja2-3.0.3 lark-parser-0.7.8 libusb1-1.9.3 libusbsio-2.1.11 milksnake-0.1.5自然排序-1.5.1 nkdfu-0.2 nrfutil-6.1.7 oscrypto-1.3.0 pc_ble_driver_py-0.17.0 piccata-2.0.3 prettytable-2.5.0 protobuf-3.20.3 psutil-5.9.4 pycryptoome-3.17 pyelftools-0.29 pylink-square-0.11.1 pynitrokey-0.4.34脓毒症-0.31.0脓毒症-化学品-1.1.5 pypemicro-0.1.11 pyserial-3.5 pyspinel-1.0.3 python-dateutil-2..7.5 ruamel.yaml-0.17.21 ruamel.yaml.clib-0.2.7 sly-0.4分类容器-2.4.0 spsdk--1.7.1术语颜色-2.2.0 tlv8-.10.0 tqdm-4.6.50类型扩展-4.3.0 urlib3-1.26.15包装-1.1.50贾斯@kaka:~$

然后升级设备工作得很好,尽管我希望该工具能够打印固件文件的URL和校验和,以便轻松确认。

贾斯@kaka:~$PATH=$PATH:/home/jas/.local/bin贾斯@kaka:~$硝化氢起始清单与Nitrokey设备交互的命令行工具0.4.34::“Nitrokey开始”键:FSIJ-1.2.15-5D271572:硝基启动(RTM.12.1-RC2-修改)贾斯@kaka:~$nitropy开始更新与Nitrokey设备交互的命令行工具0.4.34Nitrokey Start固件更新工具平台:Linux-5.15.0-67-generic-x86_64-with-glibc2.35系统:Linux,is_Linux:True蟒蛇:3.10.6将运行日志保存到:/tmp/ntropy.log.gc5753a8管理员PIN码:要使用的固件数据:-固件类型。REGNUAL:4408,散列:。。。b“72a30389”有效(来自…build/RTM.13/regnual.bin)-固件类型。GNUK:129024,散列:。。。b“25a4289b”有效(来自…prebuild/RTM.13/gnuk.bin)当前连接的设备字符串:设备:供应商:Nitrokey产品:Nitrokey Start序列号:FSIJ-1.2.15-5D271572版本:RTM.12.1-RC2-修改配置:*:*:8e82系统:3.0董事会:NITROKEY-START-G初始设备字符串:[{“name”:“”,“Vendor”:“Nitrokey”,“Product”:“Nitrokey Start”,“Serial”:“FSIJ-1.2.15-5D271572”,“Revision”:“RTM.12.1-RC2-modified”,“Config”:'*:*:8e82',“Sys”:“3.0”,“Board”:“Nitrokey-Start-G”}]请注意:-可用的最新固件为:RTM.13(发布日期:2022-12-08T10:59:11Z)-提供的固件:无-所有数据将从设备中删除!-不要中断更新过程-设备可能无法正常运行!-该过程不应超过1分钟你想继续吗?[是/否]:是...启动引导加载程序上载过程设备:Nitrokey启动FSIJ-1.2.15-5D271572已连接到设备正在运行更新!请勿从USB插槽中取出设备,除非另行通知正在下载闪存升级程序。。。正在执行闪存升级。。。等待设备出现:等待20秒。。。。。下载程序保护装置完成防水板正在重置设备更新过程已完成。可以从USB插槽中删除设备。当前连接的设备字符串(升级后):设备:供应商:Nitrokey产品:Nitrokey Start序列号:FSIJ-1.2.19-5D271572版本:RTM.13配置:*:*:8e82系统:3.0董事会:NITROKEY-START-G设备现在可以从USB插槽中安全移除最终设备字符串:[{“name”:“”,“Vendor”:“Nitrokey”,“Product”:“Nitrokey Start”,“Serial”:“FSIJ-1.2.19-5D271572”,“Revision”:“RTM.13”,“Config”:'*:*:8e82',“Sys”:“3.0”,“Board”:“Nitrokey-Start-G”}]结束会议2023-03-16 21:49:07.371291日志保存到:/tmp/ntropy.Log.gc5753a8贾斯@kaka:~$ 贾斯@kaka:~$硝化氢起始清单与Nitrokey设备交互的命令行工具0.4.34::“Nitrokey开始”键:FSIJ-1.2.19-5D271572:硝基启动(RTM.13)贾斯@kaka:~$

将主密钥导入此设备之前,应进行配置。请注意开头的命令,以确保scdaemon/pcscd没有运行,因为它们可能具有来自早期卡的缓存状态。在此之后,根据您的喜好更改PIN码,我使用Gnuk的经验是,必须先更改管理员PIN,然后导入密钥,然后更改PIN。

贾斯@kaka:~$gpg-connect-agent“SCD KILLSCD”“SCD BYE”/再见好 啊ERR 67125247 Slut påfil<GPG代理>贾斯@kaka:~$ps auxww | grep-e pcsc-e scdjas 11651 0.0 3468 1672分/0 R+21-54 0:00 grep--color=自动-e pcsc-e scd贾斯@kaka:~$gpg—卡片编辑读卡器………..:20A0:4211:FSIJ-1.2.19-5D271572:0应用程序ID…:D2760001240102000FFFE5D2715720000应用程序类型:开放式PGP版本………:2制造商…..:非托管序列号范围序列号。。。。:5D271572型持卡人姓名:[未设置]语言首选项…:[未设置]称呼…….:公钥的URL:[未设置]登录数据…….:[未设置]签名PIN….:强迫的关键属性…:rsa2048最大PIN长度:127 127 127PIN重试计数器:3 3 3签名计数器:0KDF设置……:远离的签名密钥……:[无]加密密钥….:[无]身份验证密钥:[无]常规密钥信息..:[无]gpg/卡>管理员允许使用管理命令gpg/卡>kdf设置gpg/卡>密码gpg:检测到OpenPGP卡号D276000124010200FFFE5D27157200001-更改PIN2-解锁PIN3-更改管理员PIN4-设置重置代码Q-退出你的选择?PIN已更改。1-更改PIN2-解锁PIN3-更改管理员PIN4-设置重置代码Q-退出你的选择?q个gpg/卡>名称持卡人姓氏:约瑟夫松持卡人的名字:西蒙gpg/卡>语言首选项:sv公司gpg/卡>称呼语(M=先生,F=女士,或空格):gpg/卡>登录登录数据(帐户名):茉莉花gpg/卡>网址检索公钥的URL:https://josefsson.org/key-20190320.txtgpg/卡>施力gpg/卡>密钥属性更改的卡密钥属性:签名密钥请选择您想要的密钥类型:(1) RSA公司(2) ECC公司你的选择?2请选择您想要的椭圆曲线:(1) 曲线25519(4) NIST P-384你的选择?1现在将重新配置该卡以生成ed25519类型的密钥注意:不能保证卡支持所请求的大小。如果密钥生成失败,请检查您的卡的文档,以查看允许的大小。更改的卡密钥属性:加密密钥请选择您想要的密钥类型:(1) RSA公司(2) ECC公司你的选择?2请选择您想要的椭圆曲线:(1) 曲线25519(4) NIST P-384你的选择?1该卡现在将被重新配置为生成类型为:cv25519的密钥更改以下项的卡密钥属性:身份验证密钥请选择您想要的钥匙类型:(1) RSA公司(2) ECC公司你的选择?2请选择您想要的椭圆曲线:(1) 曲线25519(4) NIST P-384你的选择?1现在将重新配置该卡以生成ed25519类型的密钥gpg/卡>贾斯@kaka:~$gpg—卡片编辑读卡器………..:20A0:4211:FSIJ-1.2.19-5D271572:0应用程序ID…:D2760001240102000FFFE5D2715720000应用程序类型:开放式PGP版本………:2制造商…..:非托管序列号范围序列号。。。。:5D271572型持卡人姓名:Simon Josefsson语言首选项…:sv公司称呼…….:先生。公钥的URL:https://josefsson.org/key-20190320.txt登录数据…….:茉莉花签名PIN….:不是强迫的关键属性…:ed25519 cv25519 ed25519最大PIN长度:127 127 127PIN重试计数器:3 3 3签名计数器:0KDF设置……:签名密钥……:[无]加密密钥….:[无]身份验证密钥:[无]常规密钥信息..:[无]贾斯@kaka:~$

设置完成后,拿出脱机机器并启动它,然后用脱机密钥安装USB记忆棒。下面的路径将有所不同,这使用了一种非正统的方法来处理新的GnuPG配置路径我为USB选择的木棍。

贾斯@kaka:/media/jas/2c699cbd-b77e-4434-a0d6-0c4965864296$cp-a gnupghome-backup-masterkey-gnupghume-import-ntrokey-5D271572贾斯@kaka:/media/jas/2c699cbd-b77e-4434-a0d6-0c4965864296$gpg--主目录$PWD/gnupghome-import-ntrokey-5D271572--编辑键B1D2BD1375BECB784CF4F8C4D73CF638C53C06BEgpg(GnuPG)2.2.27;版权所有(C)2021 Free Software Foundation,Inc。这是自由软件:您可以自由更改和重新发布它。在法律允许的范围内,无任何担保。密钥可用。第25519页/D73CF638C53C06BE创建时间:2019-03-20过期时间:2019-10-22使用时间:SC信任:最终有效期:已过期[过期](1)。西蒙·约瑟夫森<simon@josefsson.org>gpg>按键卡片确实要移动主键吗?(是/否)请选择密钥的存储位置:(1) 签名密钥(3) 身份验证密钥你的选择?1第25519页/D73CF638C53C06BE创建时间:2019-03-20过期时间:2019-10-22用法:SC信任:最终有效期:已过期[过期](1)。西蒙·约瑟夫森<simon@josefsson.org>gpg>是否保存更改?(是/否)贾斯@kaka:/media/jas/2c699cbd-b77e-4434-a0d6-0c4965864296$

此时不要忘记更改PIN。此时,确认Nitrokey有可用的主密钥,并且可以使用它在常规机器上签署语句,这是很有用的:

贾斯@kaka:~$gpg—卡状态读卡器………..:20A0:4211:FSIJ-1.2.19-5D271572:0应用程序ID…:D2760001240102000FFFE5D2715720000应用程序类型:开放式PGP版本………:2制造商…..:非托管序列号范围序列号。。。。:5D271572型持卡人姓名:Simon Josefsson语言首选项…:sv公司称呼…….:先生。公钥的URL:https://josefsson.org/key-20190320.txt登录数据…….:茉莉花签名PIN….:不是强迫的关键属性…:ed25519 cv25519 ed25519最大PIN长度:127 127 127PIN重试计数器:3 3 3签名柜台:1KDF设置……:签名密钥……:B1D2 BD13 75BE CB78 4CF4 F8C4 D73C F638 C53C 06BE创建。。。。:2019-03-20 23:37:24加密密钥….:[无]身份验证密钥:[无]常规密钥信息..:发布日期25519/D73CF638C53C06BE 2019-03-20西蒙·约瑟夫森<simon@josefsson.org>sec>ed25519/D73CF638C53C06BE创建时间:2019-03-20到期时间:2023-09-19卡号:FFFE 5D271572ssb>ed25519/80260EE8A9B92B2B创建时间:2019-03-20到期时间:2023-09-19卡号:FFFE 42315277ssb>ed25519/51722B08FE4745A2创建时间:2019-03-20到期时间:2023-09-19卡号:FFFE 42315277ssb>cv25519/02923D7EE76EBD60创建时间:2019-03-20到期时间:2023-09-19卡号:FFFE 42315277贾斯@kaka:~$echo foo | gpg-a--符号| gpg--验证gpg:签字日期:2023年3月16日星期四22:11:02 CETgpg:使用EDDSA键B1D2BD1375BECB784CF4F8C4D73CF638C53C06BEgpg:“Simon Josefsson”的良好签名<simon@josefsson.org>“[最终]贾斯@kaka:~$

最后,为了检索和签署密钥,例如Andre Heinecke的,我可以从他的名片中确认OpenPGP密钥标识符。

贾斯@kaka:~$gpg—位置外部密钥aheinecke@gnupg.comgpg:密钥1FDF723CF462B6B1:公钥“Andre Heinecke<aheinecke@gnupg.com>“已导入gpg:处理的总数:1gpg:导入:1gpg:需要边距:需要3个完成:1个信任模型:pgpgpg:深度:0有效:2已签名:7信任:0-,0q,0n,0m,0f,2ugpg:深度:1有效:7签名:64信任:7-,0q,0n,0m,0f,0ugpg:下一次trustdb检查将于2023-05-26到期pub rsa3072 2015-12-08[SC][有效期:2025-12-05]94A5C9A03C2FE5CA3B095D8E1FDF723CF462B6B1uid[未知]安德烈·海内克<aheinecke@gnupg.com>子版本25519 2017-02-13[S]子版本25519 2017-02-13[A]sub rsa3072 2015-12-08[E][到期日:2025-12-05]sub rsa3072 2015-12-08[A][到期日:2025-12-05]贾斯@kaka:~$gpg—编辑键“94A5C9A03C2FE5CA3B095D8E1FDF723CF462B6B1”gpg(GnuPG)2.2.27;版权所有(C)2021 Free Software Foundation,Inc。这是自由软件:您可以自由更改和重新发布它。在法律允许的范围内,无任何担保。发布rsa3072/1FDF723CF462B6B1创建时间:2015-12-08到期时间:2025-12-05使用时间:SC信任:未知有效性:未知子编25519/2978E9D40CBABA5C创建时间:2017-02-13到期时间:永不使用:S子编25519/DC74D901C8E2DD47创建时间:2017-02-13到期时间:从不使用:A以下密钥于2017-02-23被RSA密钥1FDF723CF462B6B1 Andre Heinecke吊销<aheinecke@gnupg.com>子目录25519/1FFE3151683260AB创建时间:2017-02-13吊销时间:2017-23-23使用时间:E潜艇rsa3072/8CC999BDAA45C71F创建时间:2015-12-08到期时间:2025-12-05使用时间:E潜艇rsa3072/6304A4B539CE444A创建时间:2015-12-08到期时间:2025-12-05用法:A[未知](1)。安德烈·海内克<aheinecke@gnupg.com>gpg>签名发布rsa3072/1FDF723CF462B6B1创建时间:2015-12-08到期时间:2025-12-05使用时间:SC信任:未知有效性:未知主键指纹:94A5 C9A0 3C2F E5CA 3B09 5D8E 1FDF 723C F462 B6B1安德烈·海内克<aheinecke@gnupg.com>此密钥将于2025-12-05到期。您确定要用您的key“西蒙·约瑟夫森<simon@josefsson.org>“(D73CF638C53C06BE)真的要签名吗?(是/否)gpg>退出是否保存更改?(是/否)贾斯@kaka:~$

这是在我的日常机器上,使用NitroKey Start和脱机密钥。无需启动旧的脱机机器,只需签署密钥或延长到期时间!在FOSDEM'23上,我成功地在我的新密钥上获得了至少一个DD签名,Debian密钥环维护人员接受了我的Ed25519密钥。希望我现在终于可以让我的2014-era RSA3744密钥在2023-09-19年到期,不再延长。这将完成我向更简单的OpenPGP密钥设置的过渡,耶!

带有YubiKey NEO的SSH主机证书

如果您管理一组服务器机器,无疑会遇到以下问题打开SSH问题:

无法建立主机“host.example.org(1.2.3.4)”的真实性。RSA密钥指纹是1b:9b:b8:5e:74:b1:31:19:35:48:ba:7d:d0:01:f5。是否确实要继续连接(是/否)?

如果服务器是一台单用户机器,那么您是唯一需要登录的人,只需回答“是”一次,然后使用~/.ssh/known_hosts记录密钥指纹的文件将(某种程度上)起作用,并保护您免受未来中间人的攻击。我说sort-of,因为如果您想从多台机器访问服务器,则需要同步已知主机不知怎么的。一旦您的组织规模扩大,并且您不是唯一需要登录的人,那么在所有机器上的第一次连接时,每个人都只回答“是”的策略是不好的。每当有人对这些提示键入“是”时,有人成功地进行MITM攻击的风险就会增加。

设置一个(或多个)SSH证书颁发机构(CA)来创建SSH主机证书,并让您的用户信任此CA,这将允许您和您的用户通过SSH主机CA的间接方式自动信任主机的指纹。我很惊讶(但可能不应该如此)发现部署它很简单。即使是用存储在YubiKey近地天体上的硬件支持的钥匙来设置它也很容易。下面,我将解释如何为一个假设的组织设置此设置,其中两个人(系统管理员)负责安装和配置机器。

我假设您已经有几个主机在运行,并且它们运行OpenSSH守护进程,所以它们有一个/etc/ssh/ssh_host_rsa_key*公共/私有密钥对,并且您有一个YubiKey近地天体PIV小程序,NEO处于CCID模式。我认为这无关紧要,但我正在运行以下组合Debian公司Ubuntu公司机器。这个Yubico PIV工具用于配置YubiKey NEO,我将使用OpenSC(开放式供应链)的PKCS#11库将OpenSSH与YubiKey NEO连接。让我们安装一些工具:

apt-get安装yubikey-个性化yubico-piv-tool opensc-pkcs11 pcscd

您组织中负责签署SSH主机证书的每个人都需要YubiKey NEO。例如,只有两个人,但人数可能会更多。他们每个人都必须经历以下过程。

第一步是准备近地天体。第一模式使用将其切换到CCID一些设备配置工具,比如尤比基人格化

yk个性化-m1

然后在YubiKey NEO中准备PIV小程序。这包括在YubiKey NEO PIV简介但我会复制下面的命令。在断开连接的机器上执行此操作,保存在一个或多个安全介质上生成的所有文件,并将其存储在保险箱中。

user=西蒙key=`dd if=/dev/random bs=1 count=24 2>/dev/null|hexdump-v-e'/1“%02X”'`echo$key>ssh-$user-key.txtpin=`dd-if=/dev/random-bs=1 count=6 2>/dev/null|hexdump-v-e'/1“%u”'|cut-c1-6`echo$pin>ssh-$user-pin.txtpuk=`dd if=/dev/random bs=1 count=6 2>/dev/null|hexdump-v-e'/1“%u”'|cut-c1-8`echo$puk>ssh-$user-puk.txtyubico-piv工具-一个集合mgm密钥-n$keyyubico-piv-tool-k$key-a change-pin-P 123456-N$pinyubico-piv-tool-k$key-a change-puk-P 12345678-N$puk

然后为SSH主机CA生成RSA私钥,并为该密钥生成虚拟X.509证书。X.509证书的唯一用途是让PIV/PKCS#11满意——他们希望能够从智能卡中提取公钥,并通过X.509凭证实现。

openssl genrsa-out ssh-$user-ca-key.pem 2048openssl req-new-x509-batch-key ssh-$user-ca-key.pem-out ssh-$user-ca-crt.pem

您可以按如下方式将密钥和证书导入PIV小程序:

yubico-piv-tool-k$key-a导入密钥-s 9c<ssh-$user-ca-key.pemyubico-piv-tool-k$key-导入证书-s 9c<ssh-$user-ca-crt.pem

您现在有一个SSH主机CA可以使用了!您要做的第一件事是提取CA的公钥,并为此使用OpenSSH的ssh-keygen,指定OpenSC的PKCS#11模块。

ssh-keygen-D/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so-e>ssh-$user-ca-key.pub

如果你碰巧使用使用gpg-agent/scdaemon的带有OpenPGP的YubiKey NEO,您可能会收到以下错误消息:

无插槽无法从pkcs11读取公钥

原因是scdaemon程序以独占方式锁定智能卡,因此其他应用程序无法访问它。您需要终止scdaemon,具体操作如下:

gpg-connect-agent SCD KILLSCD SCD再见

ssh-keygen的输出可能如下所示:

ssh-rsa软件AAAAB3NzaC1yc2EAAAADAQABAAABAQCp+gbwBHova/OnWMj99A6HbeMAGE7eP3S9lKm4/fk86Qd9bzzNNz2TKM7V1IMEj0GxeiagDC9FMVIcbg5OaSDkuT0wGzLAJWgY2Fn3AksgA6cjA3fYQCw0Kq4/ySFX+Zb+A8zhJgCkMWT0ZB0ZEWi4zFbG4D/q6IvCAZBtdRKkj8nJtT5l3DGPWa2A2pp tGVDgs+0FYbHX0ynD0KfB4PmtR4fVQyGJjJ0MbF7fXFzQVcWiBtui8WR/Np9tvYLUJHkAXY/FjLOZf9ye0jLgP1yE10+ihe7BCxkM79GU9BsyRgRt3oArawUU6tLgkaMN8kZPKAdq0wxNauFtH公司

现在,组织中的所有用户都需要在其~/.ssh/known_hosts如下:

@证书授权*.example.com ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQCp+gbwBHova/OnWMj99A6HbeMAGE7eP3S9lKm4/fk86Qd9bzzNNz2TKM7V1IMEj0GxeiagDC9FMVIcbg5OaSDkuT0wGzLAJWgY2Fn3AksgA6cjA3fYQCw0Kq4/ySFX+Zb+A8zhJgCkMWT0ZB0ZEWi4zFbG4D/q6IvCAZBtdRKkj8nJtT5l3DGPWa2A2pp tGVDgs+0FYbHX0ynD0KfB4PmtR4fVQyGJjJ0MbF7fXFzQVcWiBtui8WR/Np9tvYLUJHkAXY/FjLOZf9ye0jLgP1yE10+ihe7BCxkM79GU9BsyRgRt3oArawUU6tLgkaMN8kZPKAdq0wxNauFtH公司

每个系统管理员都需要完成此过程,每个用户需要为每个系统管理员添加一行。虽然您可以在多个YubiKey近地物体上放置相同的密钥/证书,但为了允许用户只需将一行放入他们的文件中,如果这样做,那么处理撤销就变得有点复杂。如果同时使用多个CA密钥,则可以滚动到新的CA密钥,而不会影响生产。用户可能对不同的机器使用不同的策略,因此并非所有系统管理员都有权为组织中的所有机器创建主机密钥。

CA设置现在已经完成,但它自己没有做任何事情。我们需要使用CA对一些主机密钥进行签名,并配置主机的sshd以使用它们。对于要为其创建密钥的每个主机host.example.com,您可以这样做:

h=主机.example.comscp根@$h:/etc/ssh/ssh_host_rsa_key.pub。gpg-connect-agent“SCD KILLSCD”“SCD BYE”/再见ssh密钥根-D/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so-s ssh-$user-ca-key.pub-I$h-h-n$h-V+52w ssh-host_rsa_key.pubscp ssh_host_rsa_key-cert.pub根@$h:/etc/ssh/

ssh-keygen命令将使用OpenSC的PKCS#11库与NEO上的PIV小程序对话,并提示您输入PIN。输入您在上面设置的PIN。命令的输出如下:

输入“PIV_II(PIV持卡人PIN)”的PIN:签名的主机密钥ssh_host_rsa_key-cert.pub:id“host.example.com”serial 0 for host.exmple.com有效期为2015-06-16T13:39:00至2016-06-14T13:40:58

主机现在安装了SSH主机证书。要使用它,您必须确保/etc/ssh/sshd_config具有以下行:

主机证书/etc/ssh/ssh_host_rsa_key-cert.pub

您需要重新启动sshd以应用配置更改。如果您现在尝试连接到主机,您可能仍将使用known_hosts指纹方法。因此,请从您的机器中删除指纹:

ssh-keygen-R$h

现在,如果您尝试将ssh连接到主机,并将-v参数用于ssh,您将看到以下内容:

调试1:服务器主机密钥:RSA-CERT 1b:9b:b8:5e:74:b1:31:19:35:48:ba:7d:d0:01:f5debug1:主机“Host.example.com”已知并与RSA-CERT主机证书匹配。

成功!

需要进一步讨论的一个方面是主机密钥。在这里,我只为主机的RSA密钥创建了主机证书。您还可以为DSA、ECDSA和Ed25519密钥创建主机证书。我没有这样做的原因是,在这个组织中,我们都使用GnuPG的gpg-agent/scdaemon和YubiKey NEO的OpenPGP Card Applet以及RSA密钥进行用户身份验证。因此,只有主机RSA密钥才相关。

YubiKey NEO密钥的撤销是通过要求用户删除其中一个系统管理员的对应行,并为系统管理员为其创建主机证书的主机重新生成主机证书来实现的。这是用户应该为您的组织至少拥有两个CA的原因之一,他们信任这两个CA来签署主机证书,这样他们就可以在不中断操作的情况下从一个CA迁移到另一个CA。

OpenPGP智能卡和GNOME

以下各项的组合保密性卫兵和aOpenPGP智能卡已经实施并工作了近十年。我记得当我收到一个FSFE奖学金卡2006年。今天我使用YubiKey近地天体。遗憾的是,最近在GNOME下使用它们时出现了一些倒退。我最近用Debian Jessie(beta2)重新安装了我的笔记本电脑,现在花时间解决了这个问题,并写下了一个解决方法。

要使用GnuPG和智能卡,您需要安装GnuPG代理、scdaemon、pscsd和pcsc工具。在Debian上,您可以这样做:

apt-get安装gnupg-agent scdaemon pcscd pcsc-tools

使用pcsc扫描命令行工具以确保pcscd系统在继续之前识别智能卡,如果不能识别智能卡的话,那么除此之外什么都不能工作。下一步是确保在~/.gnupg/gpg.conf:

使用代理

注销并登录GNOME应该通过/etc/X11/Xsession.d/90gpg-agent脚本。从理论上讲,这应该是所需要的全部。然而,当您启动终端并尝试通过GnuPG使用智能卡时,会出现如下错误:

茉莉@拿铁:~$gpg--卡状态gpg:选择openpgp失败:未知命令gpg:OpenPGP卡不可用:一般错误茉莉@拿铁:~$

原因是GNOME钥匙圈劫持GnuPG代理的环境变量并有效替换gpg代理具有gnome-钥匙圈-道门哪一个不支持智能卡命令(Debian错误#773304).GnuPG使用环境变量GPG_AGENT_INFO公司查找代理套接字的位置,当GNOME Keyring处于活动状态时,它通常如下所示:

茉莉@拿铁:~$echo$GPG_AGENT_INFO/运行/user/1000/keyring/gpg:0:1茉莉@拿铁:~$

如果您将GnuPG与智能卡一起使用,我建议禁用GNOME Keyring的GnuPG和SSH代理仿真代码。这在以前的GNOME发行版中很容易实现(例如,Debian Wheezy中包含的版本),通过gnome-session属性图形用户界面。可悲的是有不再使用任何GUI来禁用此功能(Debian bug#760102)。GNOME Keyring GnuPG/SSH代理替换功能是通过XDG自动启动机制调用的,为普通用户帐户禁用系统范围服务的有文档记录的方法是调用以下命令。

茉莉@拿铁:~$mkdir~/.config/autostart茉莉@拿铁:~$cp/etc/xdg/autostart/gnome-keyring-gpg.desktop~/.config/autostart/茉莉@拿铁:~$echo'Hidden=true'>~/.config/autostart/ggnome-keyring-pg.desktop茉莉@拿铁:~$cp/etc/xdg/autostart/gnome-keyring-sh.desktop~/.config/autostart/茉莉@拿铁:~$echo“Hidden=true”>>~/.config/autostart/gnome-keyring-sh.desktop茉莉@拿铁:~$

您现在需要注销并再次登录。启动终端时,可以查看GPG_AGENT_INFO(代理信息)环境变量,一切都应该恢复正常。

茉莉@拿铁:~$echo$GPG_AGENT_INFO/tmp/gpg-dqR4L7/S.gpg-agent:1890:1茉莉@拿铁:~$echo$SSH_AUTH_SOCK/tmp/gpg-54VfL/S.gpg-agent.ssh茉莉@拿铁:~$gpg--卡状态应用程序ID…:D276000124010200006000000420000...茉莉@拿铁:~$ssh-add-Lssh-rsa软件AAAAB3NzaC1yc2EAAAADAQABAAABAQDFP+UOTZJ+OXydpmbKmdGOVOJz8se7lMs139T+TNLryk3EEWF+GqbB4VgzxzrGjwAMSjeQkAMb7Sbn+VpbJf1JDPFBHoYJQmg6CX4kFRaGZT6DHbYjgia59WkdkEYTtB7KPkbFWleo/RZT2u3f8eTedroP7dhS0azN0lDuu/wBrwedzSV+AiPr10rQaCTp1V 8sKbhz5ryOXHQW0Gcps6JraRzMW+ooKFX3lPq0pZa7qL9F6sE4sDFvtOdbRJoZS1b88aZrENGx8KSrcMzARq9UBn1plsEG4/3BRv/BgHHaF+d97 by 52R0VVyIXpLlkdp1Uk4D9cQptgaH4UAyI1vr卡号:00600000042茉莉@拿铁:~$

就是这样。正确解决这个问题需要:1)将智能卡代码添加到GNOME Keyring,2)完全禁用GNOME Keyring中的GnuPG/SSH替换代码,3)重新排序启动,以便gpg-agent取代GNOME-Keyring-daemon,而不是反过来,这样安装gpg-agent的人才能真正获得它,而不是GNOME默认值,或4)其他东西。我对如何解决这个问题没有强烈的意见,但听起来是一个简单的方法。

YubiKey NEO智能卡上的离线GnuPG主密钥和子密钥

我有移动到新的OpenPGP密钥。上有许多教程和博客帖子保密性卫兵密钥生成,但没有一个与我想要的设置完全匹配。所以我写下了我所采取的步骤,以便将来需要时记住它们。简单地说,我的要求如下:

  • 新的GnuPG主密钥位于U盘上。
  • USB记忆棒仅在脱机计算机上使用。
  • YubiKey NEO智能卡上存储有用于日常使用的子密钥。
  • 我想使用GnuPG生成子键,因此我有一个备份。
  • 将一些非默认哈希/密码首选项编码到公钥中。

继续阅读YubiKey NEO智能卡上的离线GnuPG主密钥和子密钥

介绍OATH工具包

我很高兴宣布一个我已经安静工作了大约一年的项目:OATH工具包.OATH代表打开AuTHentication是一个围绕身份验证指定标准的组织。这是一个相当广泛的关注点,但实际上它已经转化为围绕部署和使用基于电子令牌的用户身份验证(例如YubiKey公司

YubiKey公司

OATH最明显的规范是HOTP算法,它是一种生成基于事件的方法一次性密码使用HMAC-SHA1从共享机密获取。HOTP已通过IETF公司作为RFC 4226(副本请求4226)。构建在HOTP之上的是基于时间的变量TOTP,它需要令牌中的时钟。OATH还做了一些其他工作,比如指定用于传输称为PSKC的令牌配置数据(例如序列号和共享机密)的数据格式。
继续阅读介绍OATH工具包