2

OpenSSL (Ubuntu 12.04 で C++ で記述) を使用して SOAP クライアントを作成しましたが、現在はサーバーのセキュリティ証明書をチェックせずに動作します。これは、接続をセットアップし、証明書を確認するために使用している機能です

bool bInitialiseSSL(SSL_CTX* &ctx, SSL* &ssl, BIO* &bio)
{
    ctx = SSL_CTX_new(SSLv23_client_method());  
    bio = BIO_new_ssl_connect(ctx);
    if (bio == NULL) {
        ERR_print_errors_fp(stderr);    
        SSL_CTX_free(ctx);
        return false;
    }

    BIO_get_ssl(bio, &ssl);

    SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
    char target[]  = "api.betfair.com:https";

    BIO_set_conn_hostname(bio, target);
    BIO_set_nbio(bio,1);
    while (1) {
        if (BIO_do_connect(bio) <= 0) {
            if (!BIO_should_retry(bio)) {
                cout << "Connect failed." << endl;
                BIO_free_all(bio);
                SSL_CTX_free(ctx);
                return false;
            }
        } else {
            break;
        }
    }

    if (BIO_do_handshake(bio) <= 0) {
        BIO_free_all(bio);
        SSL_CTX_free(ctx);
        return false;
    }

    X509 *cert;
    bool bValid  = false;
    cert = SSL_get_peer_certificate(ssl); 
    if ( cert != NULL ) {
        long res = SSL_get_verify_result(ssl);
        if (res == X509_V_OK) {
            bValid = true;
        } else {
            cout << "Error in security validation: " << res << endl;
        }
        X509_free(cert);   
    }
    return bValid;
}

これは正常に動作しますが、SSL_get_verify_result の戻り値は 20 です。

X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: ローカル発行者証明書を取得できません

OpenSSL の機能に関するドキュメントをいくつか読みましたが、特にユーザーフレンドリーではありません。多くの Web チュートリアルを見てきましたが、何が間違っているのかわかりません。証明書チェックを実装しようとする前は、私のソフトウェアは完全に機能していましたが、何をする必要があるのか​​わかりません。マシンで設定を構成する必要がありますか? サーバーはおそらく非常に安全なbetfairであり、有効なSSL証明書を持っていないとは信じがたい. 誰かが私が間違っていることを教えてくれたら、とても感謝しています。

4

1 に答える 1

1

サーバーの証明書に依存します。

  • 公開されている有効な証明書である場合は、CA 証明書ファイルを SSL_CTX に含めることができます。

コード:

ctx = SSL_CTX_new(SSLv23_client_method()); 
// You can load CA certs into SSL_CTX
SSL_CTX_load_verify_locations(ctx, cafile, NULL); // cafile: CA PEM certs file

パブリック CA 証明書ファイルは、cURL Web サイトからダウンロードできます。CA Certs from mozilla.org

  • プライベート証明書で、証明書ファイルがある場合は、SSL_CTX_use_certificate_file代わりにSSL_CTX_load_verify_locations.
于 2012-09-03T09:16:11.167 に答える