将CERTCertificate derCert转换为SECKEYPublicKey

Converting CERTCertificate derCert to SECKEYPublicKey

本文关键字:SECKEYPublicKey 转换 derCert CERTCertificate      更新时间:2023-10-16

我在64位Ubuntu Linux上使用带有nss和nspr库的c++,并试图将CERTCertificate derCert转换为SECKEYPublicKey,但SECKEY_ImportDERPublicKey一直返回-8183:

安全库:格式不正确的der编码消息。

我也尝试使用SECKEY_ImportDERPublicKey与CERTCertificate derPublicKey,但我得到了相同的响应。

derCert和derPublicKey转换为SECItem和SECKEYPublicKey或CERTCertificate应该使用哪个函数对?

回答我自己的问题…

CERTCertificate包含我感兴趣的两个成员变量derCert和derPublicKey(都是SECItem类型)。

保存/加载公钥

要获得公钥,您可以保存CERTCertificate derPublicKey值或从SECKEYPublicKey获取相同的值:

// cert is of type CERTCertificate
SECKEYPublicKey* publicKey = CERT_ExtractPublicKey( cert );
SECItem* derPublicKey = SECKEY_EncodeDERSubjectPublicKeyInfo( publicKey );
// put the key into string
std::string keyString( (char*)derPublicKey->data, derPublicKey->len );

从字符串解码公钥,使用:

SECItem derKeyItem = {
        .type = siBuffer,
        .data = (unsigned char*)keyString.c_str(),
        .len = (unsigned int)keyString.size()
    };
CERTSubjectPublicKeyInfo* pubInf = SECKEY_DecodeDERSubjectPublicKeyInfo( &derKeyItem );
SECKEYPublicKey* publicKey = SECKEY_ExtractPublicKey( pubInf );

保存/加载证书并获取公钥

要保存证书,请保存derCert.

加载证书并获取公钥:

SECItem derCertItem = {
        .type = siBuffer,
        .data = (unsigned char*)certStr.c_str(),
        .len = (unsigned int)certStr.size()
    };
CERTCertificate cert = CERT_NewTempCertificate(CERT_GetDefaultCertDB(), &derCertItem, nullptr, false, false);
SECKEYPublicKey* publicKey = CERT_ExtractPublicKey(cert);

注意

以上代码为示例代码。对于产品代码,应该使用智能指针(唯一/共享),它们的析构函数应该调用适当的nss destroy函数。