Kamu SM zaman damgası sunucuları ile iletişim kuran CLI aracı ve Go kütüphanesi. TÜBİTAK BİLGEM tarafından işletilen Kamu SM altyapısı üzerinden RFC 3161 uyumlu zaman damgası almak, bakiye sorgulamak, kimlik doğrulama başlığı üretmek ve zaman damgası doğrulamak için kullanılır.
Go standart kütüphanesi üzerine inşa edilmiştir. Harici bağımlılıklar: golang.org/x/crypto (PBKDF2) ve go.mozilla.org/pkcs7 (doğrulama).
go install github.com/KilimcininKorOglu/kamusm-go@latestYa da kaynak koddan:
git clone https://github.com/KilimcininKorOglu/kamusm-go.git
cd kamusm-go
make buildBinary bin/kamusm-go altında oluşur. Tüm build işlemleri Makefile üzerinden yapılır:
make build # bin/kamusm-go derle
make vet # Statik analiz
make test # build + vet
make install # GOPATH/bin'e kur
make clean # Build çıktılarını temizle
make run ARGS="" # Derle ve çalıştır
make version # Mevcut versiyon
make help # Tüm hedeflergo get github.com/KilimcininKorOglu/kamusm-go/kamusm-zdimport kamusmzd "github.com/KilimcininKorOglu/kamusm-go/kamusm-zd"İlk kullanımda bağlantı bilgilerini kaydedin:
kamusm-go ayar-kaydet \
--sunucu http://zd.kamusm.gov.tr \
--musteri-no 123456 \
--parola "sifre"Sonraki çağrılarda parametre gerekmez:
kamusm-go gonder --dosya belge.pdf --dogrula
kamusm-go bakiyeBaşarılı sonuçta belge_zd.der dosyası oluşur ve KamuSM kök sertifikalarıyla doğrulanır.
package main
import (
"fmt"
"log"
kamusmzd "github.com/KilimcininKorOglu/kamusm-go/kamusm-zd"
)
func main() {
digest, err := kamusmzd.ComputeFileDigest("belge.pdf", "sha256")
if err != nil {
log.Fatal(err)
}
der, _ := kamusmzd.BuildTsaRequest(digest, "sha256")
identity, _ := kamusmzd.BuildIdentity(123456, "sifre", digest, 100)
status, body, err := kamusmzd.SendTimestampRequest("http://zd.kamusm.gov.tr", identity, der)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Durum: %d, PKCS#7: %v\n", status, kamusmzd.IsValidTimestampResponse(body))
}Dosya veya özet değeri için zaman damgası ister.
# Dosyadan
kamusm-go gonder --dosya DOSYA [--hash sha256] [--dogrula]
# Hex özetten
kamusm-go gonder --ozet-hex HEX [--hash sha256]
# Tüm parametreler açık (config kullanmadan)
kamusm-go gonder --sunucu URL --musteri-no ID --parola PAROLA --dosya DOSYA--dosya verildiğinde çıktı girdi dosyasının yanına {ad}_zd.der olarak yazılır. --ozet-hex verildiğinde çalışma dizinine zd_{unix_epoch}.der olarak yazılır (örn. zd_1712400000.der).
--dogrula aktifse kaydedilen dosya otomatik olarak KamuSM kök sertifikalarıyla doğrulanır.
Hesaptaki kalan zaman damgası bakiyesini sorgular.
kamusm-go bakiyeÇıktı:
Yanıt durumu: 200
Kalan zaman damgası bakiyesi: 847
Daha önce alınmış bir zaman damgası dosyasını KamuSM kök sertifikalarına (v4-v7) karşı doğrular.
kamusm-go dogrula --dosya belge_zd.derÇıktı:
Doğrulama başarılı
İmzalayan: Kamu SM Zaman Damgasi Sunucusu S2
PKCS#7 imzası ve sertifika zinciri kontrol edilir. Gömülü kök sertifikalar: Sürüm 4, 5, 6 ve 7.
Sunucuya gönderilecek identity HTTP başlığını üretir. Hata ayıklama ve entegrasyon geliştirme amaçlıdır.
# Hex özetten
kamusm-go kimlik --musteri-no ID --parola PAROLA --ozet-hex HEX
# Zaman damgasından (bakiye sorgusu formatında)
kamusm-go kimlik --musteri-no ID --parola PAROLA --zaman 1712400000000
# Özel iterasyon sayısıyla
kamusm-go kimlik --musteri-no ID --parola PAROLA --ozet-hex HEX --iterasyon 200Bağlantı bilgilerini makine anahtarıyla şifreleyerek ~/.kamusm-go.conf dosyasına kaydeder. Kaydedilen bilgiler diğer komutlarda parametre verilmediğinde otomatik olarak kullanılır.
kamusm-go ayar-kaydet \
--sunucu http://zd.kamusm.gov.tr \
--musteri-no 123456 \
--parola "sifre" \
[--hash sha256] \
[--iterasyon 100]Şifreleme makineye özeldir (hostname + kullanıcı adı + dosyaya özel rastgele salt ile türetilen anahtar). Dosya başka bir makinede çözülemez.
Kayıtlı ayarları görüntüler (parola maskeli).
kamusm-go ayar-gosterÇıktı:
Kayıtlı ayarlar:
Sunucu: http://zd.kamusm.gov.tr
Müşteri No: 123456
Parola: sif****
Hash: sha256
İterasyon: 100
kamusm-go versiyonkimlik, gonder, bakiye ve dogrula komutları --json parametresiyle yapılandırılmış JSON çıktısı verir:
kamusm-go bakiye --json{
"durum": 200,
"bakiye": 847
}kamusm-go dogrula --dosya belge_zd.der --json{
"gecerli": true,
"imzalayan": "Kamu SM Zaman Damgasi Sunucusu S2",
"tarih": "2026-04-06T20:11:36Z"
}Tüm komutlarda ortak (config'den de okunabilir):
| Parametre | Zorunlu | Varsayılan | Açıklama |
|---|---|---|---|
--musteri-no |
Evet* | - | Kamu SM müşteri numarası |
--parola |
Evet* | - | Müşteri parolası |
--iterasyon |
Hayır | 100 | PBKDF2 iterasyon sayısı (en az 1) |
--json |
Hayır | false | JSON formatında çıktı |
*Config dosyası varsa zorunlu değil.
gonder ve bakiye komutlarında ek:
| Parametre | Zorunlu | Açıklama |
|---|---|---|
--sunucu |
Evet* | Sunucu adresi (URL) |
gonder komutuna özel:
| Parametre | Zorunlu | Açıklama |
|---|---|---|
--dosya |
Evet* | Damgalanacak dosya yolu |
--ozet-hex |
Evet* | Önceden hesaplanmış özet (hex) |
--hash |
Hayır | sha1 veya sha256 (varsayılan: sha256) |
--dogrula |
Hayır | Kaydedilen dosyayı otomatik doğrula |
*--dosya veya --ozet-hex parametrelerinden biri sağlanmalıdır.
dogrula komutuna özel:
| Parametre | Zorunlu | Açıklama |
|---|---|---|
--dosya |
Evet | Doğrulanacak .der dosyası |
kimlik ve bakiye komutlarına özel:
| Parametre | Zorunlu | Açıklama |
|---|---|---|
--zaman |
Hayır | Unix zaman damgası, milisaniye (override) |
kamusm-zd paketi aşağıdaki exported API'yi sunar:
| Fonksiyon | Açıklama |
|---|---|
BuildIdentity |
KamuSM identity HTTP başlığı üretir |
BuildTsaRequest |
RFC 3161 TimeStampReq DER yapısı oluşturur |
ComputeFileDigest |
Dosyanın SHA-1 veya SHA-256 özetini hesaplar |
SendTimestampRequest |
Zaman damgası isteği gönderir |
SendCreditRequest |
Bakiye sorgusu gönderir |
IsValidTimestampResponse |
Yanıtta PKCS#7 SignedData OID'si olup olmadığını kontrol eder |
ExtractPkcs7 |
Yanıttan PKCS#7 SignedData yapısını çıkarır |
ExtractTextFromAsn1 |
ASN.1 yapısından okunabilir metin çıkarır |
ParseCreditsFromBody |
Yanıt gövdesinden bakiye sayısını çıkarır |
VerifyTimestamp |
PKCS#7 imzasını KamuSM kök sertifikalarıyla doğrular |
KamusmRootCAs |
KamuSM kök sertifika havuzunu döndürür |
SaveConfig |
Yapılandırmayı şifreli olarak kaydeder |
LoadConfig |
Şifreli yapılandırmayı okur ve çözer |
ConfigPath |
Yapılandırma dosyasının yolunu döndürür |
MaskPassword |
Parolayı maskeli olarak gösterir |
Tipler: ConfigData, VerifyResult, EsyaReqEx
ayar-kaydet komutuyla kaydedilen bilgiler ~/.kamusm-go.conf dosyasında şifreli tutulur. Diğer komutlar çalıştırıldığında eksik parametreler bu dosyadan okunur. CLI parametreleri her zaman config değerlerinin üstüne yazar.
Dosya formatı: salt(16) + iv(16) + AES-256-CBC(JSON). Anahtar, makine kimliğinden (hostname + kullanıcı adı) ve dosyaya özel rastgele salt'tan PBKDF2-SHA256 (100.000 iterasyon) ile türetilir. Dosya 0600 izinleriyle korunur.
Not: v1.1.0 ve sonrası salt mekanizmasını değiştirmiştir. Eski sürümlerle oluşturulan config dosyaları çalışmaz; ayar-kaydet ile yeniden kaydedin.
Kamu SM sunucuları standart RFC 3161 protokolünü kullanır ancak ek olarak özel bir identity HTTP başlığı gerektirir. Bu başlık şu şekilde üretilir:
- 16 byte kriptografik rastgele değer üretilir (hem salt hem IV olarak kullanılır)
- Kullanıcı parolasından PBKDF2-HMAC-SHA256 ile 32 byte AES anahtarı türetilir
- İstek özetiyle (messageImprint) AES-256-CBC şifreleme yapılır
- Sonuç ASN.1 DER formatında kodlanır ve hex string'e dönüştürülür
Her istekte yeni salt/IV üretildiği için aynı parametrelerle bile farklı başlık oluşur.
İstemci, dosyanın SHA-256 (veya SHA-1) özetini hesaplar, RFC 3161 TimeStampReq yapısını DER formatında kodlar ve HTTP POST ile sunucuya gönderir. Yanıtta PKCS#7 SignedData yapısı aranır; bulunursa .der dosyasına kaydedilir.
Gömülü KamuSM kök sertifikaları (Sürüm 4, 5, 6, 7) kullanılarak PKCS#7 imzası ve sertifika zinciri doğrulanır. Bu sayede harici araç gerekmeden zaman damgasının bütünlüğü teyit edilir.
Sunucu hata durumlarında bile HTTP 200 döner. İstemci yanıt gövdesinde PKCS#7 SignedData OID'sini (1.2.840.113549.1.7.2) arar. OID bulunamazsa ASN.1 yapısındaki metin alanları taranarak hata mesajı çıkarılır.
| Mesaj | Sebep |
|---|---|
Account X could not be authenticated |
Hatalı parola veya süresi dolmuş hesap |
User X is not known |
Geçersiz müşteri numarası |
| Bağlantı hatası / timeout | Ağ erişimi, güvenlik duvarı veya sunucu yanıt vermedi (30s zaman aşımı) |
Not enough credit |
Hesapta yeterli zaman damgası bakiyesi yok |
yapılandırma çözülemedi |
Config dosyası eski sürümle oluşturulmuş; ayar-kaydet ile yeniden kaydedin |
- Parola koruması:
--parolaCLI argümanıpsçıktısında görünür. Bunu önlemek içinayar-kaydetile bilgileri bir kez kaydedin, sonraki kullanımlarda parametre gerekmez. - Config şifreleme:
~/.kamusm-go.confdosyası AES-256-CBC ile şifrelenir. Anahtar makine kimliğinden (hostname + kullanıcı adı) ve dosyaya özel rastgele salt'tan türetilir. Dosya 0600 izinleriyle korunur ancak makine kimliğini bilen biri dosyayı çözebilir. - Identity protokolü:
identitybaşlığında salt ve IV aynı değerdir. Bu, Kamu SM protokolünün bir parçasıdır ve değiştirilemez. Varsayılan PBKDF2 iterasyon sayısı 100'dür (protokol gereği).--iterasyonen az 1 olmalıdır; 0 veya negatif değerler reddedilir.
- Go 1.22 veya üzeri
- Make
- Geçerli Kamu SM hesabı
- Sunucuya ağ erişimi (varsayılan port 80)