GNUTLS ALPN Issue - PullRequest
       119

GNUTLS ALPN Issue

0 голосов
/ 07 марта 2020

Мой вопрос связан с ALPN в GNUTLS. У меня есть ограниченный брандмауэр, который разрешает только HTTPS-соединение - никакое другое SSL-соединение. Он проверяет, присутствует ли ALPN в CLIENT HELLO. (h2.http1.1)

Я зарегистрировался в Android с использованием обычного Java HttpsURLConnection (который может использовать OpenSSL) и может подключаться к веб-сайту HTTPS. Я обнаружил, что когда я использую HttpsURLConnection, он добавляет ALPN в клиент hello.

Но при использовании GNUTLS образец программы C не может подключиться к этому веб-сайту. Он говорит, что согласование SSL не удалось. поэтому я добавил ALPN, используя

gnutls_alpn_set_protocols()   

Теперь я вижу ALPN, добавленный GNUTLS в CLIENT HELLO. h2.http1.1. Но все еще не подключается.

Я сравнил трафик c, сгенерированный GNUTLS и java HttpsURLConnection, обнаружил, что оба они почти одинаковы, разница только в том, что ALPN в GNUTLS добавил первую часть запроса, но в случае HttpsURLConnection ALPN находится в последней части запроса CLENT Hello.

Подскажите, пожалуйста, немного.

Но в другой обычной сети моя программа GNUTLS C может открывать веб-сайт HTTPS.

Я думаю, что некоторые проблемы в моей C программе.

gnutls_init(&hostinfo->https_sess, GNUTLS_CLIENT);

                // SET ALPN
            gnutls_datum_t t[2];
        t[0].data = (void *) "h2";
        t[0].size = 2;
        t[1].data = (void *)"http/1.1";
        t[1].size = 8;
            gnutls_alpn_set_protocols(hostinfo->https_sess, t, 2, 0);

if (gtls_ver(3,2,9)/* && string_is_hostname(hostinfo->hostname)*/)
                gnutls_server_name_set(hostinfo->https_sess, GNUTLS_NAME_DNS,
                       hostinfo->hostname,
                       strlen(hostinfo->hostname)); 



        gnutls_session_set_ptr(hostinfo->https_sess, (void *) hostinfo);



    #ifdef DEFAULT_PRIO
        default_prio = DEFAULT_PRIO ":%COMPAT";
    #else
        if (gtls_ver(3,2,9)) {
            default_prio = "NORMAL:-VERS-SSL3.0:%COMPAT";
        } else if (gtls_ver(3,0,0)) {
            default_prio = "NORMAL:-VERS-TLS-ALL:+VERS-TLS1.0:" \
                "%COMPAT:%DISABLE_SAFE_RENEGOTIATION:%LATEST_RECORD_VERSION" \
                ":-CURVE-ALL:-ECDHE-RSA:-ECDHE-ECDSA";
        } else {
            default_prio = "NORMAL:-VERS-TLS-ALL:+VERS-TLS1.0:"         \
                "%COMPAT:%DISABLE_SAFE_RENEGOTIATION:%LATEST_RECORD_VERSION";
        }
    #endif

        snprintf(hostinfo->gnutls_prio, sizeof(hostinfo->gnutls_prio), "%s%s",
             default_prio, hostinfo->pfs?":-RSA":"");

        err = gnutls_priority_set_direct(hostinfo->https_sess,
                         hostinfo->gnutls_prio, NULL);
        if (err) {
            host_progress(hostinfo, PRG_ERR,
                     _("Failed to set TLS priority string (\"%s\"): %s\n"),
                     hostinfo->gnutls_prio, gnutls_strerror(err));
            gnutls_deinit(hostinfo->https_sess);
            hostinfo->https_sess = NULL;
            closesocket(ssl_sock);
            return -EIO;
        }

        gnutls_record_disable_padding(hostinfo->https_sess);
        gnutls_credentials_set(hostinfo->https_sess, GNUTLS_CRD_CERTIFICATE, hostinfo->https_cred);
        gnutls_transport_set_ptr(hostinfo->https_sess,(gnutls_transport_ptr_t)(intptr_t)ssl_sock);

        host_progress(hostinfo, PRG_INFO, _("SSL negotiation with %s\n"),
                 hostinfo->hostname);

    #ifdef GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT
        gnutls_handshake_set_timeout(hostinfo->https_sess,
                         GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT);
    #endif

        err = cstp_handshake(hostinfo, 1);
        if (err)
            return err;

        gnutls_free(hostinfo->cstp_cipher);
        hostinfo->cstp_cipher = get_gnutls_cipher(hostinfo->https_sess);

        hostinfo->ssl_fd = ssl_sock;

        hostinfo->ssl_read = openconnect_gnutls_read;
        hostinfo->ssl_write = openconnect_gnutls_write;
        hostinfo->ssl_gets = openconnect_gnutls_gets;

Спасибо

...