4.2. 使用保存在智能卡中的 SSH 密钥
您可以使用保存在 OpenSSH 客户端智能卡上的 RSA 和 ECDSA 密钥。使用智能卡的身份验证替换了默认的密码验证。
前提条件
-
在客户端中安装了
opensc
软件包,pcscd
服务正在运行。
流程
列出所有由 OpenSC PKCS #11 模块提供的密钥,包括其 PKCS #11 URIs,并将输出保存到 key.pub 文件:
$ ssh-keygen -D pkcs11: > keys.pub $ ssh-keygen -D pkcs11: ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
要使用远程服务器上的智能卡(example.com)启用验证,将公钥传送到远程服务器。使用带有上一步中创建的 key.pub 的
ssh-copy-id
命令:$ ssh-copy-id -f -i keys.pub username@example.com
要使用在第 1 步的
ssh-keygen -D
命令输出中的 ECDSA 密钥连接到 example.com,您只能使用 URI 中的一个子集,它是您的密钥的唯一参考,例如:$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com Enter PIN for 'SSH key': [example.com] $
您可以使用
~/.ssh/config
文件中的同一 URI 字符串使配置持久:$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh example.com Enter PIN for 'SSH key': [example.com] $
因为 OpenSSH 使用
p11-kit-proxy
包装器,并且 OpenSC PKCS #11 模块是注册到 PKCS#11 Kit 的,所以您可以简化前面的命令:$ ssh -i "pkcs11:id=%01" example.com Enter PIN for 'SSH key': [example.com] $
如果您跳过 PKCS #11 URI 的 id=
部分,则 OpenSSH 会加载代理模块中可用的所有密钥。这可减少输入所需的数量:
$ ssh -i pkcs11: example.com
Enter PIN for 'SSH key':
[example.com] $
其他资源
- Fedora 28:在 OpenSSH 中更好地支持智能卡
-
您系统上的
p11-kit (8)
,opensc.conf (5)
,pcscd (8)
,ssh (1)
和ssh-keygen (1)
手册页