如何在openSSL中从PKCS#11模块读取私钥?

如何在openSSL中从PKCS#11模块读取私钥?,openssl,cryptography,private-key,pkcs#11,hsm,Openssl,Cryptography,Private Key,Pkcs#11,Hsm,问题的答案 非常清楚地解释了使用存储在智能卡或HSM(硬件安全模块)上的私钥而不是普通文件上的私钥建立SSL连接所需的步骤。事实上,我想在python中也这样做,但首先我必须理解其背后的原理。所以暂时忘掉python吧: 假设密钥已经存在于HSM上的“SecureToken”下。所以 我首先必须从引擎加载私钥: EVP_PKEY*key=ENGINE_load_private_key(e,“SecureToken”,NULL, &cb_数据) 然后我必须打电话 SSL_CTX_use_Pri

问题的答案

非常清楚地解释了使用存储在智能卡或HSM(硬件安全模块)上的私钥而不是普通文件上的私钥建立SSL连接所需的步骤。事实上,我想在python中也这样做,但首先我必须理解其背后的原理。所以暂时忘掉python吧:

假设密钥已经存在于HSM上的“SecureToken”下。所以

  • 我首先必须从引擎加载私钥:

    EVP_PKEY*key=ENGINE_load_private_key(e,“SecureToken”,NULL, &cb_数据)

  • 然后我必须打电话

    SSL_CTX_use_PrivateKey(SSL_CTX*CTX,EVP_PKEY*PKEY)

  • 现在,我有了一个带有PKCS#11接口的HSM,我可以将其作为openSSL引擎加载。 慢慢地,我更了解这些原理,但是,私钥如何离开模块仍然是一个谜:将私钥始终保留在模块内是我使用HSM的原因

    具体来说:从1)中调用的返回值中,我可以得到什么作为“键”?我无法想象关键内容是从HSM读取的,因为PKCS#11甚至不支持此操作。我还能得到什么?是否只是HSM中键的元信息,而不是键本身?SSL_CTX*CTX如何知道以后该如何使用这个“密钥”

    鉴于PKCS#11引擎已正确加载,这是否意味着任何RSA函数都会自动委托给HSM,并将“元密钥信息”存储在上下文中

    请确认这个假设,或者让我知道我错在哪里

    无论如何,我发现了什么是执行副总裁:

        struct evp_pkey_st {
            int type;
            int save_type;
            int references;
            const EVP_PKEY_ASN1_METHOD *ameth;
            ENGINE *engine;
            union {
                char *ptr;
        # ifndef OPENSSL_NO_RSA
                struct rsa_st *rsa;     /* RSA */
        # endif
        # ifndef OPENSSL_NO_DSA
                struct dsa_st *dsa;     /* DSA */
        # endif
        # ifndef OPENSSL_NO_DH
                struct dh_st *dh;       /* DH */
        # endif
        # ifndef OPENSSL_NO_EC
                struct ec_key_st *ec;   /* ECC */
        # endif
            } pkey;
            int save_parameters;
            STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
        } /* EVP_PKEY */ ;
    

    这个结构的关键在哪里?如果2)中参数的pkey没有从引擎加载(如果我根本没有使用引擎),该怎么办?

    私钥没有离开模块。密码文本(或散列)被发送到模块进行解密(或签名),并返回纯文本(或签名)

    您拥有的“密钥”不是编码密钥参数的大整数的集合。相反,它是指向处理与模块交互的引擎的指针,该模块安全地包含该信息


    另一方面,可以从模块导出关联的证书或公钥。这表示私钥的算法和大小,证书可以在字段和扩展中携带额外的元数据。

    私钥不会离开模块。密码文本(或散列)被发送到模块进行解密(或签名),并返回纯文本(或签名)

    您拥有的“密钥”不是编码密钥参数的大整数的集合。相反,它是指向处理与模块交互的引擎的指针,该模块安全地包含该信息


    另一方面,可以从模块导出关联的证书或公钥。这表示私钥的算法和大小,证书可以在字段和扩展中携带额外的元数据。

    我理解。这意味着,在RSA上,上下文中的密钥会自动发送到模块,告诉它获取名为“SecureToken”的密钥。@michael是的,这是通常的,至少在PKCS#11中,HSM中的私钥条目肯定会存储公开可读的属性,如密钥大小、ID、,标签等。你不需要公钥或证书。我理解。这意味着,在RSA上,上下文中的密钥会自动发送到模块,告诉它获取名为“SecureToken”的密钥。@michael是的,这是通常的,至少在PKCS#11中,HSM中的私钥条目肯定会存储公开可读的属性,如密钥大小、ID、,标签等。您不需要公钥或证书。