问题是:没有什么能阻止用户在不同的硬件设备上复制证书/密钥并从不同的硬件设备使用它......
考虑到硬件是否可以生成一个真正独特的证书?
问题是:没有什么能阻止用户在不同的硬件设备上复制证书/密钥并从不同的硬件设备使用它......
考虑到硬件是否可以生成一个真正独特的证书?
您可以在可信平台模块 (TPM) 上生成虚拟智能卡。TPM 类似于硬件安全模块 (HSM),只是 TPM 物理连接到计算机的主板,因此不可移植。
很多主板上都有TPM,只是很多人不知道,因此不经常使用他们的TPM。相对于 HSM,TPM 的主要优势可能是其成本较低。TPM 甚至比智能卡更实惠,智能卡必须提供给每个用户并在丢失时更换。相对于智能卡,TPM 的另一个优点是它的不可移植性使其不太可能被放错地方。
关于 VSC:虚拟智能卡 (VSC) 位于 TPM 上并存储证书的私钥。VSC 能够受 PIN 保护,并且可以根据您创建 VSC 的方式将 PIN 设置为最低程度的复杂性。
以下是一些帮助您入门的说明(注意:需要 Windows):
检查您的 TPM 是否处于活动状态:
单击Windows图标,然后键入以下命令,右键单击该图标并以管理员身份执行:
tpm.msc
查看状态的值。如果显示“TPM 已准备好使用”,则 TPM 处于活动状态。
如果 TPM 未激活,您应该在 BIOS 中查找它,如果存在则启用它。
如果您的系统上不存在 TPM,请在此处停止,因为后续步骤不适用。
如何在 TPM 上创建虚拟智能卡:
截屏视频在这里:https ://youtu.be/MSw59AKvwSo
在创建虚拟智能卡之前,您需要以下信息:
abcdefghijklmnopqrstuvwx
6162636465666768696a6b6c6d6e6f707172737475767778
以管理员模式打开命令行终端。
编辑以下命令,将“ MyVSCName ”替换为您在上面为虚拟智能卡选择的名称。然后将编辑后的命令复制并粘贴到终端中:
tpmvscmgr.exe create /name "MyVSCName" /pin PROMPT /pinpolicy minlen 10 uppercase REQUIRED lowercase REQUIRED digits REQUIRED specialchars REQUIRED /AdminKey PROMPT /puk PROMPT /attestation AIK_AND_CERT /generate
您将看到一系列询问您的 PIN、管理员密钥和 PUK 的问题。粘贴您在上面准备的相应值。
您的虚拟智能卡现在应该存在于 TPM 上。您可以使用以下命令通过列出 TPM 中的所有虚拟智能卡来验证其存在:
wmic path win32_PnPEntity where "DeviceID like '%smartcardreader%'" get DeviceID,Name,Status
如何销毁 TPM 上的虚拟智能卡:
以管理员模式打开命令行终端。
列出 TPM 中的虚拟智能卡:
wmic path win32_PnPEntity where "DeviceID like '%smartcardreader%'" get DeviceID,Name,Status
记下“ DeviceID ”下要删除的虚拟智能卡的值。
编辑然后执行以下命令,将“ MyDeviceID ”替换为您要删除的虚拟智能卡的实际 DeviceID:
tpmvscmgr destroy /instance "MyDeviceID"
生成由 TPM 中的私钥签名的证书签名请求:
打开文本编辑器,例如记事本或 Sublime Text。
复制以下代码并将其粘贴到您的文本编辑器中:
[NewRequest]
Subject = "CN=[user's e-mail address or server's domain name],O=[Organisation],L=[Locality],ST=[State],C=[Country]"
Keylength = 2048
Exportable = FALSE
UserProtected = TRUE
MachineKeySet = FALSE
ProviderName = "Microsoft Base Smart Card Crypto Provider"
ProviderType = 1
RequestType = PKCS10
KeyUsage = 0x80
对于该Subject
行,将括号中的值替换为您自己的值,以匹配您的情况。(您应该省略括号字符本身。)
.inf
使用“ ”文件扩展名保存文本文件。例如:
TPM-cert-template.inf
以管理员模式打开命令行终端。
从命令行终端,将目录 (cd) 更改为.inf
上面保存“”文件的位置。
现在生成证书签名请求 (CSR)。将以下代码复制并粘贴到命令行终端:
certreq -new -f TPM-cert-template.inf TPM-cert.csr
您应该会看到来自 Windows 的弹出对话框,要求您选择将生成证书签名请求的虚拟智能卡。请注意,一个 TPM 可以存储多个虚拟智能卡,但在此弹出对话框中,您可能只能看到其中一个(如果存在多个)。 确保在选择虚拟智能卡之前展开列表,然后您将清楚地看到选择应该生成签名请求的特定虚拟智能卡。
选择虚拟智能卡后,您需要输入 PIN。
如果输入正确的 PIN,则应在同一目录中生成一个新文件:
TPM-cert.csr
准备您的服务器以验证您的密钥对:
您现在应该有一个需要由证书颁发机构签名的 CSR。证书颁发机构签署您的 CSR 后,它应该以 PEM 或 DER 格式向您发回证书。
如果您没有证书颁发机构,您可以创建自己的,但创建自己的将意味着使用您签名证书的每个客户端都需要识别您创建的证书颁发机构。为此,您需要证书颁发机构不仅向您发送您最初寻求的签名证书,而且还向您发送证书颁发机构自己的根证书。
从证书颁发机构获得签名证书后,您需要在需要对其进行身份验证的每台服务器或 VPN 上安装签名证书。
准备您的服务器以验证您的用户:
要让您的客户端软件通过安装证书的服务器或 VPN 进行身份验证,您现在需要能够利用连接到 TPM 的 API 的软件。为此,有一个名为PuTTYWinCrypt的 Windows 实用程序,它是流行的 PuTTY 程序的一个分支。它使您能够通过 SSH 或 SCP 连接到服务器。在撰写本文时,GitHub 上提供了 PuTTYWinCrypt的源代码。该软件的作者还编写了一个相关软件的分支,通常与 PuTTYWinCrypt 结合,称为 PageantWinCrypt,它在后台运行,将密钥保存在内存中。
现在您的服务器已经识别了您的证书颁发机构,您应该准备它来识别将要连接的特定用户的公钥。公钥需要采用 OpenSSH 格式,这意味着密钥的整个文本都写在一行上。您可能无法将您的公钥从 PEM 转换为 OpenSSH 格式,因为这种转换要求您有权访问私钥。在您的情况下,私钥仅限于您的 TPM,因此无法直接访问。以下步骤将帮助您在 OpenSSH 中获取您的公钥,而无需直接访问其对应的私钥。
下载并执行PageantWinCrypt。该软件是流行程序Pageant的补丁版本,它将密钥存储在内存中,并在后台作为 Windows 系统托盘中的图标运行。双击可执行文件后,除了系统托盘中现在有一个 PageantWinCrypt 图标外,其他内容并不明显,表明 PageantWinCrypt 正在运行。请注意,PageantWinCrypt 的图标标记为“ Pageant
”而不是“ ” PageantWinCrypt
,因此您需要确保您专门运行 PageantWinCrypt 才能使其正常工作。
单击屏幕左下角的 Windows 图标,键入以下内容,右键单击其图标(应在您键入时出现),然后选择“ Run as administrator
”:
certmgr.msc
应该会弹出一个窗口,显示带有可扩展文件夹图标的证书列表。您需要找到并展开安装签名证书的特定文件夹。在该展开的文件夹中,左键单击名为“ Certificates
.”的子文件夹。左键单击您的特定证书,将其选中。然后转到“ Action
”菜单项,然后Copy
从下拉列表中选择“ ”。您的证书现在在内存中。您需要将其从内存中导入 PageantWinCrypt。
右键单击系统托盘中的 PageantWinCrypt 图标,然后选择“ Add Certificate
。” 您可能会看到一个弹出对话框,上面写着“选择证书”。单击确定。您的密钥现在应该在 PageantWinCrypt 中。您可以通过再次右键单击选美图标并选择“ View Keys
”来确认这一点。应该有一个与您的密钥相对应的行条目。这可能并不明显,但您可以通过双击将该行条目复制到内存中。将复制的行粘贴到文本编辑器中,例如记事本。
观察粘贴的文本。它应该都在一条线上。但是这条长线有两部分,您需要将这些部分分成两行。第二部分从以下内容开始,一直持续到行尾:
cert://
在您的文本编辑器中,将鼠标单击到前面cert://
,然后在键盘上按几次 Enter。现在应该有两行文本,第二行以 . 开头cert:\\
。请注意以下事项:
第一行是您的 OpenSSH 格式的公钥。如果您的服务器在 Linux 上,您需要将 OpenSSH 格式的公钥添加到服务器的authorized_keys
文件中。
要查找authorized_keys
文件的位置,请通过 SSH 连接到 Linux 服务器并输入以下命令。将进行搜索,然后输出authorized_keys
文件的路径:
sudo find / -name "authorized_keys" 2>/dev/null
记下authorized_keys
上述步骤的路径。现在您需要编辑authorized_keys
并粘贴 OpenSSH 格式的公钥。执行以下命令,将文本“ [path-to-authorized-keys] ”替换为您的情况下的路径(省略下面示例中的括号):
sudo nano "[path-to-authorized-keys]"
基于 Linux 的文本编辑器nano现在将打开,显示authorized_keys
. 滚动到底部并添加一个新行,方法是粘贴您已经复制的 OpenSSH 格式的公钥。粘贴后,只需保存文件并退出。
您的 Linux 服务器现在已配置为对启用 TPM 的 SSH 连接进行身份验证。现在,在 Windows 中,您需要设置与 TPM 兼容的软件,以方便您的 SSH 连接。
在文本编辑器中,您之前粘贴的第二行文本是身份验证字符串。它对应于您的 TPM 上的私钥。以 开头的这一行cert:\\
是您需要粘贴到 PuTTYWinCrypt 中的内容,如下所述。
使用可访问 TPM 的软件登录:
打开 PuTTYWinCrypt。在 Category Connection
::SSH
下Auth
,在标有 " Private key file for authentication
," 的空间中粘贴以 . 开头的文本cert:\\
。通常,在不使用 TPM 的情况下,您将在此空间中粘贴到您的硬盘驱动器上的私钥的路径。 但是在您在此处执行的过程中,私钥安全地存储在您的 TPM中,相比之下,它更加安全。在该空间中粘贴此文本(以 开头cert:\\
)后,您将能够使用安装公钥的同一服务器进行身份验证。要保留您的更改,请记住保存您的连接;在 PuTTYWinCrypt 的 Category 下Session
,单击 Save 按钮。
在 PuTTYWinCrypt 中,现在尝试通过 SSH 连接。如果您正确配置了所有内容,您应该会从 TPM 上的虚拟智能卡弹出一个窗口,询问您的 PIN。输入密码。如果 PIN 准确无误,则 SSH 连接应继续并按预期连接。
你完成了! 您刚刚使用安全存储在您的 TPM 上的私钥通过 SSH 连接到您的服务器。
上述信息的灵感来自Chris van Marle的一篇内容丰富的博文,部分内容来自该博文。
最后一点:IBM 的研究人员目前正在开发他们所谓的虚拟 TPM,这将使 TPM 功能从一个云主机迁移到另一个成为可能。