gRPC, HTTP/2 üzerinde çalışır ve üretimde neredeyse her zaman TLS ile korunur. Tipik hatalar transport: authentication handshake failed: x509: certificate signed by unknown authority ve x509: certificate is valid for ..., not ... biçimindedir; ilki zincir, ikincisi ad uyuşmazlığı sorunudur.
Sunucu ve istemci gereksinimleri
- Sunucu sertifikasının SAN alanı, istemcinin bağlandığı adı içermeli (modern Go sürümleri yalnızca SAN'a bakar, CN'yi yok sayar).
- İstemci, sertifikayı imzalayan CA'ya güvenmeli (özel CA ise CA dosyasını tanıtmalı).
- HTTP/2 için ALPN
h2anlaşılmalı.
Go örneği
// Sunucu
creds, err := credentials.NewServerTLSFromFile("server.crt", "server.key")
s := grpc.NewServer(grpc.Creds(creds))
// İstemci
creds, err := credentials.NewClientTLSFromFile("ca.crt", "servis.ornek.com")
conn, err := grpc.Dial("servis.ornek.com:443", grpc.WithTransportCredentials(creds))
İkinci parametre, doğrulanan sunucu adıdır (server name override); SAN ile eşleşmelidir.
Komut satırından test
grpcurl -cacert ca.crt servis.ornek.com:443 list
grpcurl -cacert ca.crt -cert istemci.crt -key istemci.key servis.ornek.com:443 list
openssl s_client -alpn h2 -connect servis.ornek.com:443 -servername servis.ornek.com
İkinci komut karşılıklı TLS (mTLS) için istemci sertifikası kullanır.
Nginx ile gRPC ters vekil
server {
listen 443 ssl;
http2 on;
ssl_certificate /etc/ssl/servis-fullchain.pem;
ssl_certificate_key /etc/ssl/servis.key;
location / {
grpc_pass grpcs://arka-uc:50051;
grpc_ssl_trusted_certificate /etc/ssl/ic-ca.crt;
grpc_ssl_verify on;
}
}
Arka uç düz bağlantıysa grpc:// kullanılır.
Sık hatalar
- IP ile bağlanıp SAN'da yalnızca DNS adı olması.
- Ara sertifikanın sunucuda eksik olması.
- Yük dengeleyicinin HTTP/2'yi uçtan uca iletmemesi.
Herkese açık servisler için SSL sertifikaları ve kontrol için SSL Checker kullanabilirsiniz; çok alt alan adlı mimarilerde Wildcard SSL da düşünülebilir.