VMware vCenter Server ortamlarında güvenlik ve sertifika yönetimi, altyapının sürekliliği açısından kritik öneme sahiptir. vCenter’da kullanılan Lookup Service bileşeni ortamınızdaki farklı servislerin güvenli iletişimini sağlamak için sertifikalara dayanır.

Bu sertifikaların güncellenmesi gerektiğinde genellikle ls_update_certs.py aracı devreye girer.

Ancak vCenter Server 8.0 Update 2 (8.0.2) ve üzeri sürümlerde bu scirpt çalıştırırken Python tabanlı bir hata ile karşılaşabilirsiniz.

Hata mesajı aşağıdaki gibidir:

AttributeError: module 'base64' has no attribute 'decodestring'

Bu makalede hatanın neden ortaya çıktığını, ortam üzerindeki etkilerini, geçici çözüm yöntemini ve VMware’in sunduğu resmi yaklaşımı detaylı şekilde inceleyeceğiz.

ls_update_certs.py çalıştırıldığında hata şu şekilde görünür:

Traceback (most recent call last):
  File "/usr/lib/vmware-lookupsvc/tools/ls_update_certs.py", line 15, in <module>
    lstoolutil.modify_svc_ep_certs(args.url,
  File "/usr/lib/vmware-lookupsvc/tools/lstoolutil.py", line 113, in modify_svc_ep_certs
    update55_ct = _modify_svc_eps(lsUrl, True, ids55, _update_svc_spec, username, password)
  File "/usr/lib/vmware-lookupsvc/tools/lstoolutil.py", line 217, in _modify_ep_certs
    h.update(base64.decodestring(value.encode('utf-8')))
AttributeError: module 'base64' has no attribute 'decodestring'

Özetle:

  • Betik, lstoolutil.py dosyasında base64.decodestring fonksiyonunu çağırıyor.
  • Ancak kullanılan Python sürümünde bu metod artık mevcut değil.
  • Sonuç olarak sertifika güncelleme işlemi başlamadan hata alıyor ve işlem tamamlanamıyor.

Bu hata sadece VMware vCenter 8.0 U2 ve sonrası sürümlerde gözlemlenmiştir. Daha önceki sürümlerde aynı betik sorunsuz çalışmaktadır.

Hatanın Nedeni

Sorunun temelinde Python 3.10 değişiklikleri yatmaktadır.

  • Daha eski Python sürümlerinde base64.decodestring() fonksiyonu kullanılabiliyordu.
  • Ancak Python 3.9 ile bu metod deprecated (kullanımdan kaldırılmış) olarak işaretlendi.
  • Python 3.10 ile birlikte ise tamamen kaldırıldı.

Dolayısıyla ls_update_certs.py betiğinin bağımlı olduğu lstoolutil.py kütüphanesi eski çağrıyı kullandığı için hata oluşuyor.

Doğru kullanım: base64.decodebytes()

VMware bu hatayı resmi olarak kabul etmiş ve şu açıklamayı yapmıştır:

“vCenter 8.0 U2 ve üzeri sürümlerde kullanılan ls_update_certs.py aracında Python 3.10’daki değişiklikler nedeniyle hata görülebilir. Bu sorun ileride yayınlanacak bir güncellemede giderilecektir.”

Yani şu an için resmi düzeltme henüz yayınlanmamıştır ancak gelecek sürümlerde hatasız bir betik sunulacaktır.

Çözüm Yöntemleri

Resmi Kalıcı Çözüm

  • VMware’in yeni yayınlayacağı patch veya update release ile lstoolutil.py dosyası güncellenecektir.
  • Mümkünse kritik ortamlarda resmi güncellemeyi beklemek en güvenli yoldur.

Geçici Çözüm (Workaround)

Acil durumda betiğin çalışması gerekiyorsa, aşağıdaki adımlarla manuel bir düzeltme yapabilirsiniz:

Adım Adım Uygulama

  1. vCenter Server’a SSH ile root olarak bağlanın: ssh root@<vcenter-fqdn>
  2. Orijinal dosyanın yedeğini alın: cp /usr/lib/vmware-lookupsvc/tools/lstoolutil.py ~/lstoolutil.bak
  3. decodestring ifadelerini decodebytes ile değiştirin: sed -i 's/decodestring/decodebytes/g' /usr/lib/vmware-lookupsvc/tools/lstoolutil.py
  4. Değişikliğin uygulandığını doğrulayın: grep "decodebytes" /usr/lib/vmware-lookupsvc/tools/lstoolutil.py
  5. Tekrar deneyin.
    Artık hata mesajı alınmadan betik çalışacaktır.
cp /usr/lib/vmware-lookupsvc/tools/lstoolutil.py ~/lstoolutil.bak
sed -i 's/decodestring/decodebytes/g' /usr/lib/vmware-lookupsvc/tools/lstoolutil.py