PIV应用示例
默认
- PIN: 123456
- PUK: 12345678
- Management Key:
010203040506070801020304050607080102030405060708
MeXkey3的PIV与Veracrypt搭配使用
1. 安装所需软件
根据自己系统安装,安装步骤略过
Veracrypt OpenSC yubico-piv-tool
2. 识别测试
& "C:\Program Files\OpenSC Project\OpenSC\tools\pkcs11-tool.exe" --list-slots
如果成功识别会看到如下内容
Available slots:
Slot 0 (0x0): MeXdiy MeXkey3 0
token label : PIV_II
token manufacturer : piv_II
token model : PKCS#15 emulated
token flags : login required, rng, token initialized, PIN initialized
hardware version : 0.0
firmware version : 0.0
serial num : 5cbc37b5afb4b9ac
pin min/max : 4/8
uri : pkcs11:model=PKCS%2315%20emulated;manufacturer=piv_II;serial=5cbc37b5afb4b9ac;token=PIV_II
运行yubico-piv-tool测试
yubico-piv-tool -r MeXkey3 -a status
如果成功识别会看到如下内容
Version: 5.7.0
Serial Number: 3793437186
CHUID: 3019d4e739da739ced39ce739d836858210842108421c84210c3eb341058e4d26a85109b0c775447e7126669fa350832303530303130313e00fe00
CCC: f0159a625c4ad630ef52d6955688f1d92fbe6e4fffd911f10121f20121f300f40100f50110f600f700fa00fb00fc00fd00fe00
All non-listed slots are empty
PIN tries left: 3
3. 配置Veracrypt
-
添加OpenSC 库的路径
设置 → 安全口令牌 → 选择运行库
C:\Program Files\OpenSC Project\OpenSC\pkcs11\opensc-pkcs11.dll
# 其它系统请填对应路径
工具 → 管理安全口令牌密钥文件
输入PIN即可看到加载成功
-
生成并保存密钥文件
工具 → 密钥文件生成器
-
将生成的密钥文件转换为 base64 格式的文件
# Windows
[Convert]::ToBase64String([IO.File]::ReadAllBytes("keyfile.dat")) | Set-Content -Encoding ASCII "keyfile.dat.base64"
# Linux
base64 keyfile.dat > keyfile.dat.base64
-
将您的密钥文件上传到 ID=0x5fc108 的对象插槽
yubico-piv-tool -r MeXkey3 -a write-object -k --id 0x5fc108 -i keyfile.dat.base64 -f base64
到此就完成了,生成加密卷和解密的时候选择Cardholder Facial Image即可
MeXkey3 PIV 对 Word 文档签名
本教程实现:
-
用 OpenSSL 在外部生成自签名证书和私钥
-
将私钥和证书导入 MeXkey3 的 PIV 数字签名槽位 9c
-
将公钥证书安装到 Windows 个人存储区
-
关联证书与 MeXkey3 智能卡私钥
-
在 Word 中使用该证书签名文档
1. 准备工作目录
打开 PowerShell:
mkdir "$env:USERPROFILE\Desktop\office-sign"
cd "$env:USERPROFILE\Desktop\office-sign"
确认 OpenSSL 可用:
2. 创建 OpenSSL 配置文件
在当前目录新建 openssl.cnf,内容如下:
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
x509_extensions = v3_req
[ dn ]
C = US
O = YourOrg
CN = YourName
[ v3_req ]
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, keyCertSign, cRLSign
extendedKeyUsage = critical, 1.3.6.1.5.5.7.3.4, emailProtection
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
其中 1.3.6.1.5.5.7.3.4 是文档签名扩展,Word 需要它。
3. 生成私钥和自签名证书
openssl genrsa -out mycert.key 2048
openssl req -new -x509 -key mycert.key -out mycert.crt -days 365 -config openssl.cnf
生成:
-
mycert.key:私钥
-
mycert.crt:公钥证书
4. 打包成 PFX
openssl pkcs12 -export -out mycert.pfx -inkey mycert.key -in mycert.crt -name "mycert" -passout pass:123456
PFX 密码设为 123456,可自行修改。
5. 将 PFX 导入 MeXkey3 PIV 9c 槽位
Word 文档签名必须使用 数字签名槽位 9c。
yubico-piv-tool -r MeXkey3 -s 9c -a import-key -a import-certificate -i "$env:USERPROFILE\Desktop\office-sign\mycert.pfx" -K PKCS12
执行后提示:
Enter Password: → 输入 PFX 密码 123456
Enter management key: → 输入 MeXkey3 管理密钥,默认是
010203040506070801020304050607080102030405060708
看到下面两行表示成功:
Successfully imported a new private key.
Successfully imported a new certificate.
验证 9c 槽位:
yubico-piv-tool -r MeXkey3 -a status
确认 9c 不再显示 empty。
6. 导出公钥证书并安装到 Windows
从 mycert.crt 生成 Windows 可安装的 DER 格式 .cer:
openssl x509 -in mycert.crt -outform DER -out mycert.cer
导入到“当前用户 → 个人”:
Import-Certificate -FilePath "$env:USERPROFILE\Desktop\office-sign\mycert.cer" -CertStoreLocation Cert:\CurrentUser\My
记录证书指纹:
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*YourName*" } | Format-List Subject, Thumbprint
假设输出的指纹为:
Thumbprint : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
后续用实际指纹替换。
7. 清理可能存在的旧私钥关联(正常情况跳过此步)
如果之前导入过同一张证书且私钥在软件中,直接关联会报 CRYPT_E_EXISTS。先删除旧证书和旧密钥容器:
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*YourName*" } | Remove-Item -Force
certutil -user -delkey "mycert"
如果提示找不到 mycert 容器,可查看所有智能卡密钥容器:
certutil -key -csp "Microsoft Smart Card Key Storage Provider"
找到与你的 PFX -name 参数对应的容器名,再删除。
8. 关联智能卡私钥
现在证书没有私钥,MeXkey3 里有私钥。运行:
certutil -v -user -f -csp "Microsoft Smart Card Key Storage Provider" -repairstore my <证书指纹>
将 <证书指纹> 替换为第 6 步记录的指纹。
成功时会看到:
Microsoft Smart Card Key Storage Provider: KeySpec=0
AES256+RSAES_OAEP(RSA:CNG) 已跳过测试
通过了签名测试
CertUtil: -repairstore 命令成功完成。
如果失败,可以重启电脑再尝试绑定
9. 验证关联结果
Get-ChildItem Cert:\CurrentUser\My | Where-Object { $_.Subject -like "*YourName*" } | Format-List Subject, Thumbprint, HasPrivateKey, Provider
期望输出:
10. 在 Word 中签名
- 打开 Word 文档
- 点击 插入 → 签名行 → Microsoft Office 签名行
- 填写签署人信息,确定
- 右键点击签名行 → 签署
- 点击 更改,选择证书
YourName
- 点击 签名
- 系统提示输入 PIV PIN(默认
123456),可能还需触摸 MeXkey3
- 验证通过后签名完成,保存文档
签名成功后,Word 状态栏会显示签名图标,文档变为只读。
11. 常见问题
| 问题 |
解决方法 |
certutil -repairstore 报 CRYPT_E_EXISTS |
先删除旧证书,再执行 certutil -user -delkey "容器名",然后重试 |
| Word 里找不到证书 |
确认证书在“当前用户 → 个人”,HasPrivateKey 为 True,且扩展密钥用法含文档签名 |
| 签名时提示 PIN 错误 |
确认 MeXkey3 PIN,默认 123456;连续输错 3 次会锁定 |
yubico-piv-tool 找不到设备 |
尝试加 -r 指定读卡器名称,或重新插拔 MeXkey3 |
12. 注意事项
- 自签名证书适合个人测试和内部流转,对外正式文件建议使用权威 CA 签发的证书。
- 私钥一旦导入 MeXkey3,建议设置为不可导出,并启用触摸策略。
- 管理密钥和 PIN 请妥善保管,PIN 连续输错 3 次会锁定,需 PUK 解锁。