使用硬件安全模块发布F-Droid Repo

2020-10-22 15:22:38

以下是使用硬件安全模块(HSM)通过F-Droid发布应用程序的教程。本文中使用的HSM是NitrokeyHSM2。其他硬件令牌应该具有类似的功能,但是您必须使用不同的命令来与HSM交互。

将签名密钥存储在HSM中提供了主要的安全优势,一旦密钥在HSM中生成,它就永远不能以纯文本形式提取。取而代之的是,要签名的数据被发送到HSM,HSM将用内部保存的密钥材料生成签名。他们还应用了一些电容式电阻技术,这使得密钥的物理提取变得非常困难。

Android应用程序的签名密钥是SAIDAPP身份的一部分。作为一种安全措施,只有当新的APK与旧的APK使用相同的私钥签名时,才能安装应用程序的更新。将密钥存储在HSM中可以确保即使攻击者破坏了您的基础设施,他们也无法窃取签名密钥。事实上,如果攻击者可能已经获得了密钥,那就没有任何含糊之处了。物理HSM将需要被盗,至少在这一点上是显而易见的。尽管如此,入侵者仍有可能使用HSM对恶意应用程序进行签名。

F-Droid有两个签名步骤。所有APK以及存储库索引都已签名。理想情况下,所有这些密钥都应该存储在HSM中。

免责声明:我问Nitrokey是否可以赞助一些Nitrokey HSM,让F-Droid的出版工作流程与之配合使用。他们同意寄给我三个,并让我写一篇关于我的结果的博客文章。

强烈建议在使用之前使用设备密钥加密密钥(DKEK)初始化Nitrokey。这允许在硬件出现故障时将密钥备份和恢复到使用相同DKEK初始化的另一个Nitrokey上。将现有签名密钥导入HSM也需要该密钥(见下文)。

有关如何设置此功能以及管理DKEK共享和密码的可能选项的分步指南可在此处找到。

不用说,你应该把DKEK存放在一个非常安全的地方。

Nitrokey HSM2只能导入使用正确的DKEK“包装”(加密)的密钥,因此要从Java密钥库导入明文密钥,必须首先使用DKEK手动包装此密钥。Nitrokey HSM(CardContact)内的智能卡制造商有一种叫做智能卡外壳的工具可以做到这一点。这些工具使用起来不是很好(它是用javascript编写的java GUI工具)。我将这个过程移植到一个小的命令行Python工具,可以在这里找到它。

您应该使用最新的2.0a版本Off-Droid或从git master安装它。最近已经解决了一些HSM使用问题。

按如下方式初始化新的存储库,这将设置用于HSM的fdroid所需的配置文件。

然后,您至少需要更改config.py中的keystorepass,它需要设置为Nitrokey智能卡管脚。如果您已经导入了现有的存储库签名密钥,则需要将其设置为repo_keyalias。否则,您可以直接在HSM上创建新密钥(将keydname更改为您的repo应该显示的证书详细信息)。

从现在开始,只要Nitrokey插到你的机器上,一切都会照常工作。当使用fdroid发布应用程序时,以及在使用fdroid更新生成签名的存储库索引时,F-Droid将自动使用它。

Nitrokey HSM2用于签名密钥的空间有限,最多可存储38个2048位RSA密钥。有一个正在进行中的MR,它利用封装的密钥功能,只按需将应用程序签名密钥加载到HSM上。这允许对单个Nitrokey使用无限数量的不同密钥。