Мой вопрос связан с 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;
Спасибо