Cloud Kod İmzalama platformlarının en güçlü özelliklerinden biri, API tabanlı otomatik imzalama desteğidir. Bu rehberde, cloud signing API ile nasıl programatik olarak kod imzalama yapacağınızı, CI/CD entegrasyon örneklerini ve güvenli API kullanımı pratiklerini anlatıyoruz.
Cloud Signing API Genel Akış
Cloud signing API ile imzalama süreci 4 temel adımdan oluşur:
- Kimlik Doğrulama: API anahtarı veya OAuth token ile yetkilendirme
- Hash Gönderimi: İmzalanacak dosyanın hash değerinin API endpoint gönderilmesi
- İmzalama Onayı: HSM üzerinde hash imzalama (bazı platformlarda 2FA onayı)
- İmza Alımı: İmzalanmış hash veya PKCS#7 signature dosyasının alınması
Platform API Karşılaştırması
| Özellik | DigiCert KeyLocker | Sectigo CodeSignTrust | Certum SimplySign |
|---|---|---|---|
| API Tipi | REST + PKCS11 | REST + CLI | REST |
| Kimlik Doğrulama | API Key + Client Cert | API Key + OAuth | OAuth 2.0 + mOTP |
| Batch İmzalama | Evet | Evet | Sınırlı |
| Rate Limit | 1000/gün | 500/gün | 100/gün |
| Webhook | Evet | Evet | Hayır |
| SDK | Python, Java, .NET | Python, Node.js | Java |
API Kullanım Örnekleri
Örnek 1: REST API ile Hash İmzalama (Genel Akış)
# 1. Dosyanın SHA-256 hash hesapla
$hash = (Get-FileHash -Algorithm SHA256 .\myapp.exe).Hash
# 2. API ile imzalama isteği gönder
$headers = @{
"Authorization" = "Bearer YOUR_API_TOKEN"
"Content-Type" = "application/json"
}
$body = @{
"hash" = $hash
"algorithm" = "SHA256"
"credential_id" = "YOUR_CREDENTIAL_ID"
} | ConvertTo-Json
$response = Invoke-RestMethod -Uri "https://api.provider.com/v1/sign" -Method POST -Headers $headers -Body $body
# 3. İmza yanıtını al
$signature = $response.signature
Örnek 2: DigiCert KeyLocker PKCS11
# smctl yapılandırma
smctl credentials list
# SignTool ile PKCS11 üzerinden imzalama
# (KeyLocker PKCS11 kütüphanesi SignTool'a entegre edilir)
signtool sign /sha1 CERT_FINGERPRINT /tr http://timestamp.digicert.com /td sha256 /fd sha256 myapp.exe
Örnek 3: Python ile Otomatik İmzalama Script
import hashlib
import requests
import subprocess
import os
class CloudSigner:
def __init__(self, api_url, api_key, credential_id):
self.api_url = api_url
self.headers = {"Authorization": f"Bearer {api_key}"}
self.credential_id = credential_id
def sign_file(self, filepath):
# Hash hesapla
sha256 = hashlib.sha256()
with open(filepath, "rb") as f:
for chunk in iter(lambda: f.read(4096), b""):
sha256.update(chunk)
# API isteği
payload = {
"hash": sha256.hexdigest(),
"algorithm": "SHA256",
"credential_id": self.credential_id
}
response = requests.post(
f"{self.api_url}/sign",
json=payload,
headers=self.headers,
timeout=30
)
response.raise_for_status()
return response.json()["signature"]
# Kullanım
signer = CloudSigner(
api_url=os.environ["SIGN_API_URL"],
api_key=os.environ["SIGN_API_KEY"],
credential_id=os.environ["SIGN_CREDENTIAL_ID"]
)
result = signer.sign_file("build/output/myapp.exe")
print(f"Signed: {result[:32]}...")
CI/CD Entegrasyon Örnekleri
GitHub Actions
name: Build and Sign
on:
push:
tags: ['v*']
jobs:
build-sign:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Build
run: dotnet publish -c Release -o ./publish
- name: Install Cloud Signing Client
run: choco install digicert-keylocker-tools -y
- name: Configure KeyLocker
env:
SM_API_KEY: ${{ secrets.SM_API_KEY }}
SM_CLIENT_CERT: ${{ secrets.SM_CLIENT_CERT_B64 }}
run: |
echo $env:SM_CLIENT_CERT | base64 -d > client.p12
smctl credentials configure
- name: Sign Executables
run: |
Get-ChildItem ./publish -Include *.exe,*.dll -Recurse | ForEach-Object {
signtool sign /sha1 $env:CERT_FINGERPRINT /tr http://timestamp.digicert.com /td sha256 /fd sha256 $_.FullName
}
- name: Verify Signatures
run: |
Get-ChildItem ./publish -Include *.exe,*.dll -Recurse | ForEach-Object {
signtool verify /pa $_.FullName
}
Jenkins Pipeline
pipeline {
agent { label 'windows' }
environment {
SIGN_API_KEY = credentials('cloud-sign-api-key')
CERT_FINGERPRINT = credentials('cert-fingerprint')
}
stages {
stage('Build') {
steps { bat 'msbuild /p:Configuration=Release' }
}
stage('Sign') {
steps {
bat """
signtool sign /sha1 %CERT_FINGERPRINT% ^
/tr http://timestamp.digicert.com ^
/td sha256 /fd sha256 ^
bin\\Release\\*.exe bin\\Release\\*.dll
"""
}
}
stage('Verify') {
steps { bat 'signtool verify /pa bin\\Release\\*.exe' }
}
}
}
API Güvenlik En İyi Pratikleri
- Secrets yönetimi: API anahtarlarını asla kaynak kodda saklamayın. CI/CD platform secrets veya vault kullanın.
- IP kısıtlaması: API erişimini yalnızca CI/CD sunucu IP adreslerine kısıtlayın.
- Minimum yetki: API anahtarına yalnızca imzalama yetkisi verin, yönetim yetkisi vermeyin.
- Rate limiting: İmzalama isteklerini makul bir seviyede tutun.
- Denetim: API kullanım loglarını düzenli olarak inceleyin.
Sıkça Sorulan Sorular (FAQ)
API ile imzalama dosyamı sunucuya yükler mi?
Hayır, çoğu cloud signing API yalnızca hash değerini alır ve imzalar. Dosyanın kendisi hiçbir zaman sunucuya gönderilmez. Bu, hem gizliliği hem de performansı korur.
API rate limiti aşarsam ne olur?
Rate limit aşıldığında HTTP 429 (Too Many Requests) yanıtı alırsınız. Büyük projelerde rate limitin yeterliliğini sağlayıcınızla görüşün. Enterprise planlarda genellikle daha yüksek limitler mevcuttur.
API anahtarım çalınırsa ne olur?
2FA etkinse, API anahtarı tek başına yetersizdir. 2FA olmadan çalışıyorsanız, derhal sağlayıcınıza başvurun ve API anahtarını iptal edin. IP kısıtlaması ve düzenli anahtar rotasyonu bu riski minimize eder.
Yorumlar
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yaz