CI/CD pipeline'da kod imzalama otomasyonu, modern yazılım geliştirme sürecinin vazgeçilmez bir parçasıdır. Her build'de yazılımınızı otomatik olarak imzalamak, hem güvenliği artırır hem de insan hatasını ortadan kaldırır. Bu rehberde GitHub Actions, Jenkins ve Azure DevOps platformlarında kod imzalama entegrasyonunu anlatıyoruz.
CI/CD'de Kod İmzalamanın Avantajları
- Tutarlılık: Her build aynı standartta imzalanır
- Hız: Manuel imzalama ihtiyacı ortadan kalkar
- Güvenlik: Sertifika anahtarları güvenli vault'larda saklanır
- İzlenebilirlik: Her imzalama işlemi loglanır
- Uyumluluk: Compliance gereksinimleri otomatik karşılanır
Ön Koşullar
CI/CD pipeline'da kod imzalama için şunlar gereklidir:
- Cloud HSM tabanlı sertifika: USB Token CI/CD ortamında kullanılamaz
- Güvenli secret yönetimi: PFX şifreleri veya API anahtarları vault'ta saklanmalı
- SignTool veya platform aracı: Build agent'ta yüklü olmalı
- Timestamp sunucusu erişimi: Build agent internete erişebilmeli
GitHub Actions ile Kod İmzalama
Sertifikayı GitHub Secrets'a Ekleyin
PFX sertifikanızı Base64'e dönüştürün ve GitHub Secret olarak saklayın:
# PFX'i Base64'e dönüştür
base64 -i sertifika.pfx -o sertifika_base64.txt
GitHub repository Settings → Secrets → Actions → New secret:
SIGNING_CERTIFICATE: Base64 encoded PFX içeriğiSIGNING_PASSWORD: PFX şifresi
Workflow YAML Dosyası
name: Build and Sign
on: [push, pull_request]
jobs:
build-and-sign:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: dotnet build --configuration Release
- name: Decode Certificate
run: |
$cert = [System.Convert]::FromBase64String("${{ secrets.SIGNING_CERTIFICATE }}")
[IO.File]::WriteAllBytes("cert.pfx", $cert)
- name: Sign Binary
run: |
signtool sign /f cert.pfx /p "${{ secrets.SIGNING_PASSWORD }}" /tr http://timestamp.digicert.com /td sha256 /fd sha256 "bin\Release\app.exe"
- name: Verify Signature
run: signtool verify /pa "bin\Release\app.exe"
- name: Cleanup
if: always()
run: Remove-Item cert.pfx -ErrorAction SilentlyContinue
Jenkins Pipeline ile Kod İmzalama
pipeline {
agent { label 'windows' }
environment {
PFX_PASSWORD = credentials('code-signing-password')
}
stages {
stage('Build') {
steps {
bat 'dotnet build --configuration Release'
}
}
stage('Sign') {
steps {
withCredentials([file(credentialsId: 'code-signing-cert', variable: 'PFX_PATH')]) {
bat """
signtool sign /f "%PFX_PATH%" /p "%PFX_PASSWORD%" ^
/tr http://timestamp.digicert.com /td sha256 /fd sha256 ^
"bin\Release\app.exe"
"""
}
}
}
stage('Verify') {
steps {
bat 'signtool verify /pa "bin\Release\app.exe"'
}
}
}
}
Azure DevOps Pipeline ile Kod İmzalama
trigger:
- main
pool:
vmImage: 'windows-latest'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'build'
arguments: '--configuration Release'
- task: DownloadSecureFile@1
name: signingCert
inputs:
secureFile: 'code-signing.pfx'
- script: |
signtool sign /f "$(signingCert.secureFilePath)" /p "$(PFX_PASSWORD)" /tr http://timestamp.digicert.com /td sha256 /fd sha256 "$(Build.SourcesDirectory)\bin\Release\app.exe"
displayName: 'Sign Binary'
- script: |
signtool verify /pa "$(Build.SourcesDirectory)\bin\Release\app.exe"
displayName: 'Verify Signature'
Cloud HSM ile CI/CD Entegrasyonu
Cloud HSM kullanarak PFX dosyası pipeline'a aktarmak zorunda kalmadan imzalama yapabilirsiniz:
DigiCert KeyLocker
# KeyLocker CLI ile imzalama
smctl sign --keypair-alias "my-key" --input app.exe --output app_signed.exe
Certum SimplySign
SimplySign Desktop agent build agent üzerinde çalıştırılarak standart SignTool komutu ile imzalama yapılır.
Güvenlik En İyi Uygulamaları
- Sertifika dosyasını repo'ya eklemeyin — her zaman secret/vault kullanın
- İmzalama sonrası PFX dosyasını temizleyin —
always()bloğunda silme işlemi yapın - En az yetki prensibi: İmzalama secret'larına sadece gerekli pipeline'lar erişebilmeli
- Audit log aktif edin: Tüm imzalama işlemlerini kayıt altına alın
- Cloud HSM tercih edin: PFX dosyası yerine API tabanlı imzalama daha güvenlidir
Sık Sorulan Sorular
USB Token ile CI/CD pipeline'da imzalama yapabilir miyim?
USB Token fiziksel bağlantı gerektirdiğinden standart CI/CD ortamlarında kullanılamaz. Cloud HSM (DigiCert KeyLocker, Certum SimplySign, Azure Key Vault) veya PFX tabanlı çözümler kullanmanız gerekir.
PFX dosyasını pipeline'da güvenle nasıl saklarım?
GitHub Secrets, Jenkins Credentials, Azure DevOps Secure Files gibi platform sağlanan secret yönetim araçlarını kullanın. PFX dosyasını Base64 olarak encode edip secret olarak saklayabilirsiniz. Pipeline tamamlandığında dosyayı silmeyi unutmayın.
Yorumlar
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yaz