1

64 ビット Ubuntu Linux で C++ と nss および nspr ライブラリを使用しており、CERTCertificate derCert を SECKEYPublicKey に変換しようとしていますが、SECKEY_ImportDERPublicKey は -8183 を返し続けます。

セキュリティ ライブラリ: DER でエンコードされたメッセージの形式が正しくありません。

また、CERTCertificate derPublicKey で SECKEY_ImportDERPublicKey を使用しようとしましたが、同じ応答が得られました。

derCert にはどの関数ペアを使用し、derPublicKey を SECItem に変換してから SECKEYPublicKey または CERTCertificate に戻すには、どの関数ペアを使用する必要がありますか?

4

1 に答える 1

1

私自身の質問に答えるために...

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 関数を呼び出す必要があります。

于 2014-07-23T13:54:41.603 に答える