1

無効な証明書を使用してエラー状態を引き起こす一連の単体テストがありますが、これは完全に機能しますが、残念ながら、きちんとした端末出力は醜い OpenSSL エラーで飽和しています。これらのエラーを抑制する方法を知っている人はいますか?

EDIT1:次のようなエラーがあります:

140376922039968:エラー:0906D06C:lib(9):func(109):reason(108):pem_lib.c:696:予期: CERTIFICATE 140376922039968:エラー:0D0680A8:lib(13):func(104):reason(168) :tasn_dec.c:1319:140376922039968:error:0D07803A:lib(13):func(120):reason(58):tasn_dec.c:381:Type=X509 140376922039968:error:0906700D:lib(9):func( 103):理由(13):pem_oth.c:83:140376922039968:エラー:0D0680A8:lib(13):func(104):理由(168):tasn_dec.c:1319:140376922039968:エラー:0D07803A:lib(13 ):func(120):reason(58):tasn_dec.c:381:Type=X509 140376922039968:error:0906700D:lib(9):func(103):reason(13):pem_oth.c:83:

これらは、無効な X.509 証明書を OpenSSL X509 PEM デコード関数に渡すと生成されます。これらのエラーを生成するコードは次のとおりです。

    BIO *certBio = BIO_new_mem_buf(certData, certSize);
    X509 *x509 = PEM_read_bio_X509(certBio, NULL, NULL, NULL);

EDIT2:申し訳ありませんが、私のコードで印刷エラー関数を呼び出していました。これを調べるために時間を割いてくれた人には申し訳ありません:(

4

3 に答える 3

1

うまくいくかもしれないことの1つは、stderrをパイプに切り替えて、別のスレッド/プロセスにそのパイプから読み取らせ、不要なメッセージを除外することです。このようなものがうまくいくかもしれません:

// Error checking omitted for expository purposes
int origStderr;
int stderrFilter[2];

void RunTests()
{
    // Save original stderr
    origStderr = dup(STDERR_FILENO);

    // Create pipe to be used for filtering out OpenSSL messages
    pipe(stderrFilter);

    // Move the writing end of the pipe onto stderr
    dup2(pipe[0], STDERR_FILENO);
    close(pipe[0]);

    // Create thread to read from the pipe
    pid_t filterThread;
    pthread_create(&filterThread, NULL, &StderrFilterThreadProc, NULL);

    // Ok, run the actual unit tests
    RunOpenSSLUnitTests();

    // Close down the pipe, join the thread, and restore stderr
    dup2(origStderr, STDERR_FILENO);
    close(origStderr);
    pthread_join(filterThread, NULL);
    close(stderrFilter[1]);
}

void *StderrFilterThreadProc(void *arg)
{
    char buffer[SOME_REASONABLY_LARGE_BUFFER_SIZE];
    int n;

    while((n = read(stderrFilter[1], buffer, sizeof(buffer)) > 0)
    {
        // Parse buffer into lines, determine if each line was an OpenSSL message
        for(each line in buffer)
        {
            if(line came did not come from OpenSSL)
                write(origStderr, line, line_length);
        }
    }

    return 0;
}
于 2012-07-23T21:09:41.830 に答える
1

stderrOpenSSL がエラーを出力する場所/dev/nullを次のようにリダイレクトします。

./your_unit_test 2>/dev/null

次のようなものを使用して、プログラムでリダイレクトすることもできます。

  fclose(stderr);
  stderr = fopen("/dev/null","w");

grep別の方法として、OpenSSL の行に特定のものが常に含まれている場合は、その行を削除するために使用することもできます。例えば、

./your_unit_test | grep -v OpenSSL
于 2012-07-23T20:07:57.577 に答える
1

OpenSSL のサンプルをいくつか試してみましたが、OpenSSL が強制的に端末に何かを出力している様子は見られません。

したがって、非常に簡単な解決策を提案します。テスト プログラムからエラー出力コマンドを削除します。ERR_print_errors()おそらく、 、ERR_print_errors_fp()呼び出し、および場合によっては他の出力関数を探す必要がありますERR_reason_error_string()

それにもかかわらず、コードがエラーを出力する場合は、サンプルを提供してください。これをテストして、エラーが発生する理由を調べてください。

于 2012-07-23T22:06:07.090 に答える