如何在openSSL中从PKCS#11模块读取私钥?
问题的答案 非常清楚地解释了使用存储在智能卡或HSM(硬件安全模块)上的私钥而不是普通文件上的私钥建立SSL连接所需的步骤。事实上,我想在python中也这样做,但首先我必须理解其背后的原理。所以暂时忘掉python吧: 假设密钥已经存在于HSM上的“SecureToken”下。所以如何在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
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、,标签等。您不需要公钥或证书。