1

我有一堆单元测试使用无效的证书来引发错误条件,这很有效,但不幸的是,我整洁的终端输出现在充满了丑陋的 OpenSSL 错误,有人知道我如何抑制这些错误吗?

EDIT1:错误如下所示:

140376922039968:error:0906D06C:lib(9):func(109):reason(108):pem_lib.c:696:Expecting: CERTIFICATE 140376922039968:error: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):reason(13):pem_oth.c:83:140376922039968:error: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):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

Redirect stderr,其中 OpenSSL 打印错误,/dev/null如下所示:

./your_unit_test 2>/dev/null

您还可以使用以下方式以编程方式重定向它:

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

或者,如果 OpenSSL 行始终包含特定内容,您也许可以使用grep它们来删除它们。例如,

./your_unit_test | grep -v OpenSSL
于 2012-07-23T20:07:57.577 回答
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

我已经尝试了一些 OpenSSL 示例,但我并没有真正看到 OpenSSL 强制向终端输出任何内容。

因此,我将建议一个非常简单的解决方案:从您的测试程序中删除错误输出命令。您可能应该寻找ERR_print_errors()ERR_print_errors_fp()调用和可能的其他输出函数抓取ERR_reason_error_string().

如果您的代码仍然输出错误,请提供一个示例,我们可以对其进行测试并找出发生这种情况的原因

于 2012-07-23T22:06:07.090 回答