Jenkins, kod imzalama için en esnek ama en kolay yanlış yapılandırılan CI araçlarından biridir; çünkü imzalama kimlik bilgileri ve ajanlar üzerinde tam kontrol sizdedir. Doğru kurgu, imzalama işini yalnızca etiketli sürümlerde ve ayrılmış bir ajan üzerinde çalıştırmaktır.
Ön koşullar
- Windows ajanında Windows SDK içindeki
signtool.exekurulu olmalı. - Sertifika anahtarı token, akıllı kart veya HSM üzerinde olmalı; ajan etiketi örneğin
signingolarak verilmeli. - Token PIN'i veya parolası Jenkins Credentials deposunda tutulmalı, Jenkinsfile içine yazılmamalı.
Declarative Pipeline örneği
pipeline {
agent { label 'windows && signing' }
stages {
stage('Build') {
steps { bat 'dotnet publish -c Release -o out' }
}
stage('Sign') {
when { buildingTag() }
steps {
withCredentials([string(credentialsId: 'codesign-thumbprint', variable: 'THUMB')]) {
bat 'signtool sign /sha1 %THUMB% /fd SHA256 /tr http://time.certum.pl /td SHA256 out\\app.exe'
}
bat 'signtool verify /pa /v out\\app.exe'
}
}
}
post { always { cleanWs() } }
}
withCredentials değeri log'larda maskelenir; yine de echo ile yazdırmayın. PIN gerektiren kurulumlarda, token yazılımının önbelleğe alma ayarını kullanmak ya da imzalama sunucusunu kullanıcı oturumu açık bir servis hesabıyla çalıştırmak gerekebilir; ayrıntı token üreticisine bağlıdır.
Güvenlik
- Jenkinsfile'ı değiştirebilenleri sınırlayın; imzalama aşamasını yalnızca korumalı dalda çalıştırın.
- Ajan çalışma alanını iş sonunda temizleyin.
- Jenkins erişim loglarını ve kimlik bilgisi kullanımını düzenli gözden geçirin.
- Bulut HSM kullanıyorsanız Certum bulut kod imzalama akışında anahtar dışarı çıkmaz.
Sertifika seçimi ve EV/OV farkı için kod imzalama sertifikaları sayfasına bakabilirsiniz. Kural basit: derleme herkesin, imza yalnızca yetkili hattın işidir.
Hata ayıklama
Ajan servis hesabı olarak çalışıyorsa token PIN penceresi açılamayabilir ve imzalama sessizce takılabilir; bu durumda token yazılımının PIN önbelleği ayarlarını inceleyin veya ajanı etkileşimli oturumda çalıştırın. Hata mesajında sertifikanın bulunamadığı yazıyorsa, sertifikanın hangi kullanıcı mağazasında olduğunu certutil -store My ile kontrol edin. Pipeline günlüklerini kısa süre saklayın ve içinde hassas bilgi kalmadığını denetleyin.
- Jenkins eklentilerini güncel tutun.
- Yönetici erişimini ve kimlik bilgisi düzenlemelerini sınırlayın.