9

X509 形式の証明書があります。これは関数の入力パラメーターです。私がやりたいことは、証明書の有効性を検証することです。どうすればそれができますか?

X509_verify_cert();

この関数を見つけましたが、これは X509* 証明書を受け入れず、X509_store を受け入れ、X509 しか持っていません。

感謝をこめて。

4

3 に答える 3

18

上記のコメントで見つけた回答を投稿するためだけにここにいます。

私は証明書チェーンを持っていなかったので、私が行っている作業では、プログラムで生成された証明書しか持っていません。その有効性を確認したかったので、次の関数を作成しました。これは、証明書を他のものと照合して、その有効性を検証します。

void check_certificate_validaty(X509* certificate)
{
    int status;
    X509_STORE_CTX *ctx;
    ctx = X509_STORE_CTX_new();
    X509_STORE *store = X509_STORE_new();

    X509_STORE_add_cert(store, certificate);

    X509_STORE_CTX_init(ctx, store, certificate, NULL);

    status = X509_verify_cert(ctx);
    if(status == 1)
    {
        printf("Certificate verified ok\n");
    }else
    {
        printf("%s\n", X509_verify_cert_error_string(ctx->error));
    }
}

これが誰かを助けることを願っています:)

于 2013-04-07T13:10:34.960 に答える
5

証明書の署名を検証するには、発行者証明書の公開鍵が必要です。この発行者証明書の署名は、別の発行証明書 (または信頼されたルート証明書) で検証されます。したがって、証明書の署名が信頼できるルートまでのチェーン全体を検証する場合、その証明書は信頼できると見なされます。

自己署名証明書の署名は、以下の例のように、独自の公開鍵を使用して検証されます。

int verify_cert(const char* pem_c_str)
{
    BIO *bio_mem = BIO_new(BIO_s_mem());
    BIO_puts(bio_mem, pem_c_str);
    X509 * x509 = PEM_read_bio_X509(bio_mem, NULL, NULL, NULL);

    EVP_PKEY *pkey=X509_get_pubkey(x509);
    int r= X509_verify(x509, pkey);
    EVP_PKEY_free(pkey);

    BIO_free(bio_mem);
    X509_free(x509);
    return r;
}

から: http://www.zedwood.com/article/openssl-c-verify-self-signed-certificate-signature

于 2014-10-28T20:16:45.467 に答える