PetaLinux’u Self-Signed SSL Arkasında Kullanma
PetaLinux derleme yaparken, petalinux-build, internetten birçok dosya
indiriyor. Bu dosyaların çoğu petalinux.xilinx.com adresinde yer alıyor, bir
kısmı sstate
cache
dosyaları, bir kısmı da normal kaynak kodlar. Derleme ortamınız bir proxy
arkasında ise ve bu proxy adeta
MITM saldırısı yapar
gibi tüm trafiği kendi SSL sertifikası ile imzalıyorsa, kurumsal ağlarda normal
bir şey bu arada, napalım, PetaLinux ile çalışırken zorluk yaşayabilirsiniz.
Bu özellikle son zamanlarda olabilecek bir şey çünkü görünen o ki Xilinx
yani AMD artık petalinux.xilinx.coma gelen trafiği, edf.amd.com adresine
yönlendiriyor ama aynı zamanda HTTP trafiği HTTPS olarak da upgrade ediyor. Yani
eskiden sisteminiz böyle bir proxy arkasında olsa bile tüm trafiğiniz HTTP
olabiliyorsa böyle bir engele takılmıyor olabilirsiniz, bu yüzden son zamanlarda
önünüze çıkabilir dedim.
Bknz:
$ curl -i http://petalinux.xilinx.com
HTTP/1.1 307 Temporary Redirect
Server: AkamaiGHost
Content-Length: 0
Location: https://edf.amd.com/
Connection: keep-alive
Trafiğimiz HTTPS’e yönlendirildi. Bir de derleme sürelerimiz uzasın diye midir
nedir 307 yapmışlar ki BitBake sürekli petalinux.xilinx.comdan seksin. Neyse..
Durum böyle olunca makinanız (diyelim Ubuntu) self-signed sertifika ile düzgün çalışacak şekilde konfigüre edilse bile PetaLinux/Yocto bunu görmeyebiliyor. O yüzden çeşitli ufak düzeltmeler yapmak gerekiyor.
Benim makinamda /etc/ssl/certs/ca-certificates.crt proxy’nin self-signed
sertifikalarını da içeriyor ama PetaLinux varsayılan olarak bunları kullanmıyor.
Böyle bir durumda petalinux-build dediğiniz zaman aşağıdaki gibi birçok uyarı
alabiliyorsunuz:
WARNING: libnsl2-native-2.0.0-r0 do_fetch: Failed to fetch URL git://github.com/thkukuk/libnsl;branch=master;protocol=https, attempting MIRRORS if available
WARNING: libmicrohttpd-native-0.9.76-r0 do_fetch: Failed to fetch URL https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.76.tar.gz, attempting MIRRORS if available
...
...
...
Bunun sebebi self-signedl SSL sertifika yüzünden pek bir yere erişememiz.
https://edf.amd.coma zaten gidemiyoruz, state cache çekemediğimiz için zaten
derlemelerimiz uzayacak. Artık birçok projenin upstream reposu https://
arkasında olduğu için kaynak koadları da çekemiyoruz. Sadece http veya git
üzerinden (sanıyorum) bir şeylere erişebiliyouruz ama günün sonunda derleme
işlemi başarızı oluyor.
Önerilmeyen Çözüm, BB_CHECK_SSL_CERTS
.conf dosyasına ekleyeceğiniz tek satır ile BitBake’in SSL sertifikasını
kontrol etmesi kapatabiliyoruz. Bu çözüm genel olarak önerilmiyor çünkü genel
güvenlik prensibi olarak SSL sertifikası kontrolünü kapatmak iyi bir çözüm
değil. AMA tamamen bir proxy arkasında çalışıyorsanız ve bu arkadaş zaten SSL
trafiğini sonlandırıp kendi sertifikası ile size yolluyorsa bu korkulduğu kadar
kötü bir çözüm değil. Çünkü zaten sizin bilgisayarınıza gelene kadar SSL proxy
tarafından sonlandırılıyor. Kendi iç networkünüzde birileri MITM yaparsa oradan
gol yiyebilirsiniz, bu da hiç olmayacak bir şey değil bu arada.
Bunun için project-spec/meta-user/conf/petalinuxbsp.conf içerisine
BB_CHECK_SSL_CERTS = "0"
ekliyoruz.
Mesela:
ebox@ayazar:~/xilinx-zc702-2024.1$ cat project-spec/meta-user/conf/petalinuxbsp.conf
#User Configuration
#OE_TERMINAL = "tmux"
IMAGE_BOOT_FILES:zynq = "BOOT.BIN boot.scr uImage rootfs.cpio.gz.u-boot"
BB_CHECK_SSL_CERTS = "0"
Önerilen Çözüm, Kendi Sertifikamızı Göstermek
Bu aşamada /etc/ssl/certs/ca-certificates.crt gibi sisteminizdeki sertifika
dosyasının doğru olduğundan önce emin olmak gerekiyor. Buraları halletmiş
olmanız lazım, self-signed sertifika yüklü olması lazım. Onun için şöyle bir
test yapabiliriz.
Test:
ebox@ayazar:~$ wget https://www.google.com
Resolving www.google.com... 142.251.140.36
Connecting to www.google.com|142.251.140.36|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.2’
başarılı oldu. Yok eğer
ebox@ayazar:~$ wget https://www.google.com
Resolving www.google.com... 142.251.140.36
Connecting to www.google.com|142.251.140.36|:443... connected.
ERROR: The certificate of ‘www.google.com’ is not trusted.
ERROR: The certificate of ‘www.google.com’ doesn't have a known issuer.
gibi bir hata alıyorsak zaten sistemdeki sertifikalarımız eksik demektir, önce bunu çözmelisiniz.
Şimdi PetaLinux’un settings.sh ını source edip çevre değişkenlerine bir
bakalım.
ebox@ayazar:~/xilinx-zc702-2024.1$ printenv | grep -i ssl
GIT_SSL_CAINFO=/opt/Xilinx/PetaLinux/2024.1/sysroots/x86_64-petalinux-linux/etc/ssl/certs/ca-certificates.crt
CURL_CA_BUNDLE=/opt/Xilinx/PetaLinux/2024.1/sysroots/x86_64-petalinux-linux/etc/ssl/certs/ca-certificates.crt
SSL_CERT_FILE=/opt/Xilinx/PetaLinux/2024.1/sysroots/x86_64-petalinux-linux/usr/lib/ssl-3/certs/ca-certificates.crt
REQUESTS_CA_BUNDLE=/opt/Xilinx/PetaLinux/2024.1/sysroots/x86_64-petalinux-linux/etc/ssl/certs/ca-certificates.crt
...
Gördüğünüz üzere 4 tane değişken PetaLinux’un içerisindeki sertifikalara işaret ediyor.
Not
Bu da biraz kötü bir çözüm aslında, PetaLinux’un ya da Yocto’nun bunu yapması. Ya o ara sertifikalarda güncelleme olursa, eklemeler ve çıkarmalar olursa (revoke), burası güncellenmemiş kalacak. Bu da bir problem değil mi? 🤔
Bir seçenek olarak sembolik link ile bu dosyaları kendi makinamızdaki
.crt dosyasına yönlendirebiliriz. Diğer bir seçenek de .conf dosyası
içerisine bunları ekleyebiliriz, override edebiliriz.
Mesela:
ebox@ayazar:~$ cat petalinuxbsp.conf
#User Configuration
#OE_TERMINAL = "tmux"
IMAGE_BOOT_FILES:zynq = "BOOT.BIN boot.scr uImage rootfs.cpio.gz.u-boot"
SSL_CERT_FILE = "/etc/ssl/certs/ca-certificates.crt"
GIT_SSL_CAINFO = "/etc/ssl/certs/ca-certificates.crt"
CURL_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"
REQUESTS_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt"
Bu da iş görecektir.
petalinux-build Öncesi Ayarlamak (Maalesef ?)
Şunu deneyebiliriz
$ BB_CHECK_SSL_CERTS=0 petalinux-build
fakat gördüğüm kadarıyla bu çalışmıyor. Çünkü petalinux-build, Yocto’yo bu
değişkenleri geçirmiyor. Proje ayarlarını değiştirmeden bunu yapmak güzel
olabilirdi. Olmayacak şey değil de uğraşmadım şimdilik.
Bknz:
Yapılacaklar
PetaLinux’a Yocto değişkenlerini geçirme ile ilgili bir ara uğraş, yaz.