1

署名の作成と署名の検証機能を含む ECDSA_METHOD を実装する OpenSSL エンジンを構築しています。ECDHE 秘密鍵は署名の作成にのみ使用されるため、エンジンからキーをエクスポートして他の場所に提示する必要はありません。

ただし、SSL_set_private_key 関数を介して SSL_Context に秘密鍵を提供しない場合、SSL ハンドシェイクは次のエラーで失敗します。

error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

また、SSL_set_private_key 関数にモック キー (証明書の公開キーに関連しないもの) を提供しようとしましたが、この関数は、秘密/公開キーが一致するかどうかを検証し、一致しない場合は証明書が正しくないというエラーをスローします。 t。

openssl では、場合によってはこの検証をバイパスできるようです。たとえば、これは ssl/ssl_rsa.c で見つけたものです。

#ifndef OPENSSL_NO_RSA
    /*
     * Don't check the public/private key, this is mostly for smart
     * cards.
     */
    if ((pkey->type == EVP_PKEY_RSA) &&
        (RSA_flags(pkey->pkey.rsa) & RSA_METHOD_FLAG_NO_CHECK)) ;
    else
#endif
    if (!X509_check_private_key(c->pkeys[i].x509, pkey)) {
        X509_free(c->pkeys[i].x509);
        c->pkeys[i].x509 = NULL;
        return 0;
    }

ECキーに似たものが必要だと思いますが、どこにも見つかりませんでした。他のソリューションも高く評価されます。

4

2 に答える 2

1

他のソリューションも高く評価されます。

EVP_PKEY_METHODこれが唯一の選択肢ではないかもしれませんが、独自に作成し、必要に応じてその機能を実装することで、探しているものを達成できると思います。そうすれば、スマート カード ベースのキーなどの独自のハンドルを格納し、適切なタイミングで適切な署名メソッドを呼び出すことができます。EVP_PKEY_meth_set_Xyz()のような関数で適切なメソッドを設定する必要がありますEVP_PKEY_meth_set_sign(<yourSigningFunction>)。たとえば、Windows 暗号化 API を使用している場合はNCryptSignHash()、署名関数から呼び出す必要があります。これにより、署名を取得するために Windows キー ストアから秘密キーをエクスポートする必要がなくなります。

私は以前にこれを行ったことがあり、私が遭遇した唯一の大きな問題 (ドキュメントと例の欠如は別として) は、EVPレベルでのキー ストア機能の欠落でした。ここで見ることができるように、いくつかの作業が進行中のようです。回避策として、キー生成メカニズムの一部としてストアからキー/証明書を選択する必要がありましたが、実際にはそれを意図したものではありません。

このルートに進むことにした場合は、数週間の試行錯誤の準備をしてください.

于 2015-12-06T17:01:05.893 に答える