ALPN veya Application Layer Protocol Name, hello mesajlarının değişimi içinde protokol müzakeresini içeren bir TLS uzantısıdır. ALPN, güvenli bir bağlantı üzerinden hangi protokolün işlenmesi gerektiğini daha verimli olan ve ek gidiş dönüşlerden kaçınan bir şekilde müzakere edebilir. Popülerliği sürekli artan HTTP/2 protokolü, web sitesi yükleme sürelerini daha da azaltmak ve bağlantıları daha hızlı şifrelemek için ALPN'i kullanır.
RFC 7301 spesifikasyonuna göre, ALPN ile istemci, TLS ClientHello mesajının bir parçası olarak desteklenen uygulama protokollerinin bir listesini sunucuya gönderir. Sunucu daha sonra bir protokol seçer ve bu protokolü ServerHello mesajında geri gönderir. Bu nedenle uygulama protokolü müzakeresi, TLS el sıkışması içinde tek bir gidiş dönüşte gerçekleştirilebilir. Bu yöntem ayrıca sunucunun her uygulama protokolüyle farklı bir sertifika ilişkilendirmesine olanak tanır.
sgcWebSockets 4.3.2 sürümünden itibaren, sgcWebSockets'i özel Indy kütüphanemizle derlerseniz ALPN protokolünü kullanabilirsiniz. Indy varsayılan olarak bu protokolü uygulamaz.
İstemci
ALPN için "h2" gerektiren yeni bir websocket istemcisi oluşturun, bağlandıktan sonra sunucunun hangi protokolü kabul ettiğini kontrol edin.
oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 443;
oClient.TLS := True;
oClient.TLSOptions.ALPNProtocols.Add('h2');
oClient.Active := True;
procedure OnClientConnect(Connection: TsgcWSConnection);
var
vProtocol: string;
begin
vProtocol := TsgcWSConnectionClient(Connection).ALPNProtocol;
end;
Sunucu
İstemcinin "h2" ALPN bağlantılarını destekleyip desteklemediğini kontrol eden yeni bir websocket istemcisi oluşturun.
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 443;
oServer.SSL := True;
oServer.Active := True;
procedure OnServerSSLALPNSelect(Sender: TObject; aProtocols: TStringList; var aProtocol: string);
begin
if aProtocols.IndexOf('h2') > -1 then
aProtocol := 'h2';
end;
