1

証明書の有効性を検証する必要があるアプリケーションを作成しています。そのために、OCSP を使用したいと思います。OCSP を自分で実装するのではなくlibcrypto、必要なデータを準備するために OpenSSL を調べていました。

私はこれを思いつきました(わかりやすくするためにエラー処理を削除しました):

int main(int argc, char** argv) {
    SSL_library_init();
    FILE *cert_f = fopen(argv[1], "r");
    FILE *cacert_f = fopen(argv[2], "r");
    X509 *cert = d2i_X509_fp(cert_f, NULL);
    X509 *cacert = d2i_X509_fp(cacert_f, NULL);
    fclose(cert_f);
    fclose(cacert_f);

    OCSP_REQUEST *req = OCSP_REQUEST_new();
    OCSP_CERTID *id = OCSP_cert_to_id(EVP_sha1(), cert, cacert);
    OCSP_request_add0_id(req, id);
    BIO *bio = BIO_new_connect("ocspserver:http");
    OCSP_RESPONSE *resp = OCSP_sendreq_bio(bio, "/2", req);
}

これはリクエストをうまく送信します。唯一の問題はOCSP_sendreq_bio()、HTTP プロキシを介した HTTP リクエストの送信をサポートしていないように見えることです。これは私にとってブロッカーです。ドキュメントには、それについて次のように書かれています。

これらの関数は、レスポンダーに対して最小限の HTTP クエリのみを実行します。アプリケーションがより高度な機能をサポートしたい場合は、代替のより完全な HTTP ライブラリを使用する必要があります。

どうやってそうするかは言われていないだけで、私にはそれを理解できないようです。OCSP_sendreq_bio()呼び出しは構造体を ASN.1 構造に変換しますが、それOCSP_REQUESTを可能にするパブリック呼び出しはないようです (何かが欠けていない限り)。

私はこれを正しい方法で行っていますか?そうでない場合、代わりに何をすべきですか?

4

1 に答える 1

1

わかりました、私はばかです:-)

その答えは、OpenSSL には、何かをstructs から ASN.1 バイナリ形式に変換するための汎用関数を生成する一連のマクロがあるということです。これらはすべて形式を持っていますi2d_STRUCT_NAME(およびd2i_STRUCT_NAME逆操作の場合)。正確なi2d_OCSP_REQUESTおよびd2i_OCSP_RESPONSE関数は文書化されていませんが、他のいくつか (たとえば、d2i_X509私の質問で使用している ) は非常によく似た関数シグネチャを持っています (それらは同じマクロで生成されるため)。

したがって、答えは次のOCSP_sendreq_bioようなものに置き換えることです。

unsigned char *data = NULL;
long len = (long)i2d_OCSP_REQUEST(req, &data);
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://ocspserver/2");
curl_easy_setopt(curl, CURLOPT_POST, (long)1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, len);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_memory_append_function);
curl_easy_perform(curl);

于 2015-11-03T14:59:52.923 に答える