经典McEliece加入IETF和OpenSSH

我的简化NTRU Prime的早期工作一直在进步。IETF文件SSH中的sntrup761已通过多个处理点。GnuPG的libgcrypt增加了对sntrup761的支持. Thelibssh对sntrup761的支持正在工作,但合并请求被阻塞,主要是因为没有时间调试为什么回归测试套件在非-sntrup761型与补丁相关的部件。

基础基于格的后量子算法具有一定的不确定性围绕着它,我觉得量子后的故事不仅仅是增加sntrup761型到实现。经典McEliece我已经被提到过几次了,我花了一些时间学习它,并对提议的ISO标准并已发布草案-josefsson-mceliece在IETF中使算法易于IETF社区使用。Classic McEliece的高质量实现已发布为图书馆信仰我一直支持扬·莫伊什的工作Debian的libmcelice包唉,它被卡在了ftp主NEW队列用于两个月以上的手动审查。先决条件天秤座细胞libcpucycles系列已在Debian中提供。

所有这些文本编写和打包工作都为编写一些代码创造了条件。当我添加对的支持时sntrup761型在里面libssh数据库,我开始熟悉OpenSSH代码库,所以很自然会返回OpenSSH,为Classic McEliece测试一个新的SSH KEX。DJB公司建议选择麦塞利6688128并将其与现有的X25519+序列号761或者用普通的X25519型。而三种算法的混合X25519型sntrup761型麦塞利6688128对于那些不想失去sntrup761所提供的好处的人来说,这只是一个简单的选择X25519型具有麦塞利6688128.中的关键合路器sntrup761x25519是一个简单的SHA512型我能说的唯一好处是,它的描述和实现都很简单,而且由于它已经部署好了,所以不会引发太多问题。

在拖延了几个月的编码之后,一旦我坐下来工作,只花了几个小时就成功建立了Classic McEliece SSH连接。我想在我开始之前,我的大脑已经把背景中的所有东西都整理好了。要复制它,请在Debian测试环境中尝试以下操作(我使用播客以获得清洁的环境)。

#podman run-it--rm debian:测试-极限apt更新apt dist-upgrade-yapt-install-y wget python3 librandombytes dev libcpucycles dev gcc make git autoconf libz dev libssl dev光盘~wget-q-O-https://lib.mcelece.org/libmceliece-20230612.tar.gz|焦油xfz-cd libmcelice-20230612/./配置进行安装ldconfig(ldconfig)光盘。。git克隆https://gitlab.com/jas/openssh-portable网址cd openssh-可移植git结帐jas/mcelice自动侦察./configure#verify“libmcelice支持:是”make#CC=“CC-DDEBUG_KEX=1-DDEBUG _KEXDH=1-DDEBUG-KEXECDH=1”

现在您应该有一个支持Classic McEliece的工作SSH客户端和服务器!通过运行验证支持./ssh-Q密钥它应该提到mcelice6688128x25519-sha512@openssh.com.

要让它打印大量调试输出,可以删除#角色在最后一行,但不要在生产中使用这样的内置。

您可以按如下方式进行测试:

./ssh-keygen-A#写入/usr/local/etc/ssh_host_。。。#通过运行以下命令设置基于公钥的登录:./ssh-keygen-t rsa-f~/.ssh/id_rsa-P“”cat~/.ssh/id_rsa.pub>~/.ssh/授权密钥adduser—系统sshdmkdir/var/空虽然正确;执行$PWD/sshd-p 2222-f/dev/null;已完成&./ssh-v-p 2222本地主机-oKex算法=mcelice6688128x25519-sha512@openssh.com日期

在客户端上,您应该看到如下输出:

OpenSSH_9.5p1,OpenSSL 3.0.11 2023年9月19日...调试1:SSH2_MSG_KEXINIT已发送调试1:SSH2_MSG_KEXINIT已接收debug1:kex:算法:mcelice6688128x25519-sha512@openssh.comdebug1:kex:主机密钥算法:ssh-ed25519debug1:kex:server->客户端密码:chacha20-poly1305@openssh.comMAC:压缩:无调试1:kex:client->服务器密码:chacha20-poly1305@openssh.comMAC:压缩:无debug1:需要SSH2_MSG_KEX_ECDH_REPLY调试1:收到SSH2_MSG_KEX_ECDH_REPLYdebug1:服务器主机密钥:ssh-ed25519 SHA256:YognhWY7+399J+/V8eAQWmM3UFDLT0dkmoj3pIJ0zXs...debug1:主机“[localhost]:2222”已知,并且与ED25519主机密钥匹配。debug1:在/root/.ssh/known_hosts:1中找到密钥debug1:134217728块后重新键入调试1:SSH2_MSG_NEWKEYS已发送debug1:需要SSH2_MSG_NEWKEYSdebug1:SSH2_MSG_NEWKEYS已接收调试1:在134217728块之后重新键入...调试1:发送命令:date调试1:保证:分叉调试1:permanently_set_uid:0/0环境:USER=根LOGNAME=根HOME=/root路径=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/binMAIL=/var/MAIL/root外壳=/bin/bashSSH_CLIENT=::1 46894 2222SSH_连接=::1 46894::1 2222调试1:client_input_channel_req:channel 0 rtype exit-status回复0调试1:client_input_channel_req:channel 0 rtypeeow@openssh.com回复012月9日星期六22:22:40 UTC 2023调试1:通道0:空闲:客户端会话,通道1传输:发送1048044,接收3500字节,0.0秒每秒字节数:发送23388935.4,接收78108.6debug1:退出状态0

请注意kex:算法:mcelice6688128x25519-sha512@openssh.com输出。

网络带宽使用情况如何?下面是一个完整的SSH客户机连接的比较,例如上面登录、打印日期和注销的连接。平原X25519型大约7kb,X25519型具有sntrup761型大约9kb,并且麦塞利6688128具有X25519型约为1MB。是的,Classic McEliece有很大的密钥,但对于许多环境来说,用于会话建立的1MB数据几乎不引人注目。

./ssh-v-p 2222 localhost-oKexAlgorithms=curve25519-sha256 date 2>&1|grep^已传输传输:发送3028,接收3612字节,0.0秒./ssh-v-p 2222 localhost-o Kex算法=sntrup761x25519-sha512@openssh.comdate 2>&1|grep^已转移传输:发送4212,接收4596字节,0.0秒./ssh-v-p 2222本地主机-oKex算法=mcelice6688128x25519-sha512@openssh.comdate 2>&1|grep^已转移传输:发送1048044,接收3764字节,0.0秒内

那么会话建立时间呢?

日期;i=0;测试$i-le 100时;这样做/ssh-v-p 2222 localhost-oKexAlgorithms=curve25519-sha256 date>/dev/null 2>&1;i=`expr$i+1 `;完成;日期12月9日星期六22:39:19 UTC 20232023年12月9日星期六22:39:25 UTC#6秒日期;i=0;同时测试$i-le100;这样做/ssh-v-p 2222本地主机-oKex算法=sntrup761x25519-sha512@openssh.com网站日期>/dev/null 2>&1;i=`expr$i+1 `;完成;日期2023年12月9日星期六22:39:29 UTC12月9日星期六22:39:38 UTC 2023#9秒日期;i=0;测试$i-le 100时;这样做/ssh-v-p 2222本地主机-oKex算法=mcelice6688128x25519-sha512@openssh.com日期>/dev/null 2>&1;i=`expr$i+1`;完成;日期12月9日星期六22:39:55 UTC 20232023年12月9日星期六22:40:07 UTC#12秒

我从未注意到添加sntrup761型,所以我很确定我也不会注意到这种增长。这一切都在继续我的笔记本电脑运行Trisquel所以,要慎重考虑,但至少幅度是明确的。

未来的工作项目包括:

量子后SSH快乐!

更新:将mceliece6688128_keypair调用更改为mcelice6688128f_keypaire(即使用完全兼容的f变量)会导致McEliece的速度与sntrup761型在我的机器上。

2023-12-26年更新:初始IETF文档草案-josefsson-ssh-mceliece-00出版。

简化的NTRU Prime sntrup761加入IETF

这个打开SSH项目增加了对混合动力车的支持优化的NTRU Prime量子密钥后封装方法sntrup761型加强其基于X25519的违约版本8.5发布于2021-03-03虽然人们对后量子密码有很多讨论,但我的印象是,在过去两年中,它们的实施和部署速度有所放缓。为什么?不管答案是什么,我们都可以尝试协同更改,但奇怪的是,这些算法的IETF文档似乎缺失了一项工作。

在一些早期工作的基础上X25519/X448至SSH,在我花了一天时间阅读OpenSSH和微型SSH了解其工作原理的源代码。虽然我对最终密钥是如何从sntrup761/X25519机密中派生出来的并不十分满意,但这是对串联机密的SHA512调用,我认为应该对构造进行更好的记录,为增加信心或更好的设计铺平道路。此外,重复使用RFC5656第4条structs的规范更糟糕(一个不必要的规范性引用),但实现可能更简单。我已经出版了草案-josefsson-ntruprime-ssh-00在这里。这里的学分是扬·莫伊什TinySSH设计的早期的sntrup4591761x25519-sha512@tinyssh.org2018年,Markus Friedl于2019年将其添加到OpenSSH,Damien Miller于2020年将其更改为sntrup761。有谁能为这部作品的历史增添更多内容吗?

有一次我把我的xml2rfc很容易编写一个文档来描述sntrup761密钥封装机制和X25519密钥协商方法之间以非SSH方式的混合构造。我不知道这项工作是否有用,但它可以作为进一步研究的参考。我出版了草案-josefsson-ntruprim-hybrid-00在这里。

最后,基于Streamlined NTRU Prime的IETF文档怎么样?解释所有的细节,尤其是它背后的数学,将是一项巨大的努力。我开始这样做,但意识到停止解释是一种主观要求。如果我们不能假设读者了解格数学,那么像这样的文档是教授格数学的最佳场所吗?我选择了最简单的方法,只是简单介绍了算法,包括SageMath公司和C参考实现以及测试向量。IETF的观众很少理解数学,所以我认为最好把注意力放在网络和算法接口上。这里的一切都是由Streamlined NTRU Prime团队创建的,我只是稍微修改了一下,希望我不会破坏太多。我现在发表了草案-josefsson-ntruprime-streamlined-00在这里。

我维护IETF文件我的ietf-ntruprime GitLab页面,请随时打开合并请求或提出问题以帮助改进它们。

为了对代码的正常工作有信心,我最终准备了一个带有sntrup761的分支对于GNU(全球导航单元)-项目Nettle公司并已提交上游审查。我很不幸不得不理解和执行NIST的DRBG-CTR计算sntrup761已知答案测试,这真是一团糟。为什么确定性随机生成器支持重新播种?为什么它支持非完全熵推导?密钥大小与块大小的混淆是什么?可选参数是什么?有多个算法描述是什么?幸运的是我能够提取一个最小但有效的实现这很容易阅读。我找不到DRBG-CTR测试向量,有人吗?是否有人拥有不使用DRBG-CTR的sntrup761测试向量?关于发布使用随机数据的算法的已知答案测试的最后一点思考:测试向量在实现算法的不同方法上是否稳定?只要考虑一些优化,将一个随机抽取调用移动到另一个调用之前,那么输出不会有所不同吗?还有其他方法来验证实现的正确性吗?

一如既往,快乐黑客!

Debian 10 Buster上GNOME下的OpenPGP智能卡

Debian buster即将发布,今天我在我的联想X201笔记本电脑除GNOME下智能卡的常见问题外,一切进展顺利。我使用FST-01G运行Gnuk,但同样的问题适用于所有OpenPGP卡,包括YubiKeys。我在早期版本中写过这个问题,请阅读Debian 9 Stretch上的智能卡Debian 8 Jessie上的智能卡。一些事情现在已经改变了保密性卫兵的内部ccid支持工程,以及dirmngr目录使用GNOME安装Debian时,默认情况下会安装。我想我应该为新版本写一篇新文章。

在安装Debian并登录到GNOME后,我启动了一个终端并尝试按如下方式使用智能卡。

jas@拿铁:~$gpg--卡状态gpg:从“scdaemon”获取版本时出错:没有SmartCard守护程序gpg:OpenPGP卡不可用:没有SmartCard守护程序茉莉@拿铁:~$

原因是scdaemon程序包未安装。按照以下步骤安装。

茉莉@拿铁:~$sudo apt-get安装scdaemon

在此之后,gpg—卡状态作品。它现在正在使用GnuPG的内部CCID库,该库似乎正在工作。这个pcscd系统不再需要软件包来使事情正常工作,但是安装它也可以,您可能需要pcscd系统如果您使用其他与智能卡对话的应用程序。

茉莉@拿铁:~$gpg--卡状态读卡器………..:日本Gnuk自由软件倡议(FSIJ-1.2.14-67252015)00 00应用程序ID…:D276000124010200FFFE672520150000版本……….:2制造商…..:非托管序列号范围序列号。。。。:67252015持卡人姓名:Simon Josefsson语言首选项…:蒸汽发生器性别…………:男人公钥的URL:https://josefsson.org/key-20190320.txt登录数据…….:茉莉花签名PIN……:国际电视台关键属性…:第25519页第25519页第25519页最大PIN长度:127 127 127PIN重试计数器:3 3 3签名柜台:710KDF设置……:远离的签名密钥……:A3CC 9C87 0B9D 310A BAD4 CF2F 5172 2B08 FE47 45A2创建。。。。:2019-03-20 23:40:49加密密钥….:A9EC 8F4D 7F1E 50ED 3DEF 49A9 0292 3D7E E76E BD60创建。。。。:2019-03-20 23:40:26身份验证密钥:CA7E 3716 4342 DF31 33DF 3497 8026 0EE8 A9B9 2B2B创建。。。。:2019-03-20 23:40:37常规密钥信息..:[无]茉莉@拿铁:~$

如前所述,使用密钥不能立即生效:

茉莉@拿铁:~$echo foo|gpg-a--符号gpg:无默认密钥:无公钥gpg:签名失败:没有公钥茉莉@拿铁:~$

这是因为GnuPG没有与智能卡内的私钥相对应的公钥。

茉莉@拿铁:~$gpg--列出密钥茉莉@拿铁:~$gpg--列表机密密钥茉莉@拿铁:~$

您可以按如下方式从云中检索您的公钥。与Debian Buster一起dirmngr目录程序包是默认安装的,因此无需安装。或者,如果您使用有效的公钥URL配置了智能卡,则可以键入“检索“进入gpg—卡片编辑交互式界面。这可以被认为稍微更可靠(至少从自托管的角度来看),因为它使用您配置的URL来检索公钥,而不是信任云。

茉莉@拿铁:~$gpg--记录密钥“A3CC 9C87 0B9D 310A BAD4 CF2F 5172 2B08 FE47 45A2”gpg:密钥D73CF638C53C06BE:公钥“Simon Josefsson<simon@josefsson.org>“已导入gpg:需要边距:需要3个完成:1个信任模型:pgpgpg:深度:0有效:2签名:0信任:0-,0q,0n,0m,0f,2ugpg:下一次trustdb检查将于2019-10-22到期gpg:处理的总数:1gpg:导入:1茉莉@拿铁:~$

现在用智能卡签名就行了!耶!Btw:将输出大小与前一篇文章中的输出大小进行比较,以了解Ed25519相对于RSA的大小优势。

茉莉@拿铁:~$echo foo|gpg-a--符号-----开始PGP消息-----owGbwMvMwCEWWKTN8c/ddRHjaa4khlieP//S8vO5OkpZGMQ4GGTFFkWn5nTzj3XkGvXlfP6MLWsTCCFDFycAjARscUM/5MnXTF9aSG4ScVa3sDiB2//nPSVz13MkpbonlzSezowRZrhn+Ky7/O6M7XljzzJvtJhfPvOyS+rpyqJlD+buumL+/eOPywA=+WN7-----结束PGP消息-----

和以前一样,由于公钥上的信任设置,对自己进行加密无法顺利进行。请在此见证问题:

茉莉@拿铁:~$echo foo|gpg-a--加密-rsimon@josefsson.orggpg:02923D7EE76EBD60:无法保证此密钥属于指定用户子目录25519/02923D7EE76EBD60 2019-03-20 Simon Josefsson<西蒙@josefsson.org>主键指纹:B1D2 BD13 75BE CB78 4CF4 F8C4 D73C F638 C53C 06BE子密钥指纹:A9EC 8F4D 7F1E 50ED 3DEF 49A9 0292 3D7E E76E BD60目前还不能确定钥匙是否属于被命名的人如果你真的知道自己在做什么,你可以用“是”回答下一个问题。还是用这把钥匙吗?(是/否)gpg:捕捉到信号中断。。。退出茉莉@拿铁:~$

使用更新信任设置gpg—编辑键命令。请注意,这不是摆脱“无法保证此密钥属于指定用户“警告-使用最终信任设置通常只与您自己的密钥相关,这里就是这种情况。

茉莉@拿铁:~$gpg--编辑键simon@josefsson.orggpg(GnuPG)2.2.12;版权所有(C)2018 Free Software Foundation,Inc。这是自由软件:您可以自由更改和重新发布它。在法律允许的范围内,无任何担保。秘密子键可用。发布日期25519/D73CF638C53C06BE创建时间:2019-03-20到期时间:2019-10-22用法:SC信任:未知有效性:未知不锈钢cv25519/02923D7EE76EBD60创建时间:2019-03-20到期时间:2019-10-22使用时间:E卡号:FFFE 67252015ssb ed25519/8020EE8A9B92B2B创建时间:2019-03-20到期时间:2019-10-22用法:A卡号:FFFE 67252015ssb ed25519/51722B08FE4745A2创建时间:2019-03-20到期时间:2019-10-22用法:S卡号:FFFE 67252015[未知](1)。西蒙·约瑟夫森<西蒙@josefsson.org>gpg>信任发布日期25519/D73CF638C53C06BE创建时间:2019-03-20到期时间:2019-10-22使用时间:SC信任:未知有效性:未知不锈钢cv25519/02923D7EE76EBD60创建时间:2019-03-20到期时间:2019-10-22使用时间:E卡号:FFFE 67252015ssb ed25519/8020EE8A9B92B2B创建时间:2019-03-20到期时间:2019-10-22用法:A卡号:FFFE 67252015ssb ed25519/51722B08FE4745A2创建时间:2019-03-20到期时间:2019-10-22用法:S卡号:FFFE 67252015[未知](1)。西蒙·约瑟夫森<simon@josefsson.org>请决定您对该用户正确验证其他用户密钥的信任程度(通过查看护照、检查不同来源的指纹等)1=我不知道或不会说2=我不信任3=我略微信任4=我完全信任5=我最终信任m=返回主菜单你的决定?5你真的要将此密钥设置为最终信任吗?(年/月)年发布日期25519/D73CF638C53C06BE创建时间:2019-03-20到期时间:2019-10-22用法:SC信任:最终有效性:未知不锈钢cv25519/02923D7EE76EBD60创建时间:2019-03-20到期时间:2019-10-22使用时间:E卡号:FFFE 67252015ssb ed25519/8020EE8A9B92B2B创建时间:2019-03-20到期时间:2019-10-22用法:A卡号:FFFE 67252015ssb ed25519/51722B08FE4745A2创建时间:2019-03-20到期时间:2019-10-22使用时间:S卡号:FFFE 67252015[未知](1)。西蒙·约瑟夫森<simon@josefsson.org>请注意,显示的密钥有效性不一定正确除非重新启动程序。gpg>退出茉莉@拿铁:~$

确认gpg—列表键表明密钥现在是可信的,对自己进行加密应该是可行的。

茉莉@拿铁:~$gpg--列出密钥/主页/jas/.gnupg/pubring.kbx----------------------------发布日期:25519 2019-03-20[SC][有效期:2019-10-22]B1D2BD1375BECB784CF4F8C4D73CF638C53C06BE西门·约瑟夫松<simon@josefsson.org>子版本25519 2019-03-20[A][到期日:2019-10-22]子版本25519 2019-03-20[S][有效期:2019-10-22]子cv25519 2019-03-20[E][到期日:2019-10-22]茉莉@拿铁:~$gpg--列表机密密钥/主页/jas/.gnupg/pubring.kbx----------------------------sec#ed25519 2019-03-20[SC][有效期:2019-10-22]B1D2BD1375BECB784CF4F8C4D73CF638C53C06BEuid[终极版]西蒙·约瑟夫森<simon@josefsson.org>ssb>ed25519 2019-03-20[A][有效期:2019-10-22]ssb>ed25519 2019-03-20[S][有效期:2019-10-22]ssb>cv25519 2019-03-20[E][有效期:2019-10-22]茉莉@拿铁:~$echo foo|gpg-a--加密-rsimon@josefsson.orggpg:检查信任数据库gpg:需要边距:需要3个完成:1个信任模型:pgpgpg:深度:0有效:1已签名:0信任:0-,0q,0n,0m,0f,1ugpg:下一次trustdb检查将于2019-10-22进行-----开始PGP消息-----hF4DApI9fuduvWASAQdA4FIwM27EFqNK1I5eZERaZVDAXJDmYLZQHjZD8TexT3gw7系统总重量7s0QSyKtsRugRpex6eSVhfA3WG8fUOyzbNv4o7AC/TQdhZ2TDtXZGFtY0j8BRYIjVDbYOIp1NM3kHnMGHWEJRsTbtLCitMWmLdp4C98DE/uVkwjw98xEJauR公司/9ZNmmvzuWpaHuEJNiFjORA公司==tAX小时-----结束PGP消息-----茉莉@拿铁:~$

问题与打开SSH和GNOME Keyring在以前的版本中仍然存在。

茉莉@拿铁:~$ssh-add-L代理没有身份。茉莉@拿铁:~$echo$SSH_AUTH_SOCK/运行/user/1000/keyring/ssh茉莉@拿铁:~$

我们上次使用的技巧仍然有效,据我所知,它仍然是禁用gnome-keyring ssh组件的唯一推荐方法。请注意我们是如何配置GnuPG的gpg-agent来启用SSH守护进程支持的。

茉莉@拿铁:~$mkdir~/.config/autostart茉莉@拿铁:~$cp/etc/xdg/autostart/gnome-keyring-sh.desktop~/.config/autostart/茉莉@拿铁:~$echo“Hidden=true”>>~/.config/autostart/gnome-keyring-sh.desktop茉莉@拿铁:~$echo enable-ssh-support>>~/.gnupg/gpg-agent.conf

注销GNOME并再次登录。现在,环境变量指向gpg-agent的套接字,使用智能卡进行SSH身份验证就可以了。

茉莉@拿铁:~$echo$SSH_AUTH_SOCK/运行/user/1000/gnupg/S.gpg-agent.ssh茉莉@拿铁:~$ssh-add-Lssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAILzCFcHHrKzVSPDDarZPYqn89H5TPaxwcORgRg+4DagE卡号:FFFE67252015jas@拿铁:~$

本次进一步讨论和研究的主题包括:

  1. 应该scdaemon公司(而且可能pcscd系统)预安装在Debian桌面系统上?
  2. 可以gpg—卡状态试图自动导入公钥和密钥存根?或者,一些新的命令可以自动引导新的智能卡。
  3. GNOME密钥环是否支持智能卡?
  4. 为什么默认情况下对SSH使用GNOME密钥环而不是gpg代理?
  5. gpg-agent是否应默认启用SSH守护程序?
  6. 如何自动推断基于智能卡的私钥的信任设置?

感谢您的阅读和愉快的智能卡!

带有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-tool-一个set-mgm-key-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工具-k$key-一个导入密钥-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-keygen-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。