我在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函数。