PHP ile SSL API'sine bağlanmanın en sağlam yolu, cURL eklentisiyle HTTPS isteği yapıp yanıtı JSON olarak çözmektir. Aşağıdaki kalıp herhangi bir REST tabanlı sertifika API'sine uyarlanabilir.
Ön koşullar
- PHP 7.4 veya üzeri,
curlvejsoneklentileri etkin - API anahtarı ortam değişkeninde (kaynak kodda değil)
- Sunucunun CA paketini güncel tutması (TLS doğrulaması için)
Temel istemci fonksiyonu
<?php
function api_istek(string $yontem, string $url, array $veri = []): array {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => $yontem,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('SSL_API_TOKEN'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => $veri ? json_encode($veri) : null,
]);
$yanit = curl_exec($ch);
if ($yanit === false) {
throw new RuntimeException('Baglanti hatasi: ' . curl_error($ch));
}
$kod = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$json = json_decode($yanit, true);
if ($kod >= 400) {
throw new RuntimeException("API hatasi ($kod)");
}
return $json ?? [];
}
Önemli noktalar
- TLS doğrulamasını kapatmayın.
CURLOPT_SSL_VERIFYPEER => falsekısa yoldur ama güvenliği ortadan kaldırır. - Zaman aşımı koyun; yanıt vermeyen API sayfanızı kilitlemesin.
- Hata yanıtlarını kaydedin ama anahtarları ve CSR içeriğini günlüğe yazmayın.
- Sipariş gibi işlemleri formdan doğrudan değil, doğrulanmış sunucu taraflı akıştan tetikleyin.
Sık sorunlar
SSL certificate problem: unable to get local issuer certificatehatası genellikle güncel olmayan CA paketinden gelir;curl.cainfoayarını güncel bir pakete yönlendirin.- JSON gövdesinde Türkçe karakter sorununda
JSON_UNESCAPED_UNICODEkullanın.
CSR üretimi için CSR oluşturucuyu, hata ayıklama için SSL sorun gidericiyi kullanabilirsiniz.
Yanıtı güvenle işlemek
API'den dönen değerleri doğrudan HTML çıktısına yazmayın; htmlspecialchars() ile kaçışlayın. Veritabanına kaydederken hazırlanmış ifadeler (PDO prepared statements) kullanın. Sertifika içeriği gibi uzun metinleri TEXT sütununda saklayın ve özel anahtarı veritabanına yazmaktan kaçının.