在Go语言中从PKCS11为mTLS连接执行私钥操作的正确方法

4zcjmb1e  于 2023-01-28  发布在  Go
关注(0)|答案(1)|浏览(135)

我已经成功地将私钥导入到PKCS11令牌中。令牌对象如下所示:

Private Key Object; RSA 
  label:      #####
  ID:         #####
  Usage:      decrypt, sign, unwrap
  Access:     sensitive
Public Key Object; RSA 2048 bits
  label:      #####
  ID:         #####
  Usage:      encrypt, verify, wrap
  Access:     none

我了解到CKA_VALUE通常无法提取。我想知道使用pkcs#11私钥和证书创建mTLS连接的正确步骤是什么。

ljsrvy3e

ljsrvy3e1#

我了解到CKA_VALUE通常无法提取
为了以防万一,请查看ThalesIgnite/crypto 11 exportDSAPublicKey(),它使用公钥导出pkcs11.Attribute,包括pcs11.CKA_VALUE
CKA_VALUEECDSA private key objects中的一个)
对于mTLS,检查miekg/pkcs11是否有帮助(未测试)。
它至少可以帮助创建一个基于私钥和证书的tlsConfig。

tlsConfig := &tls.Config{
    Certificates: []tls.Certificate{
        {
            PrivateKey: privateKey,
            Cert:       cert,
        },
    },
}

应该从您的pkcs 11文件中提取这些文件:

privateKey, err := p.FindObject(session, []*pkcs11.Attribute{
    pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_PRIVATE_KEY),
    pkcs11.NewAttribute(pkcs11.CKA_LABEL, "private_key_label"),
})
if err != nil {
    panic(err)
}

cert, err := p.FindObject(session, []*pkcs11.Attribute{
    pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_CERTIFICATE),
    pkcs11.NewAttribute(pkcs11.CKA_LABEL, "certificate_label"),
})
if err != nil {
    panic(err)
}

这似乎不需要CKA_VALUE

相关问题