OpenSSL Sorun Giderme
OpenSSL'i kullanırken (PHP ortamında, openssl
komutunda, curl
komutunda) 20:unable to get local issuer certificate
gibi bir hata mesajıyla karşılaşabilirsiniz. Bu, yaygın bir OpenSSL geçmiş sorunudur. Güvenliğin artırılması amacıyla, OpenSSL doğrudan çağrıldığında hiçbir CA'ya güvenmez; bu nedenle CAFile veya CAPath belirtmek gerekir. Bu makalede, bu sorunun nasıl çözüleceğini anlatacağız ve PHP, Python, Node.js ile ilgili kod örnekleri sunacağız.
20:unable to get local issuer certificate
Hata Mesajı
Sorun Tanımı
OpenSSL kullanırken 20:unable to get local issuer certificate
hata mesajı alırsanız, bu, OpenSSL'in yerel yetki belgesini bulamadığını gösterir. Bu sorunu çözmenin yolu CAFile veya CAPath belirtmektir.
ServBay'deki OpenSSL Versiyonu
ServBay'in kullandığı çip türüne bağlı olarak, OpenSSL sürümleri farklılık gösterir:
- Intel çipli ServBay: OpenSSL 1.1.1u sürümünü kullanır
- Apple Silicon çipli ServBay: OpenSSL 3.2.1 sürümünü kullanır
İlgili Dosya Yolları
cafile=/Applications/ServBay/package/common/openssl/3.2/cacert.pem
capath=/Applications/ServBay/package/common/openssl/3.2/certs
2
cafile=/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
capath=/Applications/ServBay/package/common/openssl/1.1.1u/certs
2
Örnek: OpenSSL Komutunu Kullanma
Aşağıdaki komutu çalıştırırken bir hata alıyorsanız:
openssl s_client -quiet -connect gmail.com:443
Aşağıdaki gibi bir hata çıktısı görebilirsiniz:
Connecting to 172.217.163.37
depth=2 C=US, O=Google Trust Services LLC, CN=GTS Root R1
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=1 C=US, O=Google Trust Services, CN=WR2
verify return:1
depth=0 CN=gmail.com
verify return:1
2
3
4
5
6
7
8
Çözüm Yolu
Bu sorunu CAFile belirterek çözebilirsiniz:
openssl s_client -quiet -connect gmail.com:443 -CAfile /Applications/ServBay/package/common/openssl/3.2/cacert.pem
Başarılı bir bağlantı sağladıktan sonra, aşağıdaki gibi bir çıktı alırsınız:
Connecting to 172.217.163.37
depth=2 C=US, O=Google Trust Services LLC, CN=GTS Root R1
verify return:1
depth=1 C=US, O=Google Trust Services, CN=WR2
verify return:1
depth=0 CN=gmail.com
verify return:1
2
3
4
5
6
7
Örnek: PHP'de OpenSSL Kullanma
PHP'de OpenSSL kullanıyorsanız, sorunları çözmek için php.ini
dosyanızı veya kodunuzu uygun şekilde yapılandırabilirsiniz.
php.ini
Dosyasını Değiştirme
php.ini
dosyasının [openssl]
bölümüne aşağıdaki satırları ekleyin veya değiştirin:
[openssl]
openssl.cafile=/Applications/ServBay/package/common/openssl/3.2/cacert.pem
openssl.capath=/Applications/ServBay/package/common/openssl/3.2/certs
2
3
[openssl]
openssl.cafile=/Applications/ServBay/package/common/openssl/1.1.1u/cacert.pem
openssl.capath=/Applications/ServBay/package/common/openssl/1.1.1u/certs
2
3
Koda Yapılandırma Ekleyin
PHP kodunuzda CAFile belirtebilirsiniz. Örneğin:
<?php
$server = 'ssl0.ovh.net';
$port = 465;
// CA dosya yolu
$caCertFile = '/Applications/ServBay/package/common/openssl/3.2/cacert.pem';
$contextOptions = [
'ssl' => [
'verify_peer' => true,
'verify_peer_name' => true,
'allow_self_signed' => false,
'cafile' => $caCertFile,
],
];
$context = stream_context_create($contextOptions);
$connection = @stream_socket_client(
"ssl://$server:$port",
$errno,
$errstr,
30,
STREAM_CLIENT_CONNECT,
$context
);
if ($connection) {
echo "Bağlantı kuruldu: $server:$port\n";
fwrite($connection, "EHLO example.com\r\n");
while ($line = fgets($connection)) {
echo $line;
}
fclose($connection);
} else {
echo "Bağlanılamadı: $server:$port. Hata: $errstr ($errno)\n";
}
?>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Örnek: Python'da OpenSSL Kullanma
Python'da OpenSSL kullanıyorsanız, kodunuzda CAFile belirtebilirsiniz. Örneğin:
import ssl
import socket
server = 'ssl0.ovh.net'
port = 465
ca_cert_file = '/Applications/ServBay/package/common/openssl/3.2/cacert.pem'
context = ssl.create_default_context(cafile=ca_cert_file)
with socket.create_connection((server, port)) as sock:
with context.wrap_socket(sock, server_hostname=server) as ssock:
print(f"SSL kuruldu. Karşı taraf: {ssock.getpeercert()}")
ssock.sendall(b"EHLO example.com\r\n")
while True:
data = ssock.recv(4096)
if not data:
break
print(data.decode())
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Örnek: Node.js'de OpenSSL Kullanma
Node.js'de OpenSSL kullanıyorsanız, kodunuzda CAFile belirtebilirsiniz. Örneğin:
const tls = require('tls');
const fs = require('fs');
const server = 'ssl0.ovh.net';
const port = 465;
const caCertFile = '/Applications/ServBay/package/common/openssl/3.2/cacert.pem';
const options = {
host: server,
port: port,
ca: fs.readFileSync(caCertFile),
checkServerIdentity: () => { return null; } // Sunucu kimlik doğrulamasını atla
};
const socket = tls.connect(options, () => {
console.log('SSL bağlantısı kuruldu');
socket.write("EHLO example.com\r\n");
});
socket.on('data', (data) => {
console.log(data.toString());
});
socket.on('error', (error) => {
console.error('Hata:', error);
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Örnek: curl Kullanarak OpenSSL
curl
komutunu kullanırken sorun yaşıyorsanız, CAFile belirterek sorunu çözebilirsiniz:
curl --cacert /Applications/ServBay/package/common/openssl/3.2/cacert.pem https://example.com
Özet
OpenSSL kullanırken 20:unable to get local issuer certificate
hatasıyla karşılaşırsanız, CAFile veya CAPath belirterek bu sorunu çözebilirsiniz. Cihazın çip türüne göre, ilgili CAFile ve CAPath yollarını bulun ve OpenSSL komutlarında, PHP, Python, Node.js veya curl yapılandırmasında uygun şekilde ayarları yapın.