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

  1. 添加OpenSC 库的路径

    设置安全口令牌选择运行库

    C:\Program Files\OpenSC Project\OpenSC\pkcs11\opensc-pkcs11.dll
    # 其它系统请填对应路径

    工具管理安全口令牌密钥文件

    输入PIN即可看到加载成功

  2. 生成并保存密钥文件

    工具密钥文件生成器

  3. 将生成的密钥文件转换为 base64 格式的文件

    # Windows
    [Convert]::ToBase64String([IO.File]::ReadAllBytes("keyfile.dat")) | Set-Content -Encoding ASCII "keyfile.dat.base64"
    # Linux
    base64 keyfile.dat > keyfile.dat.base64
  4. 将您的密钥文件上传到 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 文档签名

本教程实现:

  1. 用 OpenSSL 在外部生成自签名证书和私钥

  2. 将私钥和证书导入 MeXkey3 的 PIV 数字签名槽位 9c

  3. 将公钥证书安装到 Windows 个人存储区

  4. 关联证书与 MeXkey3 智能卡私钥

  5. 在 Word 中使用该证书签名文档

1. 准备工作目录

打开 PowerShell:

mkdir "$env:USERPROFILE\Desktop\office-sign"
cd "$env:USERPROFILE\Desktop\office-sign"

确认 OpenSSL 可用:

openssl version

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

期望输出:

HasPrivateKey : True

10. 在 Word 中签名

  1. 打开 Word 文档
  2. 点击 插入签名行Microsoft Office 签名行
  3. 填写签署人信息,确定
  4. 右键点击签名行 → 签署
  5. 点击 更改,选择证书 YourName
  6. 点击 签名
  7. 系统提示输入 PIV PIN(默认 123456),可能还需触摸 MeXkey3
  8. 验证通过后签名完成,保存文档

签名成功后,Word 状态栏会显示签名图标,文档变为只读。

11. 常见问题

问题 解决方法
certutil -repairstoreCRYPT_E_EXISTS 先删除旧证书,再执行 certutil -user -delkey "容器名",然后重试
Word 里找不到证书 确认证书在“当前用户 → 个人”,HasPrivateKeyTrue,且扩展密钥用法含文档签名
签名时提示 PIN 错误 确认 MeXkey3 PIN,默认 123456;连续输错 3 次会锁定
yubico-piv-tool 找不到设备 尝试加 -r 指定读卡器名称,或重新插拔 MeXkey3

12. 注意事项

  • 自签名证书适合个人测试和内部流转,对外正式文件建议使用权威 CA 签发的证书。
  • 私钥一旦导入 MeXkey3,建议设置为不可导出,并启用触摸策略。
  • 管理密钥和 PIN 请妥善保管,PIN 连续输错 3 次会锁定,需 PUK 解锁。