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:

https://docs.amd.com/r/en-US/ug1144-petalinux-tools-reference-guide/Use-Yocto-Environment-Variables-in-petalinux-config-Option

Yapılacaklar

PetaLinux’a Yocto değişkenlerini geçirme ile ilgili bir ara uğraş, yaz.