Modern yazılım geliştirmede CI/CD pipeline vazgeçilmez. Ancak build çıktılarının kod imzalama ile güvenliğini sağlamak da aynı derecede kritik. Cloud Code Signing, pipeline entegrasyonunu mümkün kılıyor.
Neden CI/CD Pipeline'da İmzalama?
- Otomasyon: Her build otomatik imzalanır, manuel süreç yok
- Tutarlılık: Tüm çıktılar standart şekilde imzalanır
- Güvenlik: İmzalama adımı atlanamaz
- Hız: Build-sign-deploy süreci dakikalar içinde tamamlanır
- Denetim: Her imzalama loglanır ve izlenebilir
Cloud Code Signing Pipeline Mimarisi
Tipik bir pipeline akışı:
- Source: Kod değişikliği commit/push edilir
- Build: Uygulama derlenir, çıktı oluşur
- Test: Otomatik testler çalışır
- Sign: Build çıktıları cloud signing ile imzalanır
- Verify: İmzalar doğrulanır
- Deploy: İmzalı çıktılar dağıtılır
GitHub Actions Entegrasyonu
name: Build, Sign and Release
on:
push:
tags: ['v*']
jobs:
build-sign-release:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Build
run: dotnet publish -c Release -o ./publish
- name: Install Signing Client
run: |
# DigiCert KeyLocker client kurulumu
Invoke-WebRequest -Uri ${{ secrets.SM_TOOLS_URL }} -OutFile smtools.msi
Start-Process msiexec -ArgumentList "/i smtools.msi /quiet" -Wait
- name: Configure Signing
env:
SM_HOST: ${{ secrets.SM_HOST }}
SM_API_KEY: ${{ secrets.SM_API_KEY }}
SM_CLIENT_CERT_FILE: ${{ secrets.SM_CLIENT_CERT }}
SM_CLIENT_CERT_PASSWORD: ${{ secrets.SM_CLIENT_CERT_PW }}
run: smctl windows certsync
- name: Sign Executables
run: |
Get-ChildItem ./publish -Filter *.exe | ForEach-Object {
signtool sign /sha1 ${{ secrets.CERT_THUMBPRINT }} `
/tr http://timestamp.digicert.com /td sha256 /fd sha256 /v $_.FullName
}
- name: Verify Signatures
run: |
Get-ChildItem ./publish -Filter *.exe | ForEach-Object {
signtool verify /pa /v $_.FullName
}
Azure DevOps Pipeline
# azure-pipelines.yml
trigger:
tags:
include: ['v*']
pool:
vmImage: 'windows-latest'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
arguments: '-c Release -o $(Build.ArtifactStagingDirectory)'
- task: PowerShell@2
displayName: 'Sign Executables'
inputs:
targetType: 'inline'
script: |
# Signing client yapılandırma
$env:SM_API_KEY = "$(SM_API_KEY)"
smctl windows certsync
# Tüm exe dosyalarını imzala
Get-ChildItem $(Build.ArtifactStagingDirectory) -Filter *.exe | ForEach-Object {
signtool sign /sha1 $(CERT_THUMBPRINT) /tr http://timestamp.digicert.com /td sha256 /fd sha256 /v $_.FullName
}
Jenkins Pipeline
// Jenkinsfile
pipeline {
agent { label 'windows' }
stages {
stage('Build') {
steps {
bat 'dotnet publish -c Release -o publish'
}
}
stage('Sign') {
steps {
withCredentials([
string(credentialsId: 'sm-api-key', variable: 'SM_API_KEY'),
string(credentialsId: 'cert-thumbprint', variable: 'THUMBPRINT')
]) {
powershell '''
Get-ChildItem ./publish -Filter *.exe | ForEach-Object {
signtool sign /sha1 $env:THUMBPRINT /tr http://timestamp.digicert.com /td sha256 /fd sha256 /v $_.FullName
}
'''
}
}
}
}
}
Güvenlik En İyi Pratikleri
| Pratik | Açıklama |
|---|---|
| Secret Management | API key ve sertifika bilgilerini pipeline secret'larında saklayın |
| IP Kısıtlama | İmzalama API erişimini CI/CD runner IP aralığına sınırlayın |
| İmza Doğrulama | Her imzalama sonrası otomatik doğrulama adımı ekleyin |
| Audit Log | İmzalama geçmişini izleyin ve anomalilere alarm kurun |
| Least Privilege | CI/CD service account yalnızca imzalama yetkisine sahip olsun |
Sıkça Sorulan Sorular (FAQ)
Certum SimplySign CI/CD pipeline'da kullanılabilir mi?
Certum SimplySign her imzalama için mobil onay istediği durumlarda CI/CD otomasyonu kısıtlanabilir. Tam otomasyon için DigiCert KeyLocker veya PKCS#11 tabanlı çözümler daha uygun olabilir. Bununla birlikte Certum API entegrasyonu gelişmektedir.
Pipeline'da imzalama ne kadar süre ekler?
Hash hesaplama ve API çağrısı genellikle dosya başına 5-15 saniye sürer. 10 dosyalık tipik bir build için toplam 1-2 dakika ek süre beklenir.
Yorumlar
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yaz