Итак, я пытаюсь внедрить SNI на моем сервере GNUTLS.
Мой код:
if(sniCallback != NULL) {
size_t ds = 256;
char data[ds];
unsigned int type = (unsigned int)GNUTLS_NAME_DNS;
int snir = gnutls_server_name_get(sessiond, &data[0], &ds, &type, (unsigned int)0);
data[ds - 1] = 0; // the last one must always be \0
if(snir >= 0) {
jstring js = (*this)->NewStringUTF(this, data);
jlong snicert = (*this)->CallLongMethod(this, sniCallback, (*this)->GetMethodID(this, (*this)->GetObjectClass(this, sniCallback), "getSNICert", "(Ljava/lang/String;)J"), js);
if(snicert > 0L) {
struct cert* oc = (struct cert*)snicert;
gnutls_credentials_set(sessiond, GNUTLS_CRD_CERTIFICATE, oc->cert);
}
} else {
printf("%i\n", snir);
}
}
(Не против JNI)
Я получаю коды ошибок -56, который GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE
, которую документация переводит, чтобы SNI не был отправлен (пока). Как я узнаю, КОГДА у меня есть информация о SNI? AKA Когда я получу клиент Hello? Я получаю это напрямую от Chrome, так что я знаю, что есть SNI. Это все NIO, кстати.
Для тех, кто на том же пути, что и я, ответ:
gnutls_handshake_set_post_client_hello_function