Android Studio'da HTTPS Yapılandırması: GET, Yetkilendirme ve Güvenlik
Kısa cevap: Cleartext trafiğini kısıtlamak ve yerel pinning yapmak için Network Security Config kullanın, Retrofit + OkHttp üzerinden HTTPS istekleri yapın, Interceptor'a Bearer ekleyin ve üretim ortamı için SSL pinning ile devre dışı bırakılmış debug hack'lerini uygulayın. Aşağıda, bunun hemen çalışmasını sağlayacak somut adımlar ve minimum kod parçacıkları yer almaktadır.
Network Security Config ve Manifest
API'niz için yalnızca HTTPS'e açıkça izin vermek ve gerekirse yerel sertifikaları bağlamak üzere res/xml/network_security_config.xml dosyasını oluşturun:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">yourapi.com</domain>
<trust-anchors>
<certificates src="@raw/your_cert"/>
</trust-anchors>
</domain-config>
</network-security-config>
AndroidManifest.xml içinde:
<application
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="false"
...>
Yerel geliştirme için debug manifest dosyasında geçici olarak android:usesCleartextTraffic="true" ayarlayabilir ve basitleştirilmiş bir hostnameVerifier kullanabilirsiniz, ancak bunu asla sürümde bırakmayın.
Retrofit ile GET İstekleri ve Yetkilendirme (Bearer Token)
Retrofit/OkHttp bağımlılıklarını ekleyin (build.gradle dosyanızdaki örnek sürüm). Yetkilendirme ve günlük kaydı için Interceptor içeren OkHttpClient'ı yapılandırın:
class AuthInterceptor(private var tokenProvider: () -> String?) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val token = tokenProvider()
val req = chain.request().newBuilder()
.apply { token?.let { addHeader("Authorization", "Bearer $it") } }
.addHeader("Content-Type", "application/json")
.build()
return chain.proceed(req)
}
}
Retrofit başlatma:
val client = OkHttpClient.Builder()
.addInterceptor(AuthInterceptor { tokenStorage.currentToken })
.addInterceptor(HttpLoggingInterceptor().apply { level = BODY }) // sadece debug için
.protocols(listOf(Protocol.HTTP_2, Protocol.HTTP_1_1))
.build()
val retrofit = Retrofit.Builder()
.baseUrl("https://yourapi.com/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
API arayüzü:
interface ApiService {
@GET("users/{id}")
suspend fun getUser(@Path("id") id: String): Response<User>
}
Suspend fonksiyonları ve çağrılabilir scope (lifecycleScope veya viewModelScope) kullanın — bu, callback'lere göre daha kolay ve güvenlidir.
SSL Pinning, Hata Ayıklama ve Üretim Ortamı Pratikleri
Güçlü koruma için CertificatePinner (OkHttp) veya network_security_config içinde pin kullanın:
CertificatePinner örneği:
val pinner = CertificatePinner.Builder()
.add("yourapi.com", "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
.build()
val client = OkHttpClient.Builder()
.certificatePinner(pinner)
.build()
Eğer network_security_config kullanıyorsanız sertifikayı res/raw/my_cert.crt dosyasına ekleyin.
Hata ayıklama:
- Trafiği yakalamak için (Charles, HTTP Toolkit) CA'yı emülatöre/cihaza Settings → Security → Install from storage yoluyla yükleyin (sadece testler için).
- Günlükler: Logcat'i OkHttp etiketine göre filtreleyin ve HttpLoggingInterceptor'ı yalnızca debug modunda etkinleştirin.
Üretim ortamı:
- Asla hostnameVerifier { _, _ -> true } kullanmayın.
- Anahtar rotasyonu: Pin güncellemelerini her 6 ayda bir planlayın (geçiş için yedekli pinler).
- Sunucu HSTS göndermeli ve modern TLS şifrelemelerini desteklemelidir.
Android 16, Sertifika Şeffaflığı gerektirir — ct-verifier'ı HTTPS yığınına şimdi eklemek için hazırlıklı olun.
Sık Karşılaşılan Hatalar
- SSLHandshakeException: Yanlış sertifika, ara sertifika eksik veya istemci CA'ya güvenmiyor.
- NetworkSecurityConfig yok sayılıyor: Manifest dosyasındaki yolun ve android:networkSecurityConfig ayarının doğruluğunu kontrol edin.
- Bearer iletilmiyor: Interceptor eklenmemiş veya tokenProvider null döndürüyor.
- Emülatör ve CA sorunları: Gerçek cihaz farklı davranır — üzerinde test edin.
SSS
- Play Store'da yayınlamak için HTTPS gerekli mi? Evet — Android 9+ varsayılan olarak cleartext trafiğini engeller ve Google güvenli trafik gerektirir.
- Testler için HTTP'ye geçici olarak nasıl izin verilir? Debug varyantı manifest dosyasında: android:usesCleartextTraffic="true" veya yalnızca dev domaini için cleartextTrafficPermitted="true" ayarlı domain-config yapılandırması.
- Hangisini seçmeli: network_security_config içinde pinning mi yoksa CertificatePinner mı? Network config, kaynaklardaki statik sertifikalar için daha basittir; CertificatePinner ise kodda esnek yönetim ve dinamik güncellemeler için daha uygundur.