Kendinden imzalı bir sertifika, bir sertifika yetkilisinden satın almak yerine kendinize verdiğiniz bir sertifikadır. Tarayıcılar buna otomatik olarak güvenmez, bu nedenle herkese açık bir web sitesinde yeri yoktur, ancak bir geliştirme makinesine, bir hazırlık (staging) sunucusuna, dahili bir kontrol paneline veya açık internete asla açılmayan herhangi bir hizmete HTTPS eklemenin en hızlı yoludur.
Bu kılavuz, Windows, Linux ve macOS üzerinde OpenSSL ile kendinden imzalı sertifika nasıl oluşturulur göstermektedir. Komut üçünde de aynıdır. Ayrıca oluşturduğunuz sertifikanın gerçekten kullanılabilir olduğunu nasıl kontrol edeceğinizi ve tarayıcı uyarılarının kaybolması için kendi makinenizin ona nasıl güvenmesini sağlayacağınızı da göreceksiniz.
Kendinden imzalı sertifika nedir
Kendinden imzalı sertifika, güvenilir bir sertifika yetkilisi (CA) tarafından değil, kendi özel anahtarıyla imzalanmış dijital bir sertifikadır. Kriptografik olarak normal bir X.509 sertifikasıdır: trafiği satın alınmış bir sertifika kadar iyi şifreler. Eksik olan şey güven zinciridir. Kendi makineniz dışında hiçbir şeyin ona güvenmesi için bir nedeni yoktur, bu nedenle siz aksini belirtene kadar tarayıcılar bir uyarı gösterir.
Bu da kendinden imzalı sertifikaları şunlar için uygun kılar:
- Yerel geliştirme, çerezlerin, hizmet çalışanlarının (service worker) veya bir ödeme SDK’sının üretim ortamında olacağı gibi davranması için HTTPS’e ihtiyacınız olan durumlar.
- Dahili hizmetler, örneğin bir intranet kontrol paneli, bir izleme paneli veya özel bir ağdaki bir cihaz yönetim arayüzü gibi.
- Test ve hazırlık (staging), bir TLS yapılandırmasını bir sertifika harcamadan denemek istediğiniz durumlar.
- Bir proxy arkasındaki köken sunucular, örneğin Full modundaki Cloudflare gibi, arka uç bağlantısında güvenilmeyen bir sertifikayı kabul eden.
Gerçek bir ziyaretçinin yükleyeceği herhangi bir şey için yanlış araçtır. Bu ayrımı, “ne zaman kullanılmamalı” bölümünde daha ayrıntılı olarak ele alıyoruz.
Başlamadan önce: OpenSSL’inizi kontrol edin
OpenSSL komut satırı aracına ihtiyacınız var. Elinizde ne olduğunu doğrulayın:
openssl version
- Linux: OpenSSL çoğu dağıtımda önceden yüklüdür. Değilse, Ubuntu’da OpenSSL nasıl yüklenir kılavuzumuza bakın.
- Windows: OpenSSL dahil değildir. Windows’ta OpenSSL nasıl yüklenir talimatlarımızı izleyin, ardından komutu Komut İstemi’nden veya PowerShell’den çalıştırın.
- macOS: Apple, dahili openssl komutu olarak OpenSSL’in bir çatalı olan LibreSSL‘i gönderir, bu nedenle bu komut bir OpenSSL sürümü yerine LibreSSL 3.3.6 gibi bir şey döndürür.
Bu kılavuzdaki ana komut, mevcut OpenSSL’de olduğu gibi LibreSSL 3.3.6’da da çalışır, dolayısıyla Mac kullanıcıları dahili aracı kullanabilir. Aşağıdaki isteğe bağlı komutlardan bazıları için gerekli olduğundan, gerçek OpenSSL’e sahip olmayı tercih ederseniz, Homebrew paket yöneticisiyle kurun ve tam yolunu kullanarak çağırın:
brew install openssl@3
/opt/homebrew/opt/openssl@3/bin/openssl version
Intel Mac’lerde yol bunun yerine /usr/local/opt/openssl@3/bin/openssl‘dir. Çıktıyı okuma hakkında daha fazla ayrıntı için OpenSSL sürümünüzü nasıl kontrol edersiniz kılavuzumuza bakın.
OpenSSL ile kendinden imzalı sertifika nasıl oluşturulur
Adım 1: Bir terminal açın
Linux’ta, Ctrl + Alt + T tuşlarına basın veya uygulamalar menünüzde “Terminal” arayın. macOS’ta, Uygulamalar‘ı açın, ardından Yardımcı Programlar‘ı, ardından Terminal‘i açın veya Cmd + Boşluk tuşlarına basıp “Terminal” yazın. Windows’ta, Win + R tuşlarına basın, cmd yazın ve Enter’a basın.

Adım 2: Dosyaların olmasını istediğiniz klasöre gidin
OpenSSL çıktısını, OpenSSL’in kurulu olduğu dizine değil, o an içinde bulunduğunuz dizine yazar. Bu sertifika için bir klasör oluşturun ve içine geçin, böylece anahtar ve sertifika bulabileceğiniz bir yere gitsin:
mkdir my-cert
cd my-cert
Windows’ta, Komut İstemi’nde aynı iki komutu kullanın. Komutları OpenSSL program klasörünün içinden çalıştırmayın: Windows’ta bu dizin genellikle normal bir kullanıcı tarafından yazılabilir değildir ve anahtarlarınızı ikili dosyalarla karıştırmak onları kolayca kaybetmenize yol açar.
Adım 3: Sertifika komutunu çalıştırın
Bu tek komut, özel anahtarı ve kendinden imzalı sertifikayı birlikte oluşturur. example.com ve www.example.com‘u hizmetinize gerçekte hangi adlarla ulaşılacaksa onlarla değiştirin:
openssl req -x509 -newkey rsa:2048 -keyout private.key -out certificate.crt -days 365 -nodes -addext "subjectAltName=DNS:example.com,DNS:www.example.com" -addext "basicConstraints=critical,CA:FALSE" -addext "extendedKeyUsage=serverAuth"
Bunu tek bir satırda tutun. Komut İstemi ve Unix kabukları farklı satır sürdürme karakterleri kullanır ve tek bir satır her yerde çalışır. Aynı nedenle çift tırnak kullanın, tek tırnak değil: Komut İstemi tek tırnakları tırnak işareti olarak kabul etmez.
Her bir parçanın ne yaptığı şöyle:
- req -x509: bir sertifika imzalama isteği yerine bitmiş, imzalı bir sertifika üretir.
- -newkey rsa:2048: aynı komutun bir parçası olarak yeni bir 2048 bit RSA özel anahtarı oluşturur. 2048 bit mevcut minimum değerdir ve mantıklı bir varsayılandır. Politikanız daha büyük bir anahtar gerektiriyorsa, daha yavaş el sıkışmalar (handshake) karşılığında rsa:4096 kullanın.
- -keyout private.key: özel anahtar için dosya adı.
- -out certificate.crt: sertifika için dosya adı.
- -days 365: sertifikanın ne kadar süre geçerli kalacağı. Bunu değiştirmeden önce aşağıdaki geçerlilik bölümüne bakın.
- -nodes: özel anahtarı şifrelenmemiş bırakır, böylece web sunucunuz bir insanın parola girmesine gerek kalmadan başlayabilir.
- -addext “subjectAltName=…”: sertifikanın geçerli olduğu ana bilgisayar adları listesi. Bu olmadan, sertifika hiçbir şeyle eşleşmez.
- -addext “basicConstraints=critical,CA:FALSE”: sertifikayı bir sertifika yetkilisi yerine bir uç varlık (sunucu) sertifikası olarak işaretler.
- -addext “extendedKeyUsage=serverAuth”: sertifikanın bir TLS sunucusunu doğrulamak için olduğunu belirtir. Apple platformları bunu zorunlu olarak kabul eder.

Üç -addext seçeneği neden önemlidir
Bu üç bayrak, çalışan bir sertifika ile istemcilerin tamamen reddettiği bir sertifika arasındaki farktır. Anlamaya değerdir, çünkü bunlar olmadan oluşturulan bir kendinden imzalı sertifika, teşhisi kolay olmayan üç şekilde başarısız olur.
Subject Alternative Name, ana bilgisayar adlarının yaşadığı yerdir. Tarayıcılar yıllar önce Common Name alanını okumayı bıraktı ve şimdi ana bilgisayar adını yalnızca Subject Alternative Name (SAN) uzantısıyla eşleştiriyor. SAN’ı olmayan bir sertifika, Common Name ne kadar doğru görünse de hiçbir siteyle eşleşmez. Kullanacağınız her adı virgülle ayırarak listeleyin. Yerel bir hizmet için bir IP adresi de ekleyebilirsiniz:
-addext "subjectAltName=DNS:localhost,DNS:dev.example.com,IP:127.0.0.1"
CA:FALSE olmadan, OpenSSL size bir CA sertifikası oluşturur. req -x509 kendi varsayılanlarına bırakıldığında, basicConstraints’i critical, CA:TRUE olarak ayarlar, bu da bir web sunucusunu değil bir sertifika yetkilisini tanımlar. Chrome ve Safari bunu bir sunucu sertifikasında kabul eder. Firefox etmez ve MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY hatasıyla durur. Yine de Gelişmiş’e tıklayıp bir istisna ekleyebilirsiniz, ancak zaten hatalı biçimlendirilmiş olduğunu bildiğiniz bir sertifika için bir geçici çözüm uygulamış olursunuz ve diğer istemciler çizgiyi farklı yerlerde çizer. basicConstraints=critical,CA:FALSE geçirmek bu durumu başından önler.
macOS’un gönderdiği LibreSSL derlemesi burada farklı davranır: kendi varsayılanlarına bırakıldığında, hiçbir uzantı içermeyen bir X.509 sürüm 1 sertifikası yazar, dolayısıyla CA:TRUE probleminiz olmaz ama Subject Alternative Name’iniz de olmaz. Uzantıları açıkça sağlamak, her iki araçta da size aynı, doğru sertifikayı verir.
serverAuth olmadan, Apple platformları sertifikayı reddeder. Apple’ın güvenilir sertifikalar için yayınlanmış gereksinimleri, bir TLS sunucu sertifikasının id-kp-serverAuth OID’sini içeren bir ExtendedKeyUsage uzantısı taşıması gerektiğini belirtir. Bu olmadan bir sertifika, sertifika kendi güven kökeni olarak sağlansa bile, TLS politikası altında macOS sertifika doğrulamasında “Invalid Extended Key Usage for policy” mesajıyla başarısız olur. Firefox ve Chrome daha esnektir ve bir sunucu sertifikasında eksik ExtendedKeyUsage’ı izin verilen bir durum olarak ele alır, dolayısıyla bu bir Mac veya iPhone bağlanmayan cihaz olana kadar gözden kaçması kolay bir sorundur. extendedKeyUsage=serverAuth eklemek diğer platformlarda hiçbir bedele mal olmaz ve kamuya açık bir CA’nın da zaten vereceği şeydir.
Adım 4: Sertifika ayrıntılarını doldurun
OpenSSL, Distinguished Name’i oluşturan alanları sorar. Herhangi birini atlamak için Enter’a basın, ancak en az birini doldurun ve bunu Common Name olarak yapın. macOS’taki LibreSSL derlemesi, tüm alanları boş bırakırsanız “error, no objects specified in config file” hatasıyla durur ve hiçbir şey yazmaz. Aşağıdaki değerler örnektir, kendi değerlerinizi kullanın:

- Country Name: ülkeniz için iki harfli kod, örneğin US.
- State or Province Name: tam olarak yazılmış, örneğin California.
- Locality Name: şehriniz, örneğin San Jose.
- Organization Name: şirketinizin veya projenizin adı, örneğin Example Inc.
- Organizational Unit Name: sorumlu ekip, örneğin IT.
- Common Name: ana ana bilgisayar adı, örneğin example.com. Subject Alternative Name listesinde ilk sıraya koyduğunuz adla aynı adı kullanın.
- Email Address: bir iletişim adresi, örneğin [email protected]. İsteğe bağlıdır.
Burada gerçekten önemli olan sadece Common Name’dir, ve bu da sadece bir etiket olarak: ana bilgisayar adı eşleşmesi, komut satırında zaten ayarladığınız Subject Alternative Name ile yapılır. Diğer her şey açıklayıcıdır.
Komutun asla bir challenge password sormadığını fark edeceksiniz. Bu istem sertifika imzalama isteklerine aittir ve CA’ların genellikle görmezden geldiği veya reddettiği artık kullanılmayan (vestigial) bir alandır. Bu komut bir istek yerine bitmiş bir sertifika ürettiğinden, istem hiç görünmez.
Adım 5: Kullanmadan önce sertifikayı doğrulayın
Bunu atlamayın. Kendinden imzalı bir sertifika başarıyla oluşturulabilir ve hâlâ kullanılamaz olabilir, ve başarısızlık ancak daha sonra bir tarayıcı hatası olarak kendini gösterir. Sertifikayı geri okuyun:
openssl x509 -in certificate.crt -noout -text
X509v3 extensions bloğunda tam olarak üç şeye bakıyorsunuz:
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Extended Key Usage:
TLS Web Server Authentication
Subject Alternative Name satırı eksikse, sertifika hiçbir ana bilgisayar adıyla eşleşmeyecektir. Basic Constraints CA:TRUE diyorsa, Firefox bunda duracaktır. Extended Key Usage satırı eksikse, Apple platformları sertifikayı reddedecektir. Bu durumların herhangi birinde, iki dosyayı silin ve üç -addext seçeneğinin tümü mevcutken komutu yeniden çalıştırın.
OpenSSL 3.x’te, sertifikanın tamamını okumak yerine sadece bu uzantıları isteyebilirsiniz:
openssl x509 -in certificate.crt -noout -ext subjectAltName,basicConstraints,extendedKeyUsage
-ext bayrağı, macOS’un gönderdiği LibreSSL derlemesinde mevcut değildir; “unknown option -ext” hatası verir. Standart bir Mac’te, yukarıdaki -text sürümünü kullanın.
Sertifika ve anahtarın birbirine ait olduğunu doğrulamak için modüllerini karşılaştırın. İki komut aynı özeti (hash) yazdırmalıdır:
openssl x509 -noout -modulus -in certificate.crt | openssl md5
openssl rsa -noout -modulus -in private.key | openssl md5

Sertifikanın kendisi bir metin dosyasıdır. Bir metin düzenleyicide açtığınızda, BEGIN CERTIFICATE ve END CERTIFICATE satırları arasında bir base64 bloğu görürsünüz, bu da dosya yüklemesi yerine sertifika isteyen kontrol panellerine yapıştırdığınız şeydir.
Komutta varyasyonlar
Herhangi bir istem olmadan oluşturun
Betikler ve CI hatları için, Distinguished Name’i -subj ile sağlayın ve komut denetimsiz çalışır:
openssl req -x509 -newkey rsa:2048 -keyout private.key -out certificate.crt -days 365 -nodes -subj "/C=US/ST=California/L=San Jose/O=Example Inc/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:www.example.com" -addext "basicConstraints=critical,CA:FALSE" -addext "extendedKeyUsage=serverAuth"
RSA yerine bir EC anahtarı kullanın
Eliptik eğri anahtarları, eşdeğer güçte RSA’dan daha küçük ve daha hızlıdır ve her güncel tarayıcı bunları destekler. P-256 standart seçimdir:
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -keyout private.key -out certificate.crt -days 365 -nodes -addext "subjectAltName=DNS:example.com,DNS:www.example.com" -addext "basicConstraints=critical,CA:FALSE" -addext "extendedKeyUsage=serverAuth"
Sonuç, ecdsa-with-SHA256 ile imzalanır. EC desteğinden bazen yoksun olan eski gömülü istemcileri veya eski Java sürümlerini desteklemek zorundaysanız RSA’da kalın.
Bunun için gerçek OpenSSL kullanın. macOS’taki LibreSSL derlemesi komutu kabul eder, ancak eğriyi sertifikaya standart P-256 tanımlayıcısı yerine tam bir açık parametre kümesi olarak yazar. RFC 5480, açık formun sertifikalarda kullanılmaması gerektiğini belirtir ve macOS’un kendisi bu şekilde kodlanmış bir sertifikayı reddeder.
Sonucu openssl x509 -in certificate.crt -noout -text ile kontrol edin: Prime, A, B ve Generator listeleyen bir blok değil, “ASN1 OID: prime256v1” yazan bir satır görmek istiyorsunuz. Standart bir Mac’te, yukarıdaki RSA komutunu kullanın veya önce Homebrew üzerinden OpenSSL kurun.
-nodes mi yoksa -noenc mi?
Her iki bayrak da aynı şeyi yapar: OpenSSL’in özel anahtarı bir parolayla şifrelemesini durdururlar. OpenSSL 3.x, daha açık ad olarak -noenc‘i ekledi ve -nodes‘u kullanımdan kaldırılmış olarak listeler, ancak yine de kabul eder. macOS’un gönderdiği LibreSSL, -noenc‘i hiç tanımaz ve hata verir.
Bu kılavuz -nodes kullanır çünkü standart bir Mac dahil, karşılaşmanız muhtemel her derlemede çalışan seçenek budur. OpenSSL 3.x kullanıyorsanız ve kullanımdan kaldırılmış yazımdan kaçınmak istiyorsanız, -noenc ile değiştirin. Başka hiçbir şey değişmez.
Bayrağı tamamen çıkarırsanız, OpenSSL anahtarı seçtiğiniz bir parolayla şifreler ve web sunucunuz her yeniden başlatmada bunu sorar. Bu, bir geliştirme sertifikası için nadiren istediğiniz bir şeydir.
Makinenizin sertifikaya güvenmesini sağlayın
Doğru bir kendinden imzalı sertifika hâlâ bir tarayıcı uyarısı üretir, çünkü ona güvenmesi için hiçbir şeye söylenmemiştir. Onu yerel güven deponuza eklemek, uyarıyı kapatan şeydir ve genellikle bunu ilk baştan oluşturmanın amacı da budur.
Bunu yalnızca kontrol ettiğiniz makinelerde ve yalnızca kendi oluşturduğunuz sertifikalar için yapın. Güvenilen bir sertifika, adlandırdığı her site için güvenilirdir, dolayısıyla özel anahtarı buna göre ele alın ve asla paylaşmayın.
macOS Anahtarlık (Keychain)
Sertifikayı sistem anahtarlığına ekleyin ve TLS için güvenilir olarak işaretleyin. Yönetici parolanız istenecektir:
sudo security add-trusted-cert -d -r trustRoot -p ssl -k /Library/Keychains/System.keychain certificate.crt
-p ssl kısmı, güveni TLS bağlantılarıyla sınırlar. Bunu çıkarırsanız, sertifika macOS’un bildiği kod imzalama dahil her amaç için güvenilir olur, ki bu bir geliştirme sertifikasının gerektirdiğinden çok daha fazlasıdır.
Bunun yerine arayüz üzerinden yapmak için, Anahtarlık Erişimi‘ni (Keychain Access) açmak üzere sertifika dosyasına çift tıklayın, Sistem anahtarlığı altındaki girişi bulun, açın, Güven‘i genişletin ve Bu sertifikayı kullanırken‘i Her Zaman Güven olarak ayarlayın. Bunu daha sonra geri almak için, girişi Anahtarlık Erişimi’nden silin.
Windows sertifika deposu
Komut İstemi’ni yönetici olarak açın (Win + R tuşlarına basın, cmd yazın, ardından Ctrl + Shift + Enter tuşlarına basın) ve sertifikayı Güvenilen Kök Sertifika Yetkilileri deposuna ekleyin:
certutil -addstore -f "Root" certificate.crt
Alternatif olarak, sertifika dosyasına çift tıklayın, Sertifika Yükle‘yi seçin, Yerel Makine‘yi seçin, ardından Tüm sertifikaları şu depoya yerleştir‘i seçin ve Güvenilen Kök Sertifika Yetkilileri‘ne göz atın. Daha sonra kaldırmak için certmgr.msc‘yi açın ve girişi o depodan silin.
Linux ca-certificates
Debian ve Ubuntu‘da, sertifikayı yerel çıpalar (anchors) dizinine kopyalayın ve paketi yeniden oluşturun. Dosyanın .crt uzantısını koruması gerekir, yoksa güncelleme aracı onu göz ardı eder:
sudo cp certificate.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
RHEL, CentOS, AlmaLinux, Rocky ve Fedora‘da, yollar farklıdır:
sudo cp certificate.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
Firefox istisnası
Firefox, işletim sistemininkini kullanmak yerine kendi güven deposunu tutar. Windows ve macOS’ta, varsayılan olarak işletim sistemi deposuna eklenen kökleri de okur, dolayısıyla yukarıdaki adımlar normalde bunu da kapsar. Linux’ta okumaz, dolayısıyla sertifikanın doğrudan Firefox’a içe aktarılması gerekir: Ayarlar‘ı açın, ardından Gizlilik ve Güvenlik‘i, Sertifikalar‘a kaydırın, Sertifikaları Görüntüle‘ye tıklayın, Yetkililer sekmesini açın ve İçe Aktar‘ı kullanın.
Bu değişikliklerin herhangi birinden sonra tarayıcıyı yeniden başlatın. Tarayıcılar sertifika kararlarını önbelleğe alır ve eski bir oturum, doğru bir içe aktarmadan sonra uyarının kalıcı görünmesinin yaygın bir nedenidir.
Kendinden imzalı sertifika ne zaman kullanılmamalıdır
Bunu asla halkın ziyaret edeceği bir sitede kullanmayın. Her ziyaretçi tam sayfa bir güvenlik uyarısı alır ve buna aldırmadan devam edenler, kendilerini gerçek bir saldırıdan koruyan tam olarak o uyarıyı tıklayıp geçmeye eğitilmiş olur. Ayrıca bir ziyaretçinin kendinden imzalı sertifikanızı bir saldırganınkinden ayırt etmesinin bir yolu yoktur, ki tarayıcıların bunlara güvenmemesinin tüm nedeni de budur. Ayrıntılara kendinden imzalı sertifikaların tehlikeleri makalemizde giriyoruz.
Kendinden imzalı sertifikalar, tarayıcı uyarısının ötesinde pratik gereksinimleri de karşılayamaz. Ödeme işlemcileri, uygulama mağazaları, sertifika sabitleme (certificate pinning) kullanan mobil uygulamalar ve çoğu uyumluluk rejimi, tanınan bir CA’dan bir sertifika gerektirir. Halka açık herhangi bir şey için, bir CSR ile talep ettiğiniz ve düzenlemeden önce doğruladığınız, güvenilir bir sertifika yetkilisi tarafından verilmiş bir sertifika kullanın. Yayına girdikten sonra, kurulumu SSL Checker aracımızla doğrulayın.
Bugün SSL Dragon’dan sipariş vererek SSL Sertifikalarında %10 indirimden yararlanın!
Hızlı düzenleme, güçlü şifreleme, %99,99 tarayıcı güvenilirliği, özel destek ve 25 günlük para iade garantisi. Kupon kodu: SAVE10

