証明書の有効性を検証する必要があるアプリケーションを作成しています。そのために、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
を可能にするパブリック呼び出しはないようです (何かが欠けていない限り)。
私はこれを正しい方法で行っていますか?そうでない場合、代わりに何をすべきですか?