2012-03-07 23 views
3

OpenSSLを使用してサーバーに安全に接続するCクライアントプログラムが組み込まれています。サーバはハンドシェイク中に証明書を提供し、クライアントはこの証明書の失効ステータスを確認する必要があります。現在私はOCSPを使用してこれを行います。OCSPステープルを使用したクライアントプログラムのOpenSSL証明書失効チェック

これはすべて動作しますが、今ではOCSP staplingを使用してクライアントの取り消しチェックを再実装する必要があります(サーバーがこれを提供し始めると仮定します)。

現在X509 *cert = SSL_get_peer_certificate(ssl)を使用してサーバ証明書を取得して、サーバのドメインに対してsubjectAltNameを確認し、authorityInfoAccess(OCSP URIの場合)を取得します。

私はSSL * ssl;と仮定し、すべてを正常に設定し、SSL_connect(ssl);で接続しました。この時点でOCSPステープル情報を取得し、今受信した証明書を確認するにはどうすればよいですか? OpenSSLライブラリを使ってこれを実際に実装する方法のサンプルコードは見つかりません。

答えて

5

カップルのステップがあります。

  1. は、クライアントがSSL_set_tlsext_status_type(ssl, TLSEXT_STATUSTYPE_ocsp)経由status_request拡張子を送ってもらいます。

  2. SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb)SSL_CTX_set_tlsext_status_arg(ctx, arg)

  3. を経由してOCSP応答を調べるために、コールバック(と引数)を登録し、コールバック関数を記述します。

    static int ocsp_resp_cb(SSL *s, void *arg) 
    { 
    const unsigned char *p; 
    int len; 
    OCSP_RESPONSE *rsp; 
    len = SSL_get_tlsext_status_ocsp_resp(s, &p); 
    BIO_puts(arg, "OCSP response: "); 
    if (!p) 
        { 
        BIO_puts(arg, "no response sent\n"); 
        return 1; 
        } 
    rsp = d2i_OCSP_RESPONSE(NULL, &p, len); 
    if (!rsp) 
        { 
        BIO_puts(arg, "response parse error\n"); 
        BIO_dump_indent(arg, (char *)p, len, 4); 
    return 0; 
    } 
    BIO_puts(arg, "\n======================================\n"); 
    OCSP_RESPONSE_print(arg, rsp, 0); 
    BIO_puts(arg, "======================================\n"); 
    OCSP_RESPONSE_free(rsp); 
    return 1; 
    } 
    
s_clientで使用されるものは、応答情報で取得する方法を示しています
関連する問題