我有一张带读卡器的智能卡,我决定在后者中实现一个客户端证书。
私钥存储在卡中,公钥存储在服务器中。
应用场景是这样的:
- 应用程序向 Linux 服务器发送帧
- Linux 服务器用随机数回答
- 应用程序从(智能卡或 pem 文件)读取私钥并加密接收到的随机数并将结果发送到服务器。
- 服务器尝试通过公钥(存储在服务器中的 pem 文件)解密发送的加密字符串 => 如果成功访问,则拒绝访问。
在我的应用程序中,有一种证书身份验证模式(静态文件 .pem),也使用私钥(也是静态 .pem)。我使用和openssl-net
之类的功能来读取私钥并加密数据以发送到服务器。FromPrivateKey(string pem, string password)
PrivateEncrypt(byte[] msg, RSA.Padding padding)
需要的问题是,自从我的 pem 文件以来,我没有先验方法将我的私钥导出到我的智能卡中。
因此,经过大量研究,我明白我应该使用这些函数类型函数来代替:“ENGINE_load_private_key”和引擎“pkcs11”。
所以我已经看到了几个带有 pkcs11(opensc、engine_pkcs11.so 等)的 openssl 配置示例(例如http://openssl.6102.n7.nabble.com/Private-Key-from-Windows-Cert-Store-td20720.html ) ...) 问题是这些配置是针对 Linux 的。
事实上,我需要开发一个客户端应用程序 windows WPF(用 C# 编写),它可以从智能卡或 PEM 文件中读取私钥。