私自身の質問に答えるために...
CERTCertificate には、私が興味を持った 2 つのメンバー変数 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 関数を呼び出す必要があります。