برنامه نویسی
بهروزرسانی کلید HTTP3 – انجمن DEV

زمینه
به روز رسانی کلید یکی از ویژگی های پروتکل انتقال (QUIC) است و باید پس از اتمام دست دادن انجام شود.
بهروزرسانی کلید TLS1.3 از یک پیام دست دادن ویژه برای اطلاع طرف مقابل استفاده میکند که میخواهم کلید جدید را برای برقراری ارتباط تغییر دهیم، که به اثر همگامسازی کلید میرسد.
در QUIC-TLS، اینکه آیا بیت فاز کلید در بسته هدر کوتاه تغییر می کند یا نه، برای اطلاع رسانی به روز رسانی کلید استفاده می شود. 1-مقدار پیش فرض در بسته RTT 0 است که با پیام به روز رسانی کلید TLS1.3 سازگاری ندارد.
علاوه بر این، QUIC-TLS به هر دو طرف نیاز دارد که کلیدها را همزمان به روز کنند، در حالی که TLS1.3 هر دو طرف را به طور مستقل مدیریت می کند.
انجام دهد
پیاده سازی با استفاده از کتابخانه ngtcp2
- ابتدا، یک endpoing از رابط برای مقداردهی اولیه بهروزرسانی کلید استفاده میکند، به برنامه کتابخانه میگوید که میخواهد کلیدها را بهروزرسانی کند، و به طرف دیگر اطلاع میدهد که بهروزرسانی کلید لازم است.
if ((res = ngtcp2_conn_initiate_key_update(c->conn, timestamp())) != 0)
{
print_debug(ERROR, "ngtcp2_conn_initiate_key_update: %s(The previous key update has not been confirmed yet; or key update is too frequent; or new keys are not available yet.)", ngtcp2_strerror(res));
return -1;
}
- از پاسخ تماس بهروزرسانی کلید ngtcp2 استفاده کنید، که توسط کتابخانه استفاده میشود تا به برنامه بگوید که به بهروزرسانی کلید نیاز دارید.
const ngtcp2_crypto_ctx *crypto_ctx = ngtcp2_conn_get_crypto_ctx(c->conn);
const ngtcp2_crypto_aead *aead = &(crypto_ctx->aead);
int keylen = ngtcp2_crypto_aead_keylen(aead);
int ivlen = ngtcp2_crypto_packet_protection_ivlen(aead);
uint8_t rx_key[64], tx_key[64];
if (ngtcp2_crypto_update_key(c->conn, rx_secret, tx_secret,rx_aead_ctx,rx_key, rx_iv, tx_aead_ctx, tx_key, tx_iv, current_rx_secret, current_tx_secret, secretlen) != 0)
{
print_debug(ERROR, "ngtcp2_crypto_update_key failed");
return -1;
}