Skip to content

Instantly share code, notes, and snippets.

@cemtopkaya
Forked from fntlnz/self-signed-certificate-with-custom-ca.md
Last active September 23, 2022 15:47
Show Gist options
  • Save cemtopkaya/cde69b2cb68f84e22dec5cc25c8f27f0 to your computer and use it in GitHub Desktop.
Save cemtopkaya/cde69b2cb68f84e22dec5cc25c8f27f0 to your computer and use it in GitHub Desktop.
Self Signed Certificate with Custom Root CA

DİKKAT

Kuruluş adları(Musteri Ldt. gibi), dosya adları(borwser.cinar ile browser.musteri gibi), alan adları(musteri.com.tr ile cinar.com.tr gibi), IP adreslerinde tutarsızlıklar olabilir çünkü proje kapsamında yaptığım çalışmalar ile genel amaçla tanımlamaya çalıştığım örnekler biraz iç içe girdi. Zaten bu isimleri kendi projelerinize göre değiştireceğiniz için komutlar sorunsuz çalışacaktır. Yine de yardıma ihtiyacınız olursa lütfen iletişime geçin.

Kök Sertifikasız Kendinden İmzalı Sertifika Olutşurmak

Windows için Win32 OpenSSL v1.1.0+ indirip aşağıdaki komutla en hızlı oluşturabileceğiniz sertifikayı elde edebilirsiniz:

$ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout gizliAnahtar.key -out sertifika.crt

Kök Sertifikası Oluşturmak

$ openssl genrsa -out rootCA.key 2048

Oluşturduğunuz gizli anahtarı (rootCa.key) sadece okunur hale getirin. Böylece kazayla üstüne yazılmasını veya silinmesini önlemiş olursunuz.
$ chmod 400 rootCA.key

$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt

image

Sunucu Sertifikası Oluşturmak

openssl-musteri.cnf dosyasını aynı dizinde oluşturun ve içeriğine aşağıdaki satırları yapıştırın:


####################################################################

[ ca ]
default_ca    = CA_default      # The default ca section

[ CA_default ]

dir               = .
certs             = $dir/intermediate/certs
crl_dir           = $dir/intermediate/crl
new_certs_dir     = $dir/intermediate/newcerts      # Zorunlu. -outdir komut satırı seçeneğiyle aynı. Yeni sertifikaların yerleştirileceği dizini belirtir. 
database          = $dir/intermediate/index.txt     # Zorunlu. Kullanılacak metin tabanlı veritabanı dosyası. Bu dosya başlangıçta boş olsa da mevcut olmalıdır.
serial            = $dir/intermediate/serial

private_key      = $dir/intermediate/private/intermediate.key
certificate      = $dir/intermediate/certs/intermediate.crt

default_days     = 1000         # Sertifika geçerlilik süresi (gün sayısı)
default_crl_days = 30           # İptal listesinin hangi sıklıkla güncellendiğidir. Bu değere göre sertifika içindeki crlDistributionPoints özelliğindeki adresi kontrol ederek, iptal listesini çeker ve sertifika seri numarasının iptal edilip edilmediğini kontrol ederek geçerlilik sağlar.
default_md       = sha256       # Özet algoritmasının varsayılan değeridir. -md komut satırı parametresiyle ezilebilir.
preserve         = no           # tüm sertifikalarınızın aynı DN sırasına sahip olmasını istiyorsanız, "no" değeri alacak. Openssl, CSR'da tanımlı DN alanlarını tutarlı hale getirmek için yeniden sıralar. Ancak, bu özelliklerin sırasını kullanıcının belirlemesine izin vermek istiyorsanız, bunu "yes" olarak ayarlayın.

x509_extensions = ca_extensions # x509v3 Uzantılar eklenebilecek bir formattır ve bu uzantıları ayarladığımız ayar bölümünün adını yazarız

email_in_dn     = no            # yes Olursa sertifikaya eposta adresini ekler, no olursa DN'deki e-postayı birleştirmez
copy_extensions = copy          # SAN ayarlarını CSR'den sertifikaya kopyalamak için gereklidir (openssl ca komutu için geçerlidir)

####################################################################

[req]
# openssl req komutunu kullandığımızda bu bölümü okuyacak.
# Aşağıdaki komutu çalıştırdığında gizli anahtarı çıkarırken adını cakey.pem seçecek 
#   $ openssl req -config openssl_musteri.com.tr.cnf -newkey rsa:2048 -sha256 -out servercert.csr -outform PEM
# Eğer -newkey rsa:2048 yerine -newkey rsa yazarsak gizli anahtarı default_bits değeriyle çıkaracak
# 
default_bits       = 4096
default_keyfile    = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions    = ca_extensions
string_mask        = utf8only
req_extensions     = v3_req
# encrypt_key        = no         # Gizli anahtarı şifreyle korur (-no)

####################################################################

[ca_distinguished_name]

C          = Ulke (2 Harf)
C_default  = TR
L          = Sehir
L_default  = KARS
O          = Organizasyon ismi
O_default  = Musteri E-Ticaret Sirketi Ltd. Sti.
OU         = Organizasyon Birimi
OU_default = E-Ticaret Yazilim Gelistirme Birimi
CN         = Ortak Ad
CN_default = *.musteri.com.tr
commonName_max = 64

####################################################################

[ signing_policy ]
organizationName = supplied
commonName = optional

####################################################################
[ v3_req ]
# Extensions to add to a certificate request
subjectKeyIdentifier = hash
basicConstraints     = CA:FALSE
keyUsage             = digitalSignature, keyEncipherment
subjectAltName       = @alternate_names
nsComment            = "OpenSSL Generated Certificate"

####################################################################
[ ca_extensions ]

subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints       = critical, CA:true
keyUsage               = keyCertSign, cRLSign


[ alternate_names ]
DNS.1 = *.musteri.com.tr
DNS.2 = forum.musteri.com.tr
DNS.3 = sss.musteri.com.tr
IP.1 = 127.0.0.1
IP.2 = 192.168.56.1
IP.3 = 87.67.231.12      # farz-ı muhal dış IP adresiniz 

Komut satırında aşağıdaki satırları çalıştırın:

Gizli anahtar oluşturuyoruz ([şifre koruması için...](https://gist.github.com/cemtopkaya/cde69b2cb68f84e22dec5cc25c8f27f0#1-sertifika-yetkilisi-k%C3%B6k-sertifikan%C4%B1n-gizli-anahtar%C4%B1n%C4%B1-olu%C5%9Fturur)):
$ openssl genrsa -out musteri.com.tr.key 2048

Sertifika İstek Talebi oluşturuyoruz
$ openssl req -new -config openssl-musteri.cnf -key musteri.com.tr.key  -out musteri.com.tr.csr

Sertifikayı oluşturuyoruz
$ openssl x509 -req -sha256 -days 3650 -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -in musteri.com.tr.csr -out musteri.com.tr.crt -extensions v3_req -extfile openssl-musteri.cnf

image

Gizli Anahtar ve CSR Dosyası Olmaksızın Doğrudan Ayar Dosyasından Sertifika Üretmek

Yukarıdaki ayar dosyasımızla

$ openssl req -config openssl-musteri.cnf -newkey rsa:2048 -sha256 -nodes -keyout private -out servercert.csr -outform PEM

openssl ca komutuyla:

$ openssl ca -config intermediate\openssl_musteri.com.tr.cnf \
         -policy signing_policy \
         -extensions v3_req \
         -infiles intermediate\csr\musteri.com.tr.csr \
         -out servercert.crt 

Dikkat policy parametresi ayar dosyamızda (burada openssl_musteri.com.tr.cnf oluyor) sigining_policy isimli bir bölümün olması gerekiyor. Aynı şekilde bir de [v3_req] bölümü olmalı.

[ signing_policy ]
organizationName = supplied
commonName = optional

Tümünü Görelim

Kök sertifikası:

$ openssl genrsa -out rootCA.key 2048
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
$ openssl 
$ openssl 

Çıktılarıyla birlikte:

$ openssl genrsa -out rootCA.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.+++++
........................................................+++++
e is 65537 (0x010001)

$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:Turkey
Locality Name (eg, city) []:ANKARA
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ana Sertifika Yetkilisi (Root CA)
Organizational Unit Name (eg, section) []:Kok Sertifika Uretim Bolumu
Common Name (e.g. server FQDN or YOUR name) []:Ana Sertifika Yetkilisi (Root CA)
Email Address []:

$ openssl x509 -in rootCA.crt -subject -noout
subject=C = TR, ST = Turkey, L = ANKARA, O = Ana Sertifika Yetkilisi (Root CA), OU = Kok Sertifika Uretim Bolumu, CN = Ana Sertifika Yetkilisi (Root CA)

$ openssl x509 -in rootCA.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            39:8c:9c:99:4c:08:e9:b4:e3:81:7e:8a:d7:a9:9f:ab:5d:ca:76:89
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = TR, ST = Turkey, L = ANKARA, O = Ana Sertifika Yetkilisi (Root CA), OU = Kok Sertifika Uretim Bolumu, CN = Ana Sertifika Yetkilisi (Root CA)
        Validity
            Not Before: Jun 10 05:16:44 2020 GMT
            Not After : Jun 10 05:16:44 2021 GMT
        Subject: C = TR, ST = Turkey, L = ANKARA, O = Ana Sertifika Yetkilisi (Root CA), OU = Kok Sertifika Uretim Bolumu, CN = Ana Sertifika Yetkilisi (Root CA)
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:d3:c1:af:82:12:5d:53:2d:8d:69:2a:21:d1:8b:
                    3c:74:e9:59:31:81:0b:c2:a6:77:f9:50:........
                    be:da:c3
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                2E:31:25:2B:67:69:41:6E:8D:29:73:0E:F2:DD:27:5F:FD:48:79:EA
            X509v3 Authority Key Identifier:
                keyid:2E:31:25:2B:67:69:41:6E:8D:29:73:0E:F2:DD:27:5F:FD:48:79:EA

            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Key Usage: critical
                Digital Signature, Certificate Sign, CRL Sign
    Signature Algorithm: sha256WithRSAEncryption
         a0:8d:e2:52:3c:69:ce:bf:a4:98:81:51:80:f7:ba:44:57:c6:
         86:92:11:44:f7:dc:11:31:e0:86:0b:94:d6:..............

Kök sertifikalı sunucu/istemci sertifikası:

$ openssl genrsa -aes256 -out private\musteri.key 2048
$ openssl req -new -config openssl_musteri.cnf -key private\musteri.key -out csr\musteri.csr
$ openssl req -in csr\musteri.csr -subject -noout
$ openssl req -verify -in csr\musteri.csr -noout
$ openssl x509 -req -sha256 -days 21 -CA certs\intermediate.crt -CAkey private\intermediate.key -CAcreateserial -in csr\musteri.csr -extensions v3_req -extfile openssl_musteri.cnf -out newcerts\musteri.crt
$ openssl x509 -in newcerts\musteri.crt -subject -noout
$ openssl x509 -in newcerts\musteri.crt -text -noout

Çıktılarıyla birlikte:

# openssl
OpenSSL> genrsa -aes256 -out private\musteri.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..........................................................................................+++++
............+++++
e is 65537 (0x010001)
Enter pass phrase for private\musteri.key:
Verifying - Enter pass phrase for private\musteri.key:
OpenSSL>
OpenSSL> req -new -config openssl_musteri.cnf -key private\musteri.key -out csr\musteri.csr
Enter pass phrase for private\musteri.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Ulke (2 Harf) [TR]:
Sehir [ISTANBUL]:
Organizasyon ismi [Musteri E-Ticaret Sirketi Ltd. Sti.]:
Organizasyon Birimi []:
Ortak Ad [*.musteri.com.tr]:
OpenSSL>
OpenSSL> req -in csr\musteri.csr -subject -noout
subject=C = TR, L = ISTANBUL, O = Musteri E-Ticaret Sirketi Ltd. Sti., OU = E-Ticaret Yazilim Gelistirme Birimi, CN = *.musteri.com.tr
OpenSSL>
OpenSSL> req -verify -in csr\musteri.csr -noout
verify OK
OpenSSL>
OpenSSL> x509 -req -sha256 -days 21 -CA certs\intermediate.crt -CAkey private\intermediate.key -CAcreateserial -in csr\musteri.csr -extensions v3_req -extfile openssl_musteri.cnf -out newcerts\musteri.crt
Signature ok
subject=C = TR, L = ISTANBUL, O = Musteri E-Ticaret Sirketi Ltd. Sti., OU = E-Ticaret Yazilim Gelistirme Birimi, CN = *.musteri.com.tr
Getting CA Private Key
Enter pass phrase for private\intermediate.key:
OpenSSL>
OpenSSL> x509 -in newcerts\musteri.crt -subject -noout
subject=O = Musteri E-Ticaret Sirketi Ltd. Sti., CN = *.musteri.com.tr
OpenSSL>
OpenSSL>   x509 -in newcerts\musteri.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            61:f7:a6:33:32:2d:f5:56:bf:59:81:96:ca:ab:cf:42:32:9d:84:55
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = TR, ST = Turkey, L = IZMIR, O = Ara Sertifika Yetkilisi IZMIR, OU = Sertifika Uretim Merkezi IZMIR, CN = Ara Sertifika Yetkilisi IZMIR
        Validity
            Not Before: Jun 14 10:31:13 2020 GMT
            Not After : Jul  5 10:31:13 2020 GMT
        Subject: C = TR, L = ISTANBUL, O = Musteri E-Ticaret Sirketi Ltd. Sti., CN = *.musteri.com.tr
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:b9:93:a0:ee:c0:96:73:03:dd:1a:24:7c:88:e3:
                    e3:95:8a:16:20:0b:20:fc:f0:7a:85.............
                    ........................42:4b:fd:f2:71:5d:f1:
                    61:db:71:ee:64:2d:9c:67:07:b6:51:5f:c9:d1:62:
                    2b:47
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                B1:FA:AA:03:D4:69:64:EE:F5:BE:26:DF:94:76:BD:E7:9C:E6:75:0E
            X509v3 Basic Constraints:
                CA:FALSE
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Subject Alternative Name:
                DNS:*.musteri.com.tr, DNS:forum.musteri.com.tr, DNS:sss.musteri.com.tr, IP Address:127.0.0.1, IP Address:192.168.56.1, IP Address:87.67.231.12
            Netscape Comment:
                OpenSSL Generated Certificate
    Signature Algorithm: sha256WithRSAEncryption
         38:e1:c8:70:32:b6:17:d8:89:04:27:7f:e0:da:0f:7d:79:2d:
         b0:fe:7d:c0:bc:68:e0:e4:44:e2:a2:.....................
OpenSSL>
OpenSSL> 

Karşılıklı Doğrulama İçin Web Tarayıcı Sertifikası

$ openssl genrsa -aes256 -out private\browser.key 2048
$ openssl req -new -config openssl_browser.cnf -key private\browser.key -out csr\browser.csr
$ openssl x509 -req -sha256 -days 21 -CA certs\intermediate.crt -CAkey private\intermediate.key -CAcreateserial -in csr\browser.csr -extensions v3_req -extfile openssl_browser.cnf -out newcerts\browser.crt
$ openssl pkcs12 -export -clcerts -in newcerts\browser.crt -inkey private\browser.key -out newcerts\browser.musteri.com.tr.p12

Çıktılarıyla birlikte:

OpenSSL>  genrsa -aes256 -out private\browser.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
................................................+++++
............................................................................+++++
e is 65537 (0x010001)
Enter pass phrase for private\browser.key:
Verifying - Enter pass phrase for private\browser.key:
OpenSSL> 
OpenSSL> req -new -config openssl_browser.cnf -key private\browser.key -out csr\browser.csr
Enter pass phrase for private\browser.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Ulke (2 Harf) [TR]:
Sehir [ISTANBUL]:
Organizasyon ismi [Web Tarayicisi]:
Organizasyon Birimi [Internet Gezgini Kullanicilari]:
Ortak Ad [*.musteri.com.tr]:
OpenSSL>
OpenSSL>
OpenSSL> x509 -req -sha256 -days 21 -CA certs\intermediate.crt -CAkey private\intermediate.key -CAcreateserial -in csr\browser.csr -extensions v3_req -extfile openssl_browser.cnf -out newcerts\browser.crt
Signature ok
subject=C = TR, L = ISTANBUL, O = Web Tarayicisi, OU = Internet Gezgini Kullanicilari, CN = *.musteri.com.tr
Getting CA Private Key
16324:error:08064066:object identifier routines:OBJ_create:oid exists:crypto\objects\obj_dat.c:698: Enter pass phrase for private\intermediate.key:
OpenSSL> pkcs12 -export -clcerts -in newcerts\browser.crt -inkey private\browser.key -out newcerts\browser.musteri.com.tr.p12
Enter pass phrase for private\browser.key:
Enter Export Password:
Verifying - Enter Export Password:

Sertifika

Sertifikaya neden ihtiyacımız var?

Biz veri alış verişlerimizi daha güvenli hale getirmek için çeşitli şifreleme algoritmaları kullanırız. Tarihin ilk şifreleme örneklerinden firavunların mezarlarındaki sembollerden, Romalıların SKYTALE yönteminden, kölelerin başlarına kazınmış mesajları saçları uzadığında hedefe göndermelerine, Sezar'ın harf kaydırma yöntemine, meşhur Enigmaya vesair bahsetmek güzel olurdu. Ancak buradaki esas nokta şifreleme algoritmalarından ziyade şifreli mesajın zarflanarak transfer edilmesidir. Şifreli mesajı iki tarafın da çözümlemesinden öte, mesajlaşanların gerçekten umulan taraflar olup olmadığıdır husus. Bunu ancak araba satışında noterin "alıcı" ve "satıcının" kimliklerini doğrulamasıyla satışın gerçekleşmesine benzetebiliriz.

Örnekler üzerinden devam edelim:

Bizim bir e-ticaret sitemiz var ve müşterilerimizin sitemizdeki tüm veri akışını şifrelemek ve böylece güvenli hale getirmek istiyoruz. Örneğin hassas bilgilerden "kredi kartı, adres, kimlik bilgileri vs." alış veriş anında şifreli olarak sunucuya gönderilmeli ve sunucudan müşteriye dönecek bilgiler aynı şekilde şifrelenmeli. Bu şifrelemeyi sertifika maharetiyle sağlıyor olacağız. Güvenilir bir sertifikaya ihtiyaç duyan her sunucu/cihaz için aşağıdaki prosedürün uygulanması gerekir.

Bir mesajlaşma uygulamasının verileri sürekli şifreleyip, karşı tarafa ulaştığında deşifrelemesi gibi gerçekten tarafların beklediğimiz kişiler olması da ihtiyacınız olabilir. Böyle binlerce kullanıcı adına sizin sertifka oluşturup dağıtmanız ve uygulamanızın içinde bu sertifikaları kullanarak mesajlaştırmanız.

Kullanıcılarınızın VPN yaparken sadece kullanıcı adı ve şifrelerini bilmesi yetmezmiş gibi bir de sizin tarafınızdan her kullanıcının kendisine özel ürettiğiniz sertifikalara sahip olmasını istemeniz de gerçek hayat hikayelerindendir.

Bir sistem yöneticisi olarak ağlarınıza bağlanacak cihazların sertifikaları olmazsa kapının dışında kalmasını istemeniz de gerçek kesit bölümlerindendir.

Sunucu serfifikası nedir?

Sunucu sertifikası, kullanıcının ihtiyaç duyduğu belirli bir alan adına verilen sertifikadır. Bir siteniz var "egitimindibi.com" adında ve bu siteyi google arama motoru olarak indekslemiyor. Yapmanız gereken ilk şey hemen https ile ziyaret edilebilir hale getirmek. Bunun için bir sertifika alacaksınızki ziyaretçiniz ile web siteniz arasındaki veri alış verişini bu sertifikayla şifreleyebilesiniz. Kimden alabilirsiniz bu sertifikayı? Ücretsiz sertifika veren let's encrypt firmasından diyelim.

image

Bu durumda sertifikanınızı kök sertifika yetkilisinden değilde aradaki sertifika yetkilsiinden almış olacaksınız.

Aynı mantıkta www.sozcu.com.tr adresinde sertifkaya bakınca ara sertifika sağlayıcılarının 3 tane olduğunu göreceksiniz.

image

Şimdi bu kavramlara bakalım:

Kendinden İmzalı Sertifika

Hiç bir otoritenin ürettiğiniz sertifikadan haberi olmayan, sertifikanızı doğrulamak için hiçbir sertifika yetkilisine soramadığı x509 formatında hazırlanmış gizli ve açık anahatarları olan bir dosya. Web tarayıcıları sertifikaları kullanarak veri alış verişlerini şifreleyerek sağlarlar. İstemci ve sunucu arasında bu iletişimi şifrelemek için sertifikaların yapısında bulunan açık gizli anahtarları SSL protokolüne uygun olarak değiş tokuş yapar. Bu sertifikalar eğer bir Sertifika Yetkilisi (CA) tarafından verilmemişse uyarı mesajları gösterir ve iletişime devam edilmesi kararı verilirse veri şifrelemesi eldeki sertifikaya göre yapılır.

Bu tip sertifikaların üretilmesi çok kolay olup iletişimi şifreler ancak sertifika sahibinin (sertifikayı kullanmak isteyen istemci ve/veya sunucunun) sertifikada bildirdiği kuruluş olduğuna dair kimse emin olamaz. Sertifika Yetkilisi bir nevi NOTER görevi görür. Notere gittiğinizde sizden soğuk mühürlü bir kimlik ister, kimliğin doğru olup olmadığına bakar, sisteminden kimlikteki bilgileriyle eşleştirir ve yapılan işi onaylar. Bir sertifika yetkilisinin onayladığı sertifika ile kendinden imzalı sertifika arasındaki fark "sertifikanın size ait olduğunun noter tarafından onayıdır" (noter = sertifika yetkilisi).

image

Kök sertitifika yetkilisi kimdir?

image

Şifreleme ve bilgisayar güvenliğinde, kök sertifika, kök sertifika yetkilisini (CA) tanımlayan ortak anahtar sertifikasıdır. Çoğu tarayıcıda önceden indirilmiş olarak gelir ve “güven deposu” olarak adlandırılan yerde saklanır. Kök sertifikalar, Sertifika Yetkilileri tarafından yakından korunmaktadır. Bir SSL sertifikasının güvenilir olması için, güven köküne (root trust) kadar izlenebilir olması gerekir, yani sunucu sertifikasından, ara ve kökteki tüm sertifikaların düzgün bir şekilde güvenilir olması gerekir.

Ara sertifika yetkilisi kimdir?

image

Ara sertifikalar ağaç dalları gibi kök sertifikalardan ayrılır. Korunan kök sertifikalar ile sunucu sertifikaları arasında arabuluculuk yaparlar. Bir zincirde her zaman en az bir ara sertifika olacaktır, ancak birden fazla da olabilir.

image

1 Kök sertifika yetkilisi ancak 3 ara sertifika yetkilisi var. Ref: https://www.thesslstore.com/knowledgebase/ssl-support/explaining-the-chain-of-trust/

Dizin Yapısı

Temel olarak dizin yapınız:

  • sertifikalarınız için certs,
  • iptal edilen sertifikaları crl,
  • yenilenen sertifikaları newcerts,
  • gizli anahtarları private

dizinlerinde saklayacağız

  • serial içinde sertifikaların numaralarını (integer değer olmalı!)
  • crlnumber içinde iptal edilen sertifikaların seri numarasını
  • index.txt bir veritabanı gibi kullanılacak
  • openssl.cnf dosyalarında kök veya ara sertifika yetkililerinin ayarlarını tutacağız
root\
└───ca\
    ├───certs\
    ├───crl\    
    ├───index.txt
    ├───newcerts\
    ├───openssl.cnf
    ├───private\
    ├───serial
    └───intermediate\
        ├───certs\
        ├───crl\
        ├───crlnumber
        ├───csr\
        ├───index.txt
        ├───newcerts\
        ├───openssl.cnf
        ├───private\
        └───serial

Dizinleri oluşturalım:

$ mkdir root
$ cd root
$ mkdir ca
$ cd ca
$ mkdir certs crl newcerts private intermediate

private dizininde gizli anahtarları oluşturacağımız için drwx------ izinlerine sahip olması için:
$ chmod 700 private

"intermediate" dizini, ara sertifika yetkilisinin dosya ve dizinlerini içeren klasörüdür
$ cd intermediate
$ mkdir certs crl newcerts private 

Linux ve MacOS üstünde boş dosya yaratmak için kullanılan touch komutunu simüle eden touch npm paketini kurabilirsiniz.

Kök sertifika yetkilisinin dosyalarını oluşturalım:

$ cd root/ca
$ touch index.txt

1000 şart değil 01'den de başlayabilirsiniz.
$ echo 01 > serial

Ara sertifika yetkilisinin dosyalarını oluşturalım:

$ cd root/ca/intermediate
$ touch index.txt

Komut satırında set_serial anahtarı kullanılarak başlangıç değeri atanabilir 
$ echo 1000 > serial

crlnumber dosyası, sertifika iptal listelerini takip etmek için kullanılır.
$ echo 1000 > /root/ca/intermediate/crlnumber

root/ca dizinine root_ca_openssl.cnf dosyasının içeriğini openssl.cnf ismiyle kaydedin.

root/ca/intermediate dizinine root_ca_intermediate_openssl.cnf dosyasının içeriğini openssl.cnf ismiyle kaydedin.

Notlar

openssl.cnf

openssl.cnf dosyası varsayılan olarak openssl.exe tarafından bir yerden okunur (hangisi olduğunu anlamak için bilgisayarınızdaki openssl.cnf dosya adlarını değiştirerek bulamadığı zamana kadar deneyin). Hangi openssl.cnf ile çalışmasını istiyorsak iki yolla çözebiliriz:

  1. -config anahtarına değer olarak verebiliriz: -config c:\temp\openssl.cnf
  2. Ortam değişkenlerinde sadece çalışan kabuk için SET ile değiştirebiliriz. openssl.exe'nin aradığı anahtar OPENSSL_CONF
Windows için SET:
$ set OPENSSL_CONF=C:\Program Files (x86)\Micro Focus\DemoCA\openssl.cnf

*NIX Sistemler için export ile:
$ export OPENSSL_CONF=./openssl.cnf

serial

Onaltılık düzende sertifika seri numarasını içeren zorunlu bilgidir. Bu dosya mevcut olmalı ve geçerli bir seri numarası içermelidir.

Sunucu sertifikalarını imzalarken bir seri numarası oluşturmak ve bu seri numarasıyla sertifikanızı ilişkilendirmelisiniz. Düşünün ki ucuzcu.com adresi için 5 yıllık sertifika verdiniz ve ikinci senesinde alan adı el değiştirdi. Verdiğiniz sertifikayı iptal edip ucuzcu.com adresinin yeni sahibine sertifika düzenlemek gerekecek. İşte iptal edilecek sertifikayı serial dosyasındaki seri numarasıyla işaret ederek Sertifika İptal Listesine (Certificate Revocation List) bu seri numarasını ekliyorsunuz.

$ openssl rand -hex 16
be4eecd94a40467eba9032a077b7935e

be4eecd94a40467eba9032a077b7935e keyfi, 16'lık düzende ve her defasında eşsiz bir değer üretilir. Bu değeri serial dosyasında saklayacağız. Her sertifika üretiminden önce yeni bir seri numarası oluşturmalı ve sertifikayı oluştururken openssl.exe sertifkayla ilişkilendirir.

$ openssl rand -hex 16 > serial

Kök Sertifika Oluşturmak

Özet ve Detaylı anlatımlarda adımlarını bulabilirsiniz. Kök sertifikayla hem istemci hem sunucu sertifikaları imzalanabilir ama kök sertifika yetkilisi sunucu sertifikalarını imzalamak yerine Ara Sertifika Yetkilisinin (Intermediate CA) sertifikasını imzalar. Kök Sertifika Yetkilisi (Root CA) ara sertifika yetkilisine (Intermediate CA) yetkiyi verir ve artık sunucu sertifikalarını ara sertifka yetkilisi imzalar.

Sertifika yetkilisi (CA) olarak davranabilmek, kriptografik

  • özel anahtar (private key)
  • ve sertifika (certificate)

çiftiyle mümkündür.

İlk oluşturacağımız şifreleme çifti; kök anahtarından (ca.key.pem) ve kök sertifikasından (ca.cert.pem) oluşan "kök çiftidir". Bu çift CA'nızın kimliğini oluşturur.

Tekrar edelim "Kök Sertifika Yetkilisi" (Root CA) genellikle sunucu/istemci sertifikalarını doğrudan imzalamaz. Kök CA, yalnızca güvenilen bir veya daha fazla Ara Sertifika Yetkilisi (intermediate CA) oluşturmak için kullanılır. İdeal olarak, tamamen internetten kalıcı olarak izole edilmiş, tamamen şifreli, bir bilgisayarda kök çiftini oluşturmak en güvenli yoldur.
Bu yüzden kök sertifika oluşturulacak bilgisayarın kablosuz ağ arayüzünü (wireless kartını) ve ethernet bağlantısını çıkararak internetten yalıtıldığına emin olmak güvenli bir yoldur.

Sertifika Yetkilisi Tarafından Kök Sertifikası Oluşturulması (Bir kez yapılacak)

Detaylar aşağıda anlatılacak ancak özetle sertifika yetkilisinin "kök sertifikasının" oluşturulması iki aşamadır:

  1. Kök sertifika gizli anahtarını oluştur
  2. Gizli anahtar ile kök sertifikasını oluştur

Kendi üreteceğimiz sertifikaların kullanılacağı bilgisayarlarda tüm sertifikaları "geçerli" diye işaretlemek için en kestirme yol; bir kök sertifikası üstünden tüm sertifikaları üretmek ve istemcilere sadece bu kök sertifikayı tanımalarını sağlamaktır.

1. Sertifika Yetkilisi Kök Sertifikanın Gizli Anahtarını Oluşturur

Dikkat: bu, sertifika isteklerini imzalamak için kullanılan anahtardır; bu dosyayı elinde tutan herkes sizin adınıza sertifika imzalayabilir. Bu yüzden onu güvenli bir yerde saklayın!

openssl genrsa ... komutunun şifreleme parametresi, özel anahtarınızı şifrelemek için hangi algoritmayı kullanacağınızı belirtmek için kullanılır (belirttiğiniz şifreyi kullanarak). Gizli anahtarınızı (private key) ekstra korumak için şifre kullanabilirsiniz.

AES 128, 192 ve 256 bit uzunluğunda anahtar kabul eder ve DES3'ten 5 veya 10 kat daha hızlıdır AES vs. DES

Bir CSR ve özel anahtar çiftinin bit uzunluğu, anahtarın kaba kuvvet yöntemleri kullanılarak ne kadar kolay kırılabileceğini belirler. 2016 Yılı itibarıyla, 2048 bit'ten küçük bir anahtar boyutunun zayıf olduğu düşünülür ve birkaç ay veya daha kısa bir sürede yeterli bilgi işlem gücüyle kırılabilir. Özel bir anahtar bozulursa, onunla başlatılan tüm bağlantılar, anahtarın kime ait olduğu ifşa olur. SSL sertifika sağlayıcılarının izlemesi gereken Genişletilmiş Doğrulama (Extended Validation) yönergeleri, tüm EV sertifikalarının gelecekteki güvenliğini sağlamak için 2048 bit anahtar boyutu kullanmasını gerektirir. Bu nedenle, çoğu sağlayıcı EV olsun ya da olmasın tüm sertifikalarda 2048 bit anahtarları teşvik eder. Ekstra güvenlik istiyorsanız, bit uzunluklarını artırabilirsiniz. Tüm kök ve ara sertifika yetkilisi anahtarları için 4096 bit kullanın. Yine de daha kısa uzunlukta, sunucu ve istemci sertifikalarını imzalayabilirsiniz. 4096 bit 2048 bitten biraz daha güvenli olmasına rağmen, TLS tokalaşmalarını yavaşlatır ve tokalaşma sırasında işlemci yükünü önemli ölçüde artırır. Bu nedenle, çoğu web sitesi 2048 bit çifti kullanır. 1024, 2048, 4096 gibi şifreleme karmaşıklığını arttırabilir veya bu ayarı -config anahtarıyla verdiğimiz ayar dosyasında [req] bölümünde default_bits anahtarında verebilirsiniz (default_bits = 2048).

Anahtarı yaratırken şifre tayin etmek istersek -des3 veya -aes256 parametresini kullanmalıyız:

$ cd root/ca

Uzantısı .key veya .pem olabilir
$ openssl genrsa -des3 -out private/ca.key 4096

VEYA des3 Şifeleme yerine aes şifrelemeyle, daha hızlı ve daha yüksek bit uzunluğunda gizli anahtar dosyanızı üretebilirsiniz
$ openssl genrsa -aes256 -out private/ca.key.pem 4096

Oluşturduğumuz gizli anahtarımızı read-only olarak işaretleyelim ki; kazayla üstüne yazıp, silmeyelim.
$ chmod 400 private/ca.key

Oluşturduğumuz gizli anahtarımızı doğrulamak için:
$ openssl rsa -in private/ca.key -check

Şifreli anahtar tanımlama

Gizli Anahtarınızı Şifre Korumasız İsterseniz

-des3 veya -aes256 seçeneklerini kaldırabilirsiniz openssl genrsa -out rootCA.key 2048 Şifre sormuyor Kök Anahtarı (gizli)

Oluşan gizli anahtarımıza bakalım:

  • 4096 bit yüzünden uzun bir private key yarattık
  • aes Kullandığımız için şifreleme bilgisinde göreceğiz
# cat private\ca.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,DEE216F5293A30DBE0A0A8526BFBC2F0

juTcVmYf2zfQaajXEHPU8nld0FCSRBzYI5XMOqgwh5s95C2c7B8PEcX/ZQGS3WsK
5ETlHNzB+HdnpBW4bMZqYV2Gy9FmEAQY6Gg146ou+hSwRW4Hc4dZFArZ4E51mny8
.....
.........
JnOSVGLMmjfOVJtAy2WBVKGUdhKOWXEYs/rtzhj+CT4YhN3SCYMCDR/FeZb/n5JU
-----END RSA PRIVATE KEY-----

2. Sertifika Yetkilisi Kök Sertifikasını Oluşturur

Az önce oluşturduğumuz gizli anahtarı kullanarak açık anahtarımızı içeren sertifikamızı yaratabiliriz. -key rootCA.key ile gizli anahtarımızı parametre olarak veriyoruz -out rootCA.crt ile açık anahtarımızı içeren sertifikamızı oluşturuyoruz

$ cd /root/ca
$ openssl req -config openssl.cnf \
          -new -x509              \
          -extensions v3_ca       \
          -key private/ca.key     \
          -out certs/ca.crt
          
Dosyamızı silinme ve yeni sertifika dosyasını üstün yazma hatalarına karşı koruyalım:
$ chmod 444 certs/ca.crt

Oluşan sertifikamızı doğrulayalım:
$ openssl x509 -in certs/ca.crt -text -noout

image Sertifika dosyamızın içeriğini görüntüleyebilir veya doğrulamak için $ openssl x509 -noout -text -in certs/ca.crt komutuyla içeriğini görebiliriz:

$ cat certs/ca.crt
-----BEGIN CERTIFICATE-----
MIIF+TCCA+GgAwIBAgIUa46t+ZGIubJgYi4o4VY75bTCQVgwDQYJKoZIhvcNAQEL
BQAwgYMxCzAJBgNVBAYTAlRSMQ8wDQYDVQQIDAZUdXJrZXkxDzANBgNVBAcMBkFO
S0FSQTEoMCYGA1UECgwfQW5hIFNlcnRpZmlrYSBTaXJrZXRpIChSb290IENBKTEo
.
..
...
BoPE/aa1KVJ41bNAS2jWsOYjVfSgG/6kdKOECkDSKpRhrGNAj0QFDtJCXUR8GBXR
Pph8iSvuguEkxE15NeVhwGc0HYbRT19IZkEC1sDLfprM304yLBfFA9Cau3PuheJE
1pzIdny43ppxhth2lTMgfijQy2ifiQCPyVGN3Co1JyHLBoYOMIdkVa3fi187
-----END CERTIFICATE-----

NOT: Bazı ekran görüntüler .pem uzantılı ve openssl.cnf dosyasında olan ayarları ezecek şekilde komut satırından verilmiş ve farklı yöntemlerin de aynı şekilde çalıştığını göstermek amaçlıdır.

req komutu PKCS#10 biçiminde sertifika istekleri oluşturur ve işler. Ek olarak, örneğin kök CA'lar olarak kullanılmak üzere kendinden imzalı sertifikalar oluşturabilir.

new seçeneği yeni bir sertifika isteği oluşturur. Kullanıcıdan yapılandırma dosyasında ve istenen uzantılarda belirtildiği kadar bilgiyi interaktif şekilde sorar. -key seçeneği kullanılmazsa, yapılandırma dosyasında belirtilen bilgileri kullanarak yeni bir RSA özel anahtarı oluşturur. Eğer -key anahtarı girilmişse hali hazırdaki "private key" dosyası parametre olarak verilebilir (yukarıdaki komutta olduğu gibi).

x509 seçeneği, sertifika isteği (CRS) yerine kendinden imzalı bir sertifika verir. Bu genellikle bir test sertifikası veya kendinden imzalı bir kök CA oluşturmak için kullanılır. Sertifikaya (varsa) eklenen uzantılar yapılandırma dosyasında belirtilir. set_serial opsiyonu özellikle belirtilmedikçe seri numarası için 0 kullanılır.

days n, -x509 seçeneği kullanıldığında bu seçenekle sertifikanın geçerli olacağı gün sayısını belirtilmiş olur. Varsayılan süre 30 gündür.

İster komut satırında, isterseniz ayar dosyasında bu değeri verebilirsiniz:

  • Komut satırında bu değeri girmek isterseniz: $ openssl ... -days 7300 ...
  • Eğer openssl.cnf dosyasında default_days = 1850 anahtarında ön ayar yapmışsanız, bu ön değer komut satırında -config dosya_yolu/openssl.cnf şeklinde verildiğinde otomatik olarak ayar dosyanızdan okuncaktır. Unutmayınki komut satırındaki değer, ayar dosyasındaki değeri ezecektir.

-extensions section, -reqexts section bu seçenekler sertifika uzantılarını (-x509 seçeneği varsa) veya sertifika isteği uzantılarını içerecek alternatif bölümleri belirtir. Bu, çeşitli amaçlara yönelik istekleri belirtmek için aynı yapılandırma dosyasında birkaç farklı bölümün kullanılmasına izin verir.

default_md seçeneği, kullanılacak özet algoritmasını belirtir. Olası değerler arasında md5, sha1, sha256, mdc2 yer alır. Mevcut değilse MD5 kullanılır. Bu seçenek komut satırında geçersiz kılınabilir. Google SHA1'in yeterince güçlü olmadığını bu yüzden SHA2 (sha256) kullanacağını açıkladıktan bugüne sha1 kullanılmamaktadır.

  • Ayar dosyanızda [ CA_default ] bölümünde default_md = sha256 anahtar değer ikilisiyle belirtebilir
  • Veya komut satırında verebilirsiniz: $ openssl ... -sha256 ...

Ayar Dosyası Olmaksızın Kök Sertifika Üretmek

Ayarlar için openssl.cnf dosyasını biz vermedeğimiz için varsayılan ayar dosyasından bularak kullanacak

$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt

image

Oluşan dosyayı görüntüleyelim:

Dağıtılabilir kök sertifika

Kök sertifikayı nasıl anlarız?

Unutmayın Kök sertifika ve ara sertifka yetkilisinin sertifikasına "kök sertifika" denilir. Çünkü ara sertifika da bir kök sertifika tarafından imzalanmıştır. Bu terminolojik olarak bu tanımlamayı anladıktan sonra önce bir sertifikanın "Kök Sertifika" olup olmadığını nasıl anlarız ona bakalım, sonra "ara sertifika yetkilisinin kök sertifikasını" nasıl ayrıştırırız ona bakalım:

Veren Kuruluş Ayırt Edici Adı = issuer distinguished name (IDN) Verilen Kuruluş Ayırt Edici Adı = subject distinguished name (SDN)

Kök sertifikayı veren kurum ile alan (ya da verilen) kurum aynı ise kök sertifikayı buldunuz. Çünkü kök sertifikalar kimse tarafından imzalanmaz. Ancak ara sertifika yetkilisinin kök sertifikası başka bir kök sertifikayla imzalanır.

distinguish_root_cert

Bir ara sertifikanın ise "Veren - issuer" bilgisi verilenden farklıdır:

distinguish_inte_root_cert

Özetle Komutlarımız

sh-4.4$ openssl genrsa -des3 -out private/ca.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
...............................................................++++
...............................................................++++
e is 65537 (0x010001)
Enter pass phrase for private/ca.key:
Verifying - Enter pass phrase for private/ca.key:
sh-4.4$ chmod 400 private/ca.key
sh-4.4$ openssl req -config openssl.cnf \
>           -new -x509              \
>           -extensions v3_ca       \
>           -key private/ca.key     \
>           -out certs/ca.crt
Enter pass phrase for private/ca.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [TR]:
State or Province Name [Turkey]:
Locality Name [ANKARA]:
Organization Name [Ana Sertifika Yetkilisi (Root CA)]:
Organizational Unit Name [Kok Sertifika Uretim Bolumu]:
Common Name []:Ana Sertifika Yetkilisi (Root CA)
Email Address []:
sh-4.4$ chmod 400 certs/ca.crt
sh-4.4$ ls certs/ -l
total 3
-R-------a  1 cem.topkaya      2280 Haz 10 07:36 ca.crt
sh-4.4$ ls private/ -l
total 4
-R-------a  1 cem.topkaya      3365 Haz 10 07:35 ca.key
sh-4.4$ openssl x509 -in ca/certs/ca.crt -text -noout

Oluşturduğumuz kök sertifikayı tüm istemcilere dağıtarak güveni temin edebiliriz. Kök sertifikasını güvenilir sertifikalar listesine eklemezseniz sunucu sertifikaları oluşturduktan sonra kök sertifikayı göremezsiniz: image image

3. Kök Sertifikayı Güvenilir Kök Sertifikalarına Yüklemek

root_ca

image image image image

Windows+R ile açılan pencereye certlm.msc yazıp çalıştırın. Sistemdeki sertifikaları görüntüleyeceksiniz: image

Ara Sertifika Yetkilisi Oluşturma

Şu işlemlerin neticesinde ara sertifika yetkilisinin kullanabileceği dosyalaranı ( kök çiftini ) oluşturmuş olacağız:

  1. Gizli anahtarı oluşturmak (private key)
  2. Sertifika İmzalama İsteği (Certificate Sign Request) oluşturmak (Gizli anahtar kullanılarak)
  3. Sertifikayı oluşturmak (CSR Kullanılarak)

1. Gizli Anahtar Oluşturma

Kök sertifika yetkilisi son kullanıcı (sunucu/istemci tarafı) sertifikalarını doğrudan imzalamak yerine en az bir ara sertifika yetkilisine sağladığı kök sertifikayla imzalanmasını tercih eder. Unutmayalım ki bu bir zincir şeklinde imzalanan yapı olup en üstteki halkanın ele geçirilmesi halinde tüm zinciri kaybedebiliriz.

Önce bir gizli anahtar oluşturuyoruz:

$ openssl genrsa -aes256 -out intermediate/private/intermediate.key 4096

Oluşan gizli anahtarımızı doğrulayalım:
$ openssl rsa -in ca/intermediate/private/intermediate.key -check

Şifre sormaksızın oluşturmak için $ openssl genrsa -out intermediateCA.key 2048 komutu da çalıştırılabilir. image

2. Ara Sertifika Yetkilisinin Sertifika İmzalama İsteğinin Oluşturulması

Önce CSR (sertifika imzalama isteği) dosyası oluşturulmak için sertifikada görünecek bilgileri girecek

$ cd root
$ openssl req -config ca/intermediate/openssl.cnf   \
      -new -sha256                                  \
      -key ca/intermediate/private/intermediate.key \
      -out ca/intermediate/csr/intermediate.csr

Oluşan CSR dosyamızı doğrulayalım:
$ openssl req -text -noout -verify -in ca/intermediate/csr/intermediate.csr

Gizli anahtar ve CSR'nin Aynı Anda Oluşturulması da Mümkün

-out anahtarıyla CSR dosyası, -keyout anahtarıyla gizli anahtarı çıkartıyoruz:

$ openssl req -new -newkey rsa:2048 -nodes \
          -out csr/intermediate.csr        \
          -keyout private/intermediate.key \
          -config openssl.cnf

image


3. Ara Sertifika Yetkilisinin Sertifikasının Oluşturulması

$ cd root
$ openssl ca -config ca/intermediate/openssl.cnf   \
      -extensions v3_intermediate_ca               \
      -days 3650 -notext -md sha256                \
      -in  ca/intermediate/csr/intermediate.csr    \
      -out ca/intermediate/certs/intermediate.crt
      
Oluşan sertifikamızı doğrulayalım:
$ openssl x509 -in ca/intermediate/certs/intermediate.crt -text -noout

intermediate_ca

Sunucular İçin Sertifika oluşturma (Her sunucu için yapılır)

Buraya geldiysek epeyce ne, neden, ne belli sorularını cevaplamışsınız demektir. Şimdi ise CSR'nin rolünü görerek devam edelim.

Sunucu Sertifikası İçin CSR Oluşturmak

Özetle aşağıdaki adımlarla sunucu sertifikamızı oluşturacağız. Detayları ise özetin ardından bulabilirsiniz.

  1. Önce CSR dosyası için gizli anahtar dosyası oluşturacağız (xxx.key)
  2. Sonra gizli anahtarımızı kullanarak CSR dosyasını oluşturacağız (iki yöntemle yapabiliriz)
    1. Etkileşimli (komut satırı uygulaması sürekli bilgi girmemizi ister ve sonuçta yaratır)
    2. Etkileşimsiz (komut çalıştırılır ve sormadan dosyamızı üretir)
  3. Kök sertifikamızla CSR dosyasından sunucu sertifikası oluşturulur.

ÖZET

CSR ve Private Key birlikte veya ayrı ayrı oluşturulabilir

1. Birlikte

$ cd root/ca/intermediate
$ openssl req -new -newkey rsa:2048 -nodes   \
          -out    csr/musteri.com.tr.csr     \
          -keyout private/musteri.com.tr.key \
          -config openssl_musteri.com.tr.cnf

Konsolumuzda şuna benzer bir çıktı olmalı:

sh-4.4$ ls -l
total 10
drwx------  1 cem.topkaya         0 Haz 10 17:53 certs
drwx------  1 cem.topkaya         0 Haz  9 13:32 crl
drwx------  1 cem.topkaya         0 Haz 10 14:54 csr
-rw------a  1 cem.topkaya       309 Haz 10 15:21 index.txt
drwx------  1 cem.topkaya         0 Haz 10 15:21 newcerts
-rw------a  1 cem.topkaya      5955 Haz 10 22:16 openssl.cnf
-rw------a  1 cem.topkaya       735 Haz 11 00:12 openssl_musteri.com.tr.cnf
drwx------  1 cem.topkaya         0 Haz 10 08:28 private
-rw------a  1 cem.topkaya         6 Haz 10 15:21 serial
sh-4.4$
sh-4.4$
sh-4.4$ openssl req -new -newkey rsa:2048 -nodes \
>           -out      csr/musteri.com.tr.csr     \
>           -keyout   private/musteri.com.tr.key \
>           -config   openssl_musteri.com.tr.cnf
Generating a RSA private key
.......................+++++
.........................................+++++
writing new private key to 'private/musteri.com.tr.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Ulke [TR]:
Sehir [ANTALYA]:
Organizasyon ismi [Musteri E-Ticaret Sirketi Ltd. Sti.]:
Organizasyon Birimi [E-Ticaret Yazilim Gelistirme Birimi]:
Ortak Ad [*.musteri.com.tr]:
sh-4.4$
sh-4.4$
sh-4.4$ ls private/ -l
total 6
-rw------a  1 cem.topkaya      3380 Haz 10 08:28 intermediate.key
-rw------a  1 cem.topkaya      1732 Haz 11 00:17 musteri.com.tr.key
sh-4.4$ ls csr/ -l
total 4
-rw------a  1 cem.topkaya      1814 Haz 10 14:54 intermediate.csr
-rw------a  1 cem.topkaya      1270 Haz 11 00:17 musteri.com.tr.csr
sh-4.4$

2. Ayrı ayrı

Gizli anahtar oluşturulur:
$ openssl genrsa -out private/musteri.com.tr.key 2048

CSR Aşağıdaki Seçeneklerden birisiyle oluşturulabilinir:

Seçenek 1: "Tek satır komutla çalışsın" derseniz bu komutu:
$ openssl req -new -sha256 -key private/musteri.com.tr.key -subj "/C=TR/L=ANTALYA/O=Musteri E-Ticaret Sirketi Ltd. Şti./OU=E-Ticaret Yazilim Gelistirme Bolumu/CN=*.musteri.com.tr" -out csr/musteri.com.tr.csr

Seçenek 2: "Her bilgiyi ben tek tek girerim" derseniz bu komutu:
$ openssl req -new -key private/musteri.com.tr.key -out csr/musteri.com.tr.csr 

Seçenek 3: "Tamam bana sorsun ama varsayılan değerleri bir ayar dosyasından çeksin" derseniz bu komutu:
$ openssl req -new -key private/musteri.com.tr.key -out csr/musteri.com.tr.csr -config openssl.cnf

3. Sertifika Oluşturmak

$ cd /root/ca/intermediate
$ openssl x509 -req                        \
     -sha256                               \
     -days 3650                            \
     -in       csr/musteri.com.tr.csr      \
     -signkey  private/musteri.com.tr.key  \
     -out      newcerts/musteri.com.tr.crt \
     -CA       certs/intermediate.crt      \
     -CAkey    private/intermediate.key    \
     -CAcreateserial                       \
     -extensions v3_req                    \
     -extfile  openssl_musteri.com.tr.cnf

Sertifika oluştu, kontrol edelim:

$ openssl x509 -in newcerts/musteri.com.tr.crt -text -noout

openssl_musteri.com.tr.cnf

[req]
distinguished_name = dn
req_extensions     = v3_req

[dn]
C          = Ulke
C_default  = TR
L          = Sehir
L_default  = ANTALYA
O          = Organizasyon ismi
O_default  = Musteri E-Ticaret Sirketi Ltd. Sti.
OU         = Organizasyon Birimi
OU_default = E-Ticaret Yazilim Gelistirme Birimi
CN         = Ortak Ad
CN_default = *.musteri.com.tr
commonName_max = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage         = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName   = @alt_names

[alt_names]
DNS.1 = *.musteri.com.tr
DNS.2 = forum.musteri.com.tr
DNS.3 = sss.musteri.com.tr
IP.1 = 127.0.0.1
IP.2 = 192.168.56.1
IP.3 = 87.67.231.12

DETAYLI

1. CSR İçin Anahtar Dosyası Oluşturmak

$ openssl genrsa -out private/musteri.com.tr.key 2048

Gizli anahtarımız oluştu:

image

2. CSR Dosyasını Oluşturmak

CSR dosyasına gireceğiniz bilgileri

  1. oluştururken komut satırı arayüzü sorar, biz cevaplarız (etkileşimli-interaktif)
  2. bir ayar dosyasından verebilirsiniz (burada openssl.cnf dosya adını kullanacağım)
  3. komut satırına tüm bilgileri yazabilirsiniz

1. Komut Satırı Arayüzü (CLI) ile Etkileşimli

Csr'yi bu şekilde oluşturursanız, openssl size kuruluş ayrıntıları ve sertifikayı oluşturduğunuz web adresi olan Ortak Ad (CN) (örneğin, alanadim.com) gibi oluşturulacak sertifika hakkında sorular soracaktır.

$ openssl req -new -key private/musteri.com.tr.key -out csr/musteri.com.tr.csr

Aşağıdaki etkileşimle CSR oluşturduk:

image image

2. Ayar Dosyasıyla

openssl.cnf Adında bir dosyada tüm bu bilgileri tutup -config anahtarıyla dosya yolunu da verebiliriz

[req]
distinguished_name = dn
req_extensions     = v3_req

[dn]
C          = Ulke
C_default  = TR
L          = Sehir
L_default  = ANTALYA
O          = Organizasyon ismi
O_default  = Musteri E-Ticaret Sirketi Ltd. Sti.
OU         = Organizasyon Birimi
OU_default = E-Ticaret Yazilim Gelistirme Birimi
CN         = Ortak Ad
CN_default = *.musteri.com.tr
commonName_max = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage         = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName   = @alt_names

[alt_names]
DNS.1 = *.musteri.com.tr
DNS.2 = forum.musteri.com.tr
DNS.3 = sss.musteri.com.tr
IP.1 = 127.0.0.1
IP.2 = 192.168.56.1
IP.3 = 87.67.231.12

Aşağıdaki komutu çalıştırarak ek ayarları verebiliriz:

$ openssl req -new -key private/musteri.com.tr.key -out csr/musteri.com.tr.csr -config openssl.cnf

image

3. Komut Satırında Tek Komutla

Bu yöntem, yukarıdaki yöntemle (1. yöntem) aynı çıktıyı üretir, ancak otomasyonunuzda kullanım için uygundur.

$ openssl req -new -sha256 -key private/musteri.com.tr.key -subj "/C=TR/L=ANTALYA/O=Musteri E-Ticaret Sirketi Ltd. Şti./OU=E-Ticaret Yazilim Gelistirme Bolumu/CN=*.musteri.com.tr" -out csr/musteri.com.tr.csr

Ek yapılandırmayı geçmeniz gerekiyorsa, -config parametresini kullanabilirsiniz, örneğin burada sertifikama alternatif adlar eklemek istiyorum.

$ openssl req -new -sha256                                 \
    -key private/musteri.com.tr.key                                \
    -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=*.musteri.com.tr"  \
    -reqexts SAN                                           \
    -config <(cat /etc/ssl/openssl.cnf                     \
        <(printf "\n[SAN]\nsubjectAltName=DNS:*.musteri.com.tr,DNS:forum.musteri.com.tr,DNS:sss.musteri.com.tr,IP:127.0.0.1,IP:192.168.56.1")) \
    -out csr/musteri.com.tr.csr

csr'nin içeriğini doğrulayın

$ openssl req -in csr/musteri.com.tr.csr -noout -text

image

3. CA Kök Anahtarıyla CSR ve Gizli Anahtarı Kullanarak Sertifika Oluşturmak

Aşağıdaki komutla doğrudan sertifikanızı oluşturursunuz ama kök sertifikası olmaz. Yani bir sertifika yetkilisi tarafından verilmiş bir sertifika gibi olmaz.

$ openssl x509 -req                      \
    -sha256                              \
    -days    3650                        \
    -in      csr/musteri.com.tr.csr      \
    -signkey private/musteri.com.tr.key  \
    -out     newcerts/musteri.com.tr.crt \
    -extensions v3_req                   \
    -extfile    openssl.cnf

image image image

Eğer kök sertifikasını da komut satırına eklerseniz artık kök sertifikalı bir sertifika üretmiş olacaksınız. Ama kök sertifika yaratırken kullandığınız şifreyi burada soracaktır:

$ openssl x509 -req             \
    -sha256                     \
    -days 3650                  \
    -in      csr/musteri.com.tr.csr       \
    -signkey private/musteri.com.tr.key   \
    -out     newcerts/musteri.com.tr.crt  \
    -extensions v3_req                    \
    -CA rootCA.crt -CAkey rootCA.key -CAcreateserial \
    -extfile openssl.cnf

image image image

Şimdi diyeceksiniz ki; "tekrar openssl.cnf yi vereceksem neden csr yarattım?" Zaten CSR yaratırken openssl.cnf içindeki bilgileri vermiştiniz ama sertifika yaratırken tekrar veriyoruz.

En sevimsiz cevaptan başlayayım:

  1. CSR oluştururken openssl.cnf dosyasında DNS ve IP bilgilerini CSR'den kopyalanabilir olsun diye copy_extensions = copy ayarı ekledim. Ancak openssl ca komutuyla çalıştırıyor olursak bu kopyalama işlemi yapılabilir. Eğer ca değilde x509 komutuyla sertifika oluşturmak istersek -extensions anahtarına vereceğimiz bölüm adını ve bölümü içeren ayar dosyasınıda -extfile anahtarına değer olarak vermemiz gerekir.
  2. CSR'ın kullanım amacını tekrar hatırlayalım: Sertifika İmzalama İsteği (CSR), özel anahtarınızı ifşa etmeden sertifika oluşturma sürecine üçüncü bir taraf eklemek için bir araçtır. Esasen, imzalanmak üzere üçüncü tarafa gönderilebilen bir kodlanmış bilgi paketi (ortak anahtar dahil) olan CSR'yi üçüncü tarafa (sertifika yetkilisine) gönderirsiniz, orta veya kök sertifikalarıyla imzalar ve sertifikayı size geri gönderir. Daha da iyisi, üçüncü tarafın tüm süreç boyunca özel anahtarınıza asla erişimi yoktur çünkü CSR oluşturmak için önceden yarattığınız özel anahtarınızı (private key) kullanmış olursunuz.

Bu durumda -signkey parametresini komutunuzda kullanmanız gerekmez:

$ openssl x509 -req                  \
    -sha256                          \
    -days 3650                       \
    -in csr/musteri.com.tr.csr       \
    -out newcerts/musteri.com.tr.crt \
    -extensions v3_req               \
    -CA rootCA.crt -CAkey rootCA.key -CAcreateserial \
    -extfile openssl.cnf

image

image

server_cert

Sertifikanın içeriğini doğrulayın

$ openssl x509 -in musteri.com.tr.crt -text -noout

image

Node https Sunucusunda Sertifikayı Kullanalım

Buraya kadar çok farklı sertifika üretme yöntemlerinden geçerek geldiniz.

  • Kendinden imzalı sertifika
  • Kök sertifika imzalı sertifika
  • Şifreli veya şifresiz gizli anahtar
  • subjectAltNames bilgisi olan veya olmayan

sertifikalar üretip bu noktaya kadar geldiniz. Kısaca "ne olursa ne yapmalısınız" başlıklarını hızlıca geçelim:

Eğer kendinden imzalı bir sertifika üretmişseniz sadece sertifika bilgisini girerseniz ERR_SSL_VERSION_OR_CIPHER_MISMATCH hatası alırsınız ki bu da gizli anahtarınızı da options nesnesine key anahtarını atamanızı gerektirir (key:'gizli anahtarınızın dosya yolu.key').

 options = {	
      key  : fs.readFileSync('./gizliAnahtar.key'), 
      cert : fs.readFileSync('./sertifika.crt') 
  }

Gizli anahtarınıza şifre atarsanız https.createServer(options, ... options nesnesine bu özelliği eklemelisiniz: passphrase:'şifrenizi_buraya_yazın'. Eğer gizli anahtara şifre atamadıysanız passphrase özelliğine gerek yok.

 options = {	
      key        : fs.readFileSync('./gizliAnahtar.key'), 
      passphrase : "şifrenizi_buraya_yazın",
      cert       : fs.readFileSync('./sertifika.crt') 
  }

Eğer bir kök veya ara sertifikayla imzalanmış bir sertifikanız varsa options nesnesine ca:'ara_veya_kok_sertifikaniz.crt' özelliğini eklemelisiniz.

 options = {	
      key        : fs.readFileSync('./gizliAnahtar.key'), 
      passphrase : "şifrenizi_buraya_yazın",
      cert       : fs.readFileSync('./sertifika.crt') ,
      ca         : fs.readFileSync('./ara_kok_sertifika.crt')
  }

Sertifikalarınızı (kendi ve kök-ara sertifikalarınız) bir satır boşluk gelecek şekilde birleştirip tek bir cert dosyasıyla da verebilirsiniz. Böylece ca özelliğine gerek kalmaz.

Eğer subjectAltNames içinde DNS ve IP bilgileri girilmiş ise hosts dosyanızda gerekli ayarları eklemelisiniz ki internet gezgini sertifikayla aynı adrese gittiği için hata üretmemiş olsun.

Sertifikamızı hizmete almak için sunucu rolünü oynayacak bir node.js uygulaması geliştirip web tarayıcısından deniyoruz.

image image

Tabiki hosts dosyasını değiştirmelisiniz:

image

Karşılıklı Kimlik Doğrulaması

Karşılıklı SSL kimlik doğrulaması veya sertifika tabanlı karşılıklı kimlik doğrulaması, sağlanan dijital sertifikayı doğrulayarak birbirlerini doğrulayan iki tarafa atıfta bulunur, böylece her iki taraf da diğerlerinin kimliğinden emin olur.

Teknoloji açısından,

  • bir sunucuya (web sitesi veya sunucu uygulaması)
  • kendilerini doğrulayan bir istemciye (web tarayıcısı veya istemci uygulaması)
  • ve bu sunucu da güvenilir sertifika yetkilisi tarafından verilen ortak anahtar sertifikasına/dijital sertifikaya ihtiyaç vardır.

Bu yapıda sunucu kendisini doğrulayabilecek bir sertifikayı istemciye verir ve istemci bu sertifikayı bir yetkili (CA) üstünden doğrular. Aynı şekilde sunucu bu kez istemcinin kendisini doğrulaması için bir sertifika talebinde bulunur. İstemci bu isteğe kendi sertifikasını göndererek cevap verir. Sunucu tarafına gelen istemci sertifikası, sertifika yetkilisine doğrulatılır ve aralarındaki iletişim başlatılır.

image

Kimlik doğrulama dijital sertifikalara dayandığından, Verisign veya Microsoft Sertifika Sunucusu gibi sertifika yetkilileri, karşılıklı kimlik doğrulama işleminin önemli bir parçasıdır.

İstemci Tarafı İçin Sertifika Oluşturmak

Özet ve Detaylı anlatımlarda adımlarını bulabilirsiniz.

Sunucu tarafına sertifika oluşturur gibi istemci tarafı için sertifika oluşturuyoruz.

Gizli anahtar ve CSR dosyasını oluştur:
$ openssl req -config openssl_browser.cnf \
          -newkey rsa:2048 -sha256 -nodes \
	  -keyout browser.cinar.key \
	  -out browser.cinar.csr -outform PEM

Bu sertifikayı .p12 formatında çıkartıyoruz. Bizden şifreyle korunabilmesi için şifre tayin etmemizi isteyecek. 2 Kez girdikten sonra bu şifreyi unutmayın, internet gezginlerinde bu şifreyle içeri alabiliriz.

$ openssl pkcs12 -export -clcerts -in browser.cinar.crt -inkey browser.cinar.key -out browser.cinar.p12

PKCS#12 (.pfx or .p12) dosyamızı doğrulamak için:
$ openssl pkcs12 -info -in browser.cinar.p12

İstemci ve sunucu rolündeki bilgisayarlarımıza kök sertifikayı yüklüyoruz. Chrom browser için "Ayarlar -> Gizlilik ve Güvenlik -> Https/SSL Sertifikalarını ve ayarlarını yönetme" yolundan giderek penceremizi açıyoruz

image

image

image

pfx yaparken kullandığımız şifreyle içeri almazsak hata alırız:

image

Nereye kaydedeceğiniz size kalmış.

image

image

Gelen ekranları da geçerek sertifikamızın browser görebileceği şekilde yüklemesini tamamlamış oluyoruz:

image image

Web sunucumuzda hem sunucu sertifikasını hem de kullandığımız kök sertifikayı ve istemciden sertifika istediğimizi, vermezse iletişimi reddedeceğimizi belirtiyoruz:

const https = require('https');
const fs = require('fs');

const options = {
    key: fs.readFileSync('./www.cinar.key'),
    cert: fs.readFileSync('./www.cinar.crt'),  
    ca: fs.readFileSync('./certs/rootCA.crt'), 
    requestCert: true, 
    rejectUnauthorized: true
};

https.createServer(options, function (req, res) {

    console.log(`
	  ${new Date()} 
	    ${req.connection.remoteAddress} 
	    ${req.method} ${req.url}
	    ${req.socket.getPeerCertificate().subject.CN} 
	`); 
    res.writeHead(200); 
    res.end("hello world\n"); 
	
}).listen(8000);

image

Chrom üstünden istek yaptığımızda:

image

İkinci onay ekranı gelir:

image

Ve sayfamız peşine gelir:

image

Sertifika İptal Listesi (Certificate Revocation List CRL)

Sertifika iptal listesi (CRL), iptal edilen sertifikaların bir listesini sağlar. Web tarayıcısı gibi bir istemci uygulaması, ziyaret edilen alan adını barındıran sunucunun orijinalliğini kontrol etmek için bir CRL kullanabilir. Apache veya OpenVPN gibi bir sunucu uygulaması, artık güvenilmeyen istemcilere erişimi reddetmek için bir CRL kullanabilir. VPN Yapan binlerce kullanıcınızın bağlantı için kullandığı sertifikanın geçerliliği konusunda CRL listesi zaman içinde değişikliklerden kaynaklanan yetkisiz erişimleri tespit etmek için en iyi yoldur.

image

Bir Web tarayıcısı TLS kullanarak bir siteyle bağlantı kurduğunda, Web sunucusunun dijital sertifikasında anormallikler veya sorunlar olup olmadığı kontrol edilir; bu işlemin bir kısmı, sertifikanın Sertifika İptal Listesinde listelenmediğini kontrol etmeyi içerir. Bu denetimler, herhangi bir sertifika tabanlı işlemde çok önemli adımlardır çünkü bir kullanıcının sitenin sahibinin kimliğini doğrulamasına ve Sertifika Yetkilisinin dijital sertifikayı hâlâ güvenilir olarak değerlendirip değerlendirmediğini keşfetmesine izin verir.

X.509 standardı, açık anahtar (public key) altyapısı için bir CRL'nin biçimini ve anlambilimini tanımlar. Sertifika İptal Listesindeki her giriş, iptal edilen sertifikanın seri numarasını ve iptal tarihini içerir. Kurcalamayı önlemek için CRL dosyası Sertifika Yetkilisi tarafından imzalanır. Yalnızca bir süre için iptal geçerli olacaksa; zaman sınırlaması ve iptali nedeni isteğe bağlı olarak CRL içinde yer alır. Özetle CRL; geri döndürülemez şekilde iptal edilmiş veya geçici olarak geçersiz (basılı) olarak işaretlenmiş sertifikalar içerir.

Dijital sertifikalar birçok nedenden dolayı iptal edilir.

  • Bir CA, örneğin uygun olmayan bir sertifika verdiğini fark ederse, orijinal sertifikayı iptal edebilir ve yeni bir sertifikayı tekrar verebilir.
  • Veya bir sertifikanın sahte olduğu keşfedilirse, CA sertifikayı iptal eder ve CRL'ye ekler.
  • İptal etmenin en yaygın nedeni, bir sertifikanın gizli anahtarının güvenliği ihlal edildiğinde ortaya çıkar.
  • Sertifika sahibinin artık sertifikanın verildiği alan adına sahip olmaması,
  • sertifikanın sahibinin işlemlerini tamamen durdurması vs.

Sertifika İptal Listelerindeki sorun, tüm kara listelerde olduğu gibi, bunların bakımının zor olması ve kritik bilgileri gerçek zamanlı olarak dağıtmanın verimsiz bir yöntem olmasıdır.

Tarayıcının CRL İsteği Nasıl İşlenir?

  1. Bir sertifika yetkilisi bir tarayıcıdan CRL isteği aldığında, CA'nın yönettiği tüm iptal edilen sertifikaların tam bir listesini döndürür.
  2. Tarayıcı daha sonra istenen sitenin sertifikasının iptal edilip edilmediğini belirlemek için listeyi ayrıştırmalıdır.
  3. CRL saatte bir güncellenebilse dahi, bu zaman aralığında iptal edilmiş bir sertifikanın kabul edilmesine izin verebilir, çünkü özellikle CRL'ler, bunları tekrar tekrar indirmeyle ilgili ek yükü önlemek için önbelleğe alınır.
  4. Ayrıca, CRL kullanılamıyorsa, sertifika kabulüne bağlı tüm işlemler engellenir.
  5. Farklı tarayıcılarda CRL'ler farklı işlediğinden başka güvenlik açıkları oluşabilir. Genişletilmiş Doğrulama Sertifikası (Extended Validation Certificate) olmadığı sürece, bazı tarayıcılar yalnızca sunucu sertifikasının geçerliliğini kontrol eder ve doğrulama için gerekli olan tüm sertifika zincirini kontrol etmeye çalışmaz. Örneğin, Mozilla Firefox ve Linux'taki Google Chrome, standart ikili biçimde yayınlanan CRL'leri destekler, ancak metin tabanlı bir formatta oldukları için RSA Security'nin CRL'lerini işleyemez. Buna rağmen, bağlantının uyarı vermeden devam etmesine izin vereceklerdir.

CRL Listesini Sorgulama

1. cRLDistributionPoints Uzantısıyla

CRL'yi herkes tarafından erişilebilir bir yerde yayınlayın (ör. Http://example.com/intermediate.crl.pem). Üçüncü taraflar, güvendikleri sertifikaların iptal edilip edilmediğini kontrol etmek için CRL'yi bu konumdan alabilir. CRL'nin Kontrol edilebilmesi için sertifika oluştururken cRLDistributionPoints uzantısına vereceğimiz değerde geçerli olan URL adresiyle CRL listesine erişilebilinir.

[ server_cert ]
# ... snipped ...
crlDistributionPoints = URI:http://example.com/intermediate.crl.pem

Bir cRLDistributionPoints uzantısı, CRL'nin alınabileceği bir veya daha fazla DistributionPoints içerebilir. Yani birden fazla URL ile CRL listelerini sunabilirsiniz.

Her dağıtım noktası (DistributionPoint), her biri isteğe bağlı olan üç alandan oluşur:

  • distributionPoint: Genel adların bir SIRASI veya tek bir değer içerir. Bir dağıtım Noktası, CRL'nin nerede depolandığını gösteren bir veya daha fazla genel ad içerebilir nedenleri ,: cRLIssuer: CRL'yi imzalayan ve veren varlığı tanımlar Bu yazıda yalnızca dağıtımın ayarlandığı durumu ele alacağız. OpenSSL burada cRLDistributionPoints uzantısıyla nasıl sertifika oluşturulacağını göstermek için kullanılır. Ancak bundan önce, daha sonra kullanılabilmeleri için önce normal anahtarlar ve sertifikalar üretmemiz gerekiyor.

2. Çevrimiçi Sertifika Durum Protokolüyle (Online Certificate Status Protocol - OCSP)

Çevrimiçi Sertifika Durum Protokolü (OCSP) CRL kullanımına alternatiftir. Tarayıcı, en son CRL'yi indirmek ve istenen bir URL'nin listede olup olmadığını kontrol etmek yerine, söz konusu sitenin sertifikasını Sertifika Yetkilisine gönderir. CA daha sonra bu sertifika için "iyi", "iptal edilmiş" veya "bilinmeyen" değerini döndürür. Bu yaklaşımda, kullanılmadan önce ayrıştırılması gerekmeyen çok daha az veri aktarır. Sertifika iptal durumunu hangi yöntemle denetleyeceğinizi belirlemek, tarayıcılar arasında değişiklik gösterebilir ve bazı durumlarda tarayıcının hangi işletim sisteminde (OS) çalıştığına bağlı olacaktır.

Bir Sertifika Yetkilisi (CA) İçin Dizin/Dosya Yapısı

.
├── certs
├── crl
├── crlnumber
├── csr
├── index.txt
├── newcerts
├── private
└── serial

image

certs ve private Dizinleri anahtar çiftlerini tutuyor olacak. Sertifikaları certs dizininde, gizli anahatarları private dizininde tutacağız.

csr Dizininde istek yapacağımız sertifika talepleri için hazırlayacağımız, gizli anahtarı ve sertifika bilgilerini içinde saklayacağımız .csr dosyalarını tutacağız.

crl Dizininde ise bu sertifika yetkilisinin iptal ettiği sertifikaların listesini tutuyor olacağız.

index.txt Dosyalarını veritabanı dosyaları olarak düşünebiliriz.

crlnumber Dosyasında bir index numarası tutulur ve openssl her sertifika iptal listesine yeni kayıt geldiğinde bu numarayı otomatik arttırır.
Sertifika Yetklisi için hazırladığımız dizinde (kök CA ve onun ara sertifika yetkilileri (CA) için hazırladığımız dizinlerde) aşağıdaki komutla bir crlnumber dosyasını oluşturur ve için örneğin 1000 değeri yazmak için aşağıdaki komutu çalıştırabilirsiniz:

$ echo 1000 > crlnumber

CRL Number İptal Listesi

image

CRL Sayısının otomatik arttırıldığını, crlnumber.old dosyasında echo 01 > crlnumber komutuyla oluşturduğumuza dikkat ederek inceleyiniz.

serial da tıpkı crlnumber gibi bir dosya ve yine aynı şekilde otomatik arttırlan indeks sayısı tutmaktadır. index.txt dosyası gibi serial dosyalası da, imzalanan sertifikaları takip etmek için düz bir dosya veritabanı görevi görür. Ve aynı şekilde yaratılabilir:

$ echo 1000 > serial

CRL Oluşturmak

openssl.cnf Dosyasında CRL için ayarları inceleyelim.

  • [ca] Olmazsa olmaz bölümümüz. Bu bölümü okuyarak ayarları yapmaya başlıyor openssl uygulaması.
  • [CA_default] bölümünde varsayılan ayarları saklıyoruz. İstediğiniz adı verebilirsiniz ama [ca] içinde default_ca değişkenine adreslemesiniz.
  • $dir değişkenine kök dizinimizin yolunu atıyoruz.
  • $crl değişkeninde iptal edilecek sertifika listemizi saklayacağımız dizini tutuyoruz.
  • [crl_ext] bölümünde CRL bilgisi için ekstra ayarları tanımlıyoruz
  • authorityKeyIdentifier=keyid:always,issuer:always AuthorityKeyIdentifier uzantısı, bir sertifika yetkilisinin (issuer) birden fazla imzalama anahtarına sahip olduğu durumlarda kullanılır. Sertifika yetkilisinin aynı anda birden fazla eşzamanlı anahtar çifti (public, private key) olabilir veya değişim nedeniyle yenilenen anahtar çiftleri olabilir.
# OpenSSL root CA configuration file.
# Copy to `/root/ca/openssl.cnf`.

[ ca ]
# `man ca`
default_ca = CA_default

[ CA_default ]
# Directory and file locations.
dir               = /root/ca
...
crl_dir           = $dir/crl
...
serial            = $dir/serial
...

# For certificate revocation lists.
crlnumber         = $dir/crlnumber
crl               = $dir/crl/ca.crl.pem
crl_extensions    = crl_ext
default_crl_days  = 30
...

[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always

[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
# Sıralama önemli olabiliyor. authorityKeyIdentifier dan önce subjectKeyIdentifier'ın gelmesi gibi.
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning

Sertifika İmzalama İsteği (Certificate Sign Request)

Sertifikanız olsun istiyorsunuz ve biliyorsunuzki hem açık hem gizil anahtarınız olmalı (dikkat gizli anahtar eğik yazıldı!). Sertifika yetkilisi sizin için bir RSA anahtar çifti yaratır ve x509 v3 formatında saklayabileceği şekilde size ait bilgileri de girerek bir sertifika üretip size verdi.

Bir sertifika imzalama isteği içerisinde açık anahtarı ve sertifika sahibini ayırt edici bilgileri içerir. openssl ca ile sertifika oluşturmak istersek CSR içine uzantıların kopyalanması için copy_extensions ayarıyla x509 v3 ile gelen uzantıları (subjectAltName gibi).

copy_extensions

sertifika isteklerindeki uzantıların nasıl ele alınacağını belirler.

  • none: Hiçbiri olarak ayarlanırsa veya bu seçenek yoksa uzantılar yok sayılır ve sertifikaya kopyalanmaz.
  • copy: Kopyalanacak şekilde ayarlanırsa, istekte bulunmayan uzantılar zaten mevcut değil sertifikaya kopyalanır.
  • copyall: Hepsini kopyala olarak ayarlanırsa, istekteki tüm uzantılar sertifikaya kopyalanır: uzantı sertifikada zaten varsa, önce silinir. Bu seçeneği kullanmadan önce UYARILAR bölümüne bakın. Bu seçeneğin ana kullanımı, bir sertifika isteğinin SubjectAltName gibi belirli uzantılar için değer sağlamasına izin vermektir. (kaynak)

CSR veya Sertifika İmzalama isteği, SSL Sertifikası için başvururken Sertifika Yetkilisine (CA) verilen kodlanmış metin bloğudur, oluşturmak istediğiniz sertifikanın ayrıntılarını belirttiğiniz yerdir. CSR (Sertifika İmzalama İsteği) genel anahtarınızı ve sertifikaya eklenecek bazı ek genel bilgileri içerir. CSR hiçbir zaman özel bir anahtar içermez.

CSR Dosyasıyla oluşturduğunuz bu istek, sertifikayı oluşturmak için Kök anahtarının sahibi tarafından (bu durumda daha önce oluşturduğunuzdan beri) işlenir. Natro, Radore, Doruknet gibi alan adı ve barındırma hizmeti veren kurumların üstünden bir sertifikaya kaydolmadan önce, Web sunucunuzdan bir Sertifika İmzalama İsteği (CSR) oluşturabilirsiniz.

Dikkat: CSR oluştururken Ortak Ad alanına sunucu sertifikası olduğu için alan adını, eğer wildcard ise *.sirketim.com.tr şeklinde yazmalıyız. Eğer erişmek istediğiniz alan adı www.sirketim.com.tr veya forum.sirketim.com.tr iken sertifika başvurusu için hazırladığınız CSR dosyasına CN (ortak ad) bilgisini sirketim.com.tr olarak verilmişse uyarı mesajıyla karşılaşırsınız.

Dikkat: Bir web sunucusuyla (örneğin Apache) kullanmak için bir şifreleme çifti oluşturuyorsanız, web sunucusunu her yeniden başlattığınızda bu şifreyi girmeniz gerekir. Bu yüzden gizli anahtar oluştururken -aes veya des3 parametrelerini es geçebilirsiniz.

Dikkat: CSR dosyası her şeyden bağımsızdır! Bu yüzden oluştururken başka bir dosyayı parametre olarak vermemiz gerekmeyip sadece sertifikada olması gerekecek bilgileri kapsayacak.

Genellikle sertifikanın yükleneceği sunucuda oluşturulur ve sertifikaya dahil edilecek

  • kuruluş adı (Organization (O)),
  • kuruluş içinde sertifikayı isteyen bölümün adı (Organizational Unit (OU)),
  • ortak ad (etki alanı adı Common Name (CN)),
  • yer (Locality or City (L)),
  • ülke (Country Name (C)),
  • eyalet veya bölge (State or Province (S)),
  • sertifikanın kullanılabileceği alan adları ve/veya IP adresleri (SAN),
  • ayrıca sertifikaya dahil edilecek açık anahtarı (public key) içerir. Özel anahtar genellikle CSR'yi oluşturduğunuz anda oluşturulur ve bir anahtar çifti oluşturur. Bir CSR genellikle PKCS#10 spesifikasyonuna göre ASN.1 kullanılarak kodlanır.

Örnek olması adına turkiye.gov.tr adresinin ssl sertifikasına bakalım:

image

Ortak Ad (CN Common Name)

Tam Nitelikli Etki Alanı Adı (FQDN) olarak da bilinen Ortak Ad (CN), ayırt edici ad olarak karakteristik değerdir. Sistem mühendisi olarak şirketinizin bir etki alanı (domain name) var ve CN tanımında genellikle, Ana Bilgisayar Etki Alanı Adı kullanılır "www.digicert.com" veya "digicert.com" gibi görünür. Sertifikasyonun son noktası olarak bir web sunucuda kullanılacak sertifikanın ortak adının alan adıyla aynı olmasına dikkat ediniz!

image image image image image image image

Önemli: İmza isteğini oluştururken, hizmetin IP adresini veya alanı adını sağlayan Ortak Ad (Common Name) belirtmenin önemli olduğunu, aksi takdirde sertifikanın doğrulanamayacağını unutmayın.

Dikkat! Ortak Ad bilgisi genellikle yanlış yorumlanır ve yanlış doldurulur. Kuruluşunuzun gerçek adını ortak adınız olarak kullanmayın! Son sertifika oluşturulurken alan adını veya Ana Makina adını ortak ad kısmında kullanmalısınız.

Konu Alternatif Adı uzantısı (SAN Subject Alternative Name)

Konu Alternatif Adı uzantısı (Subject Alternative Name), sertifikanın konusuna ek kimliklerin bağlanmasına izin verir. DNS adı (dNSName) uzantısı, SSL sertifikasına tam bir ek etki alanı adı eklemek için kullanılır.

image

Bakalım stackoverflow kaç yerde aynı sertifikayı kullanabilecek şekilde oluşturmuş: image

Sertifika imzalama isteğinin içerisindeki açık anahtarı görüntülemek için $ openssl req -pubkey -noout -in request.csr komutunu çalıştırabiliriz.

$ openssl req -pubkey -noout -in musteri.com.tr.csr
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6d3nvbPnuS2/4PMrs/r/
Liq1wT9vI0JK1BaYl+j/FNHdjIu3+mjQO7ari1QfU6ywe4TBjfLWLvBGS8xoUj3Q
e92jYsVnrxhRndKOPQEtzCaICbL7rgHdEHWW6lLm+5RWZjYQ4TvcyrKzj0c6WPFA
/k2eR9JFrmheBhGkk82vFJqM5yPCJL/MNshZ1fkPeIZ0xU/DifgNWdViiUhES86K
8Tvl+TNxGntTLOhhv+JG7N613lPGIhPhZG/mMjm6OjrT4uCN3Eujcd+3sec4sK8+
SpOTr0sWBXwAlyn+0WQMUX4d+qyNjdLL/+oBRfqOyCCuG1srSxkfw1Tw6HEQfkvY
sQIDAQAB
-----END PUBLIC KEY-----

cem.topkaya@CEM-TOPKAYA-PC C:\Users\cem.topkaya\Temp\nrf_root_intermediate_CA\root\ca\intermediate\csr
$ cat musteri.com.tr.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIDYDCCAkgCAQAwgZYxCzAJBgNVBAYTAlRSMRAwDgYDVQQHDAdBTlRBTFlBMSww
KgYDVQQKDCNNdXN0ZXJpIEUtVGljYXJldCBTaXJrZXRpIEx0ZC4gU3RpLjEsMCoG
A1UECwwjRS1UaWNhcmV0IFlhemlsaW0gR2VsaXN0aXJtZSBCaXJpbWkxGTAXBgNV
BAMMECoubXVzdGVyaS5jb20udHIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDp3ee9s+e5Lb/g8yuz+v8uKrXBP28jQkrUFpiX6P8U0d2Mi7f6aNA7tquL
VB9TrLB7hMGN8tYu8EZLzGhSPdB73aNixWevGFGd0o49AS3MJogJsvuuAd0QdZbq
Uub7lFZmNhDhO9zKsrOPRzpY8UD+TZ5H0kWuaF4GEaSTza8UmoznI8Ikv8w2yFnV
+Q94hnTFT8OJ+A1Z1WKJSERLzorxO+X5M3Eae1Ms6GG/4kbs3rXeU8YiE+Fkb+Yy
Obo6OtPi4I3cS6Nx37ex5ziwrz5Kk5OvSxYFfACXKf7RZAxRfh36rI2N0sv/6gFF
+o7IIK4bWytLGR/DVPDocRB+S9ixAgMBAAGggYMwgYAGCSqGSIb3DQEJDjFzMHEw
CQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwVwYDVR0RBFAwToIQKi5tdXN0ZXJpLmNv
bS50coIUZm9ydW0ubXVzdGVyaS5jb20udHKCEnNzcy5tdXN0ZXJpLmNvbS50cocE
fwAAAYcEwKg4AYcEV0PnDDANBgkqhkiG9w0BAQsFAAOCAQEAvz1A2NreRdSMJtAh
0PCfcEtpavO1tSnvnW27Pkvxr6X1MbsW/c6YDxNmG3lToWs9cgrlRipDQAT88K43
AD5mBuAv/dzfnEAYFNwewvxTXZ+DiqkEAnSni1R1HZkm+jWaUnA4vm15g+ogOjpY
DT4NaoNzoSfPnxiPT7VCTP3i9BicQjjqyxWglp4Hc8fV1bYATXUM+41lybmnOCt2
9y6si459J5w/tNRTl11pHmaj4yUBmsCZMBiS1DVh2iPQqIVYZWrfb7f+ZLQ4lYKY
ySPwy/x/Fmw5TdujwIXvyyYlCWugZCf4nNP/cnJaKXU6Sk6uLfdwidh7tdcb9B67
txCAgQ==
-----END CERTIFICATE REQUEST-----

CSR Doğrulama

OpenSSL "req -verify" komutunu çalıştırırken "yanlış imza uzunluğu" (wrong signature length) hatası alıyorsanız, doğrulamaya çalıştığınız CSR'de geçersiz dijital imza var demektir. Bir CSR'nin geçersiz dijital imzası olması için 2 ana olasılık vardır:

  1. CSR birisi tarafından değiştirildi.
    • CSR sizin tarafınızdan oluşturulduysa, ilk vakanın gerçekleşmesi olası değildir. Birisi bilgisayarınızı hacklemedikçe.
  2. CSR yanlış özel anahtarla imzalandı.
    • Bir sertifikayı CSR'ye dönüştürür ve yanlış özel anahtarla imzalarsanız ikinci durum oluşabilir. Örneğin, sunucu sertifikanızın süresinin dolmak üzere olduğunu görürsünüz. Böylece onu indirir ve yeni bir CSR'ye dönüştürmek için x509 -x509toreq komutunu kullanırsınız. Bu, yeni CSR'nin mevcut sertifika ile tam olarak aynı DN (Ayırt Edici Ad) alanlarına sahip olmasını sağlar. Ancak dikkat ediniz, sertifikadaki genel anahtarla eşleşen gizli anahtarı bulamaz ve openssl x509 -x509toreq ile başka bir gizli anahtar kullanamazsanız, yukarıda listelenen 2'inci durumun gibi geçersiz bir CSR ile sonuçlanır.

Sertifikadan CSR oluşturmak

Sertifikanızın süresi bitmek üzere ve yenilemek için tekrar sertifika imzalama isteği (CSR) oluşturmaya eriniyorsunuz diyelim. Sertifikanızın gizli anahtarına gözünüz gibi baktınız ve kimselerin eline geçmediğine eminsiniz. O halde aşağıda gösterildiği gibi OpenSSL'in x509 modülüyle -x509toreq parametresini kullanarak bir sertifikayı CSR'ye dönüştürebilirsiniz (dosya uzantılarına bakmayın çünkü formatlara göre uzantılar değişebilir):

$ openSSL x509 -x509toreq \
        -in hali_hazırdaki_serfitikaniz.crt  \
        -signkey sertifikanizin_gizli_anahtari.pem \
        -out sertifikadan_csr_dosyaniz.csr

image

image

Windows Üstünde Sertifika İmzalama İsteği Oluşturmak

image

image

image

image

image

csr_olusturma_windows

image

Artık .req uzantısına sahip bir CSR dosyası oluşturduk. Bu dosyanın içinden gizli anahtarımızı çıkartalım ve PEM formatında KEY dosyasına dönüştürelim:

req_extract_pfx_private_key

$  pkcs12 -in sertifika_isteginin_gizli_anahtari.pfx \
           -nocerts \
           -out gizli_anahtar.pem

OpenSSL'e Dair (open Secure Socket Layer protocol)

OpenSSL Projesi, Güvenli Yuva Katmanı (SSL v2/v3) ve Aktarım Katmanı Güvenliği (TLS v1) protokollerini uygulayan sağlam, ticari düzeyde, tam özellikli ve açık kaynak araç seti geliştirmek için genel amaçlı şifreleme kitaplığı ve uygulamasıdır (belgelendirme konusunda kötü ünvana sahip olsa da).

OpenSSL, Apache tarzı bir lisans altında lisanslanmıştır, bu temelde lisansı bazı basit lisans koşullarına tabi ticari ve ticari olmayan amaçlarla almakta ve kullanmakta özgür olduğunuz anlamına gelir.

image

Hangi versiyon OpenSSL kurulu olduğunu anlamak için özetle $ openssl version detaylı:

$ openssl version -a
OpenSSL 1.1.1d  10 Sep 2019
built on: Wed Sep 11 13:24:44 2019 UTC
platform: VC-WIN64A
options:  bn(64,64) rc4(16x,int) des(long) idea(int) blowfish(ptr)
compiler: cl /Z7 /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -D_USING_V110_SDK71_ -D_WINSOCK_DEPRECATED_NO_WARNINGS -D_WIN32_WINNT=0x0502
OPENSSLDIR: "C:\Program Files\Common Files\SSL"
ENGINESDIR: "C:\Program Files\OpenSSL\lib\engines-1_1"
Seeding source: os-specific
$ openssl
OpenSSL> help
Standart komutlar
asn1parse         ca                ciphers           cms
crl               crl2pkcs7         dgst              dhparam
dsa               dsaparam          ec                ecparam
enc               engine            errstr            gendsa
genpkey           genrsa            help              list
nseq              ocsp              passwd            pkcs12
pkcs7             pkcs8             pkey              pkeyparam
pkeyutl           prime             rand              rehash
req               rsa               rsautl            s_client
s_server          s_time            sess_id           smime
speed             spkac             srp               storeutl
ts                verify            version           x509

Mesaj Özeti Komutları (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md4
md5               mdc2              rmd160            ....

Şifre komutları (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb
aes-256-cbc       aes-256-ecb       aria-128-cbc      aria-128-cfb
aria-128-cfb1     aria-128-cfb8     aria-128-ctr      aria-128-ecb
aria-128-ofb      aria-192-cbc      aria-192-cfb      ....

OpenSSL Komutları

prime

OpenSSL'in standart komutları içindeki prime komutunu ele alarak openssl'in nasıl çalıştığına bakalım:

1 bit ile en çok 1 yazabiliriz ve asal sayılar 2'den başlar
  $ openssl prime -generate -bits 1
  Failed to generate prime.

İkilik düzende 2 bit ile en çok (11)=3 yazılabilir ve en büyük asal sayıdır
  $ openssl prime -generate -bits 2
  3

İkilik düzende 3 bitle (111)=7 yazılabilir ve yine en büyük asal sayıdır
  $ openssl prime -generate -bits 3
  7

Aynı asal sayı bulma işini onaltılık düzende ekrana yazdırırsak: 07 
  $ openssl prime -generate -bits 3 -hex
  07

4 bit ile ikilik düzende yazılacak sayı (1111)=15 yazılabilir 15'e en yakın asal sayı 13'tür
  $ openssl prime -generate -bits 4
  13

Ve hexadecimal (16'lık düzende) yazarsak
  $ openssl prime -generate -bits 4 -hex
  0D
  
32 Bit boyutunda (4 byte=integer) bir sayı yazacak olsak 10'luk ve 16'lık düzende en büyük asal sayı:
CFA6B503 - 3644574299

$ openssl komut [argumanlar...] şeklinde komut satırını kullanabiliyoruz ancak doğrudan uygulamanın kendi komut satırından da devam edebiliriz.


rand

Şimdi bir başka openssl standart komutuna bakalım: rand OpenSSL ile komut satırı üzerinden hızlı bir rasgele parola oluşturmak için. Base64 veya HEX olarak ham olarak verilebilen bir dizi rastgele bayt üretir. Base64 çıkışı çoğu zaman iyi bir paroladır.

$ openssl
OpenSSL> rand -hex 1
6b                      # 1 
OpenSSL> rand -hex 4
07930d5f
OpenSSL> rand -hex 1
08
OpenSSL> rand 1
'
OpenSSL> rand 1
═

Üretilen keyfi değeri base64 formatına kodlayabiliriz
OpenSSL> rand -base64 5
UIUb0So=

base64

Şifre ve deşifreleme için kullanılacak komutlardan birisi olan base64'e bakalım:

$ echo "selam" | openssl base64
InNlbGFtIiANCg==

Dosyadan okuduğumuz içeriği base64 ile kodlayalım
$ cat selam.txt
selam
$ openssl base64 -in selam.txt
c2VsYW0=

Doğal olarak encode ettiği için -e anahtarına gerek yok ama kullanabilirsiniz de
$ openssl base64 -e -in selam.txt
c2VsYW0=

base64 Formatına şifreleyip sonrasında -d parametresiyle deşifreleyelim
$ openssl base64 -in selam.txt  | openssl base64 -d
selam

genrsa

genrsa komutu bir RSA özel anahtarı oluşturur ve bu anahtarı gizli anahtar (private key) olarak kullanacağız.

genrsa ve rsa komutlarının artık genpkey ve pKey komutlarının yerini aldığını, artık "genrsa" ve "rsa" komutlarını kullanmamanıza dikkatinizi çekerek genrsa komutu yakından inceleyelim:

  • gen, Generate (üretmek) anlamına geliyor
  • rsa ise bir şifreleme yöntemidir

RSA, ilk ortak anahtarlı şifreleme sistemlerinden biridir ve güvenli veri iletimi için yaygın olarak kullanılmaktadır. Böyle bir şifreleme sisteminde, şifreleme anahtarı herkese açıktır ve gizli tutulan şifre çözme anahtarından farklıdır (güzel Türkçemizle detaylı anlatımı için Wkipediaya alalım sizi).

Parametreleri

-out dosyaAdı çıktı dosyasının adını belirtir. Bu bağımsız değişken belirtilmezse, standart çıktı kullanılır.

-des|-des3|-idea Bu seçenekler, özel anahtarı çıkmadan önce sırasıyla DES, üçlü DES veya IDEA şifreleriyle şifreler. Bu seçeneklerin hiçbiri belirtilmezse şifreleme kullanılmaz. Şifreleme kullanılırsa, -passout bağımsız değişkeni ile sağlanmadığında bir parola tümce istenir. numbits bit cinsinden oluşturulacak özel anahtarın boyutu. Bu, belirtilen son seçenek olmalıdır. Varsayılan 512'dir.

Aşağıdaki gibi açık ve gizli bir RSA anahtar çifti oluşturabilirsiniz (şifre olarak q1w2 girdim):

$ openssl genrsa -des3 -out rsa_anahtar_cifti.pem 2048

Yukarıdaki komutla public ve private anahtarlardan oluşan 2048 bitlik RSA anahtar çifti, sağladığınız bir parola ile şifrelenir ve bir dosyaya yazılır (private.pem isimli dosya). Sonra ortak anahtar dosyasını ayıklamanız gerekir. Açık anahtarı kullanarak, web sunucunuzdan ziyaretçilere gönderilecek içeriği yalnızca özel anahtarla okunabilecek şekilde şifreleyebileceksiniz.

Oluşan RSA anahtar çiftimizi görelim:

$ openssl rsa -in rsa_anahtar_cifti.pem -text -noout

image

RSA içindeki açık anahtarı açık ve gizli anahtar içeren RSA çiftinden çıkartalım:

$ openssl rsa -in rsa_anahtar_cifti.pem -outform PEM -pubout -out acik_anahtar_public_key.pem

Aşağıdaki gibi rsa çifti oluşturuyor ve içinden, üçüncü taraflarla özgürce paylaşabileceğiniz açık anahtarı çıkartıyoruz:

$ openssl genrsa -des3 -out rsa_anahtar_cifti.pem 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.............................................................+++++
.............................................................+++++
e is 65537 (0x010001)
Enter pass phrase for rsa_anahtar_cifti.pem:
Verifying - Enter pass phrase for rsa_anahtar_cifti.pem:

$ openssl rsa -pubout -outform PEM  \
          -in rsa_anahtar_cifti.pem \
          -out acik_anahtar_public_key.pem
Enter pass phrase for rsa_anahtar_cifti.pem:
writing RSA key

$ dir
  460 acik_anahtar_public_key.pem
1.773 rsa_anahtar_cifti.pem

$cat rsa_anahtar_cifti.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,931FE6D4287F9CA9

slw7IXC3yhP8heuFDp7raQ+O6cDJW/Bxv2oVNN5tLgmJJ7TUUkCUF790loaxeeMB
LBaxKV99ltdti8JAQmYp69JyJnHolnyAzMV6uEgUQNVw5d6uMK8QHzc8EXuaPsx2
hZOVNlyFUtV0E0eVoBDReBPHiwhY1F5IbPEDjuHit4GZbrtOKe32ArASmzIsmZsM
ERiAcqnHkZAsGAEiGmc5kiDqM7P0rGH3OIgEwQyK0yxronjx2R16a6ljjACqi75R
9CQTGKfyOn+B0+iD+t0vAaDv8te+VI8p+0Co36gBCQSVXumW27X3cJ8JYmpyyFS+
N346tvdy9FJNxrsuv4x7/0GjsONuwM3aRplfwPDMpM3Z5yfq/T6e/hVzjjzIKvbO
WsG1v/3CAdJHT6ABt5/Mk68OoPXV0tIyoa2P6faNGZrR7V0jUvBw737FH5BPxgf3
ZMRwnwGyWEQHSuv2CjWiXFMAgtxj3pojeQ71/mvQj8TPllwhb50M16GFxf1lVbIr
F03/El//vq30y8V92cx3GcBW4NUntzAPirrjK/DbJwWECPWIO0MJUUgRy8TwLL5A
GVLA0YRu4pvWEV6HvHKjIkQruvoEsVYwtXfFe1/U+YhGOfa34kT49N6WV1XgxcTc
sRHbTLYnXTWzpsMP9O+zpW7PtdOmWjG3ksNechYvXKq6lmCSFEtOizxKI8pjvPpG
oxNEQX1XDCC7SkNTVPPG6hQUQBr4hJj4z4ruF4Rh0rOCadVYC0CxTUzawaBg9t7V
57V+6csaKcmr81yMQBQK+f9K0Xax6AJcc5HIRIloqucpR0QqA6FpjYu9HAjBFKGc
Dj/sxkIHnXAaFb+vs15MmslxOtKMT55vPZwUl/aFO2oFc/uKdMctvgkwbCG+PZsR
1eDe3cWVGRWB34XRtUv9PRdS8pgIAaxWRRgLW2vxyjLVleTtQP5vI5+1LAq4n+3l
eBkIt7J7iM8L1OI8vsRKqE0d9FP0X0O4N1ufhNJnJCx+9LQ2OXNWWORGVOHwyRPV
1vOqs9Jy7yPNVJSoOYe5jSqUz0anHSgStOpO0PiL2VPJmjl77WvDJi8G/HYD4bTx
BS+IshgI99pd7fC+EICXs0pErhe3/kiCe5mroHvPtXxH2B+h9wOJv4QbadVqgoUH
NqndRtY48cxdaWlRDqMI8II7+cp5aBJ10VWMuxdryYAEv5/SeI4j1Q0GAPMjEXQW
LgkGxY7dqz5Xaeay05d921cyxsdG6YN6oCiXe5ZAH35cGsSXX+qFvJLEuVmyT+b4
LsZpi0fsuNunU3apIm7pug+bCN0+jm4lHyb6QKNN4KYrbLDNazW+UGzRKjAeVD/F
nFyUBtiLVBJZI1Y176qL5lCgFcndv1h4Qjx/j51ov4nAmegQEKttJLBpyulrh8vT
1hanOhEKVnPG0tmkRpClhR7DtfClMgaZtOhWuVP/hkPAIC8jfl7Oq/IZX2YUjjC2
6fCS/PTvrBSIf/WC/PunGE6sCMNHRbgqtoPbhq2Mjb6QVK3bPXhUDRamKB8+kTOC
yO2RHbxXN1trAMb+KEJ/MH9UXWinbR20cj1Z7MmnJWFR5sRMA6/agw==
-----END RSA PRIVATE KEY-----

$ cat acik_anahtar_public_key.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqEHx75UqKWB96IqI5TMt
SkwkDPAsZwxUt6suKrjcsGoIzXURcds2eKGzNlOSpd/nRVxcML/PgB9xBob5Kv17
EsVdbdQRq7F0kLEEMMjNnT4JsooHwkYu/hKyea8CDK7H8ncSJHdk8jSc7pBfFqhL
ZEoQCsuVakGp+VR6djPvxvKzZJvRAV7NvS8raJMHHncL/jk7iSgzCK9+IzFuI0EW
l7SXHAo10UO9A0I3qE7QNsRLERhitlVby589lU25flX40oNB0XfWVXz7F8Cnx0FF
3ZpS6t/c313tnzosRjCWwxeEQvU5trI5qCbFG2MPwSmttDXpbwdB5lG4pT2rKv/B
fQIDAQAB
-----END PUBLIC KEY-----

Şimdi açık anahtarımızla "naber" mesajını şifreleyelim ve çıktının artık "naber" olmadığını :) görelim:

$ echo "naber" | openssl rsautl -encrypt -inkey acik_anahtar_public_key.pem -pubin
Ş=Øç�k§½¹d.êªk┌ñÿò┘y¿[îÄY�┐C@ky╗Ğø?─+#Íy÷0­KK�oklâÖ«█EX╬>�sr)çÄPª}jê¯�└¥PXTêwH▒��Ô^u*RYïüරu=pß▄`PyÕu*�ªt▀Iôöm,Ë³╚º╔}QO^]Qw�µ¾n?lÎ�×�¬¾uàù�QÈCÕÄc├ê�N�×Ó¶_m┬%`;�­§õQ ¯©�&\<▓G�Ö▓¸î┌�«é�vg░¿®O=¦¿Óo¼òÇ3 ┼├Ønûè�Ú½.¶P�G┼╣g²°`"©äÚ┌áÀh┘ª°░°�ë▒°ÚòÔ}

Şifreli metni bu kez gizli anahtarımızla deşifreleyelim (tek satır komutla yapalım) :

$ echo "naber" | openssl rsautl -encrypt -inkey acik_anahtar_public_key.pem -pubin | openssl rsautl -decrypt -inkey rsa_anahtar_cifti.pem
Enter pass phrase for rsa_anahtar_cifti.pem:q1w2

"naber"

Diyelimki bir dosyamız var ve içinde hassas (sensetive) bilgilerimiz olsun. Bu dosyayı şifreli olarak buluta yüklemek, başkalarına göndermek için RSA yöntemini kullanalım:

$ echo "Akbank: 123123, das123s1; Garanti: 3123, sifre123;" > banka_kullanici_adi_ve_sifreleri.txt
$ cat banka_kullanici_adi_ve_sifreleri.txt
"Akbank: 123123, das123s1; Garanti: 3123, sifre123;"

$ openssl rsautl -encrypt                                  \
          -inkey acik_anahtar_public_key.pem -pubin        \
          -in banka_kullanici_adi_ve_sifreleri.txt         \
          -out sifreli_banka_kullanici_adi_ve_sirleri.hede

$ cat sifreli_banka_kullanici_adi_ve_sirleri.hede
2□□O□OD□□᤿□□□Ft□□□gilx□Vf□□d□?□@L□i□□□$=□□]6o+r%�□aBW□□t□□□͎qA□Y□□�<□□p□?□Z�□□□A□j□[□ow□□P"□C<□□5H□□6\□□□□x□@□$

$ openssl rsautl -decrypt                                 \
          -inkey rsa_anahtar_cifti.pem                    \
          -in sifreli_banka_kullanici_adi_ve_sirleri.hede \
          -out desifre_edilen_bilgiler.txt
Enter pass phrase for rsa_anahtar_cifti.pem:

$ cat desifre_edilen_bilgiler.txt
"Akbank: 123123, das123s1; Garanti: 3123, sifre123;"

Artık uygulamalarınızda şifreleme için openssl'i en azından kabuk betikleriyle kullanabilirsiniz. Ya da bir adım daha öteye gidip örneğin C# uygulamanız için OpenSSL.NET gibi bir openSSl'i saran kütüphaneyi kullanabilirsiniz (diğer kütüphaneler için tıklayın).

Açık (public) anahtarı rsa yöntemiyle oluşturduğumuz anahtar çiftimizden çıkardığımız gibi gizli anahtarımızı da bu dosyadan çıkartabiliriz (Dikkat! -pubout anahtarını kullanmadığımız için gizli anahtarı çıkartırıyoruz):

$ openssl rsa -outform PEM            \
          -in rsa_anahtar_cifti.pem   \
          -out gizli_anahtar_public_key.pem
Enter pass phrase for rsa_anahtar_cifti.pem: q1w2
writing RSA key

sh-4.4$ cat gizli_anahtar_public_key.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAqEHx75UqKWB96IqI5TMtSkwkDPAsZwxUt6suKrjcsGoIzXUR
cds2eKGzNlOSpd/nRVxcML/PgB9xBob5Kv17EsVdbdQRq7F0kLEEMMjN..........

Açık anahtarı OpenSSH ile kullanmak için ayıklamak istiyorsanız, açık anahtarı biraz farklı almanız gerekir. SSH için açık anahtarı PEM formatında kullanamayacağımız için aynı kaynaktan farklı formatta açık anahtarı ssh-keygen ile çıkarabiliriz:

$ ssh-keygen -y -f rsa_anahtar_cifti.pem > acik_anahtar.pub

$ cat acik_anahtar.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoQfHvlSopYH3oiojlMy1KTCQM8CxnDFS3qy4quNywagjNdRFx2zZ4obM2U5Kl3+dFXFwwv8+AH3EGhvkq/XsSxV1t1BGrsXSQsQQwyM2dPgmyigfCRi7+ErJ5rwIMrsfydxIkd2TyNJzukF8WqEtkShAKy5VqQan5VHp2M+/G8rNkm9EBXs29Lytokwcedwv+OTuJKDMIr34jMW4jQRaXtJccCjXRQ70DQjeoTtA2xEsRGGK2VVvLnz2VTbl+VfjSg0HRd9ZVfPsXwKfHQUXdmlLq39zfXe2fOixGMJbDF4RC9Tm2sjmoJsUbYw/BKa20NelvB0HmUbilPasq/8F9

RSA Bahsini kapatırken;

  • Koruyacağınız bilgilerin niteliğine bağlı olarak, özel anahtarın yedeklenmesi ve gizli tutulması önemlidir. Genel anahtar herhangi bir yere dağıtılabilir veya PHP, Ruby veya diğer komut dosyalarınız gibi web uygulaması komut dosyalarınıza gömülebilir.
  • Anahtarın kaybolması durumunda şifrelenen veriler kaybolur. Anahtarın basılı bir kopyasını banka güvenlik kasasında kapalı bir zarfta tutmak, önemli anahtarları yangın veya sabit sürücü arızasından kaynaklanan kayıplara karşı korumanın iyi bir yoludur.

rsa

rsa komutu RSA anahtarlarını işler. Çeşitli formlar ve basılan bileşenleri arasında dönüştürülebilirler (DER|NET|PEM).

genrsa sadece bir RSA anahtarı üretir ancak req daha sonra genrsa ile oluşturduğunuz bu anahtarı x509 isteği yapmak için kullanır. Ancak genrsa'nın aksine req, şifreleme olarak aes128 belirtmenize izin vermez. Bu yüzden birçok kurumsal ayarda, uygulanan anahtar şifrelemesi üzerinde yeterli kontrol elde etmek için iki adımda yapılır. Bir anahtar çiftine ve imzalı bir x509 isteğine ihtiyacınız varsa, 'genrsa' ve ardından 'req' kullanırsınız. İsteğe bağlı olarak 'req' bu anahtarı sizin için de oluşturabilir.

Yani aşağıda genrsa ile üretip req ile x509 isteği yapabileceğimiz hale getireceğimiz anahtarı tek satır req komutuyla da yapabiliriz:

$ openssl genrsa -aes128 -out privkey.pem 2048
$ openssl req -new -x509 -key privkey.pem 

eşittir

$ openssl req -new -x509 -keyout privkey.pem  -newkey rsa:2048
RSA gizli anahtarındaki şifreyi kaldırmak için:
$ openssl rsa -in key.pem -out keyout.pem

Üçlü DES ile  gizli anahtarı şifrelemek için:
$ openssl rsa -in key.pem -des3 -out keyout.pem

Gizli anahtarı PEM den DER formatına dönüştürmek için:
$ openssl rsa -in key.pem -outform DER -out keyout.der

Gizli anahtarın bileşenlerini yazdırmak için
$ openssl rsa -in key.pem -text -noout

Sadece gizli bir anahtarın açık kısmını çıkarmak için:
$ openssl rsa -in key.pem -pubout -out pubkey.pem

req

req komutu öncelikle PKCS#10 biçiminde sertifika istekleri oluşturur ve işler. Ek olarak, örneğin kök CA'lar olarak kullanılmak üzere kendinden imzalı sertifikalar oluşturabilir.

-inform DER|PEM, giriş biçimini belirtir. DER seçeneği, PKCS#10 ile uyumlu bir ASN1 DER kodlu form kullanır. PEM formu varsayılan biçimdir: ek üstbilgi ve altbilgi satırlarıyla kodlanmış DER biçimindeki base64 öğesinden oluşur.

-outform DER|PEM, çıktı biçimini belirtir, seçenekler -inform seçeneğiyle aynı anlama gelir.

-in <dosya_yolu>/dosya_adı, bir CSR dosyasını girdi olarak vermek istersek dosya adını (farklı bir dizindeyse dosya yoluyla) veririz. Bu seçenek belirtilmezse varsayılan veya -config dosyasıyla verilen ayar dosyasındaki ayırt edici (DN) bilgileri konsoldan girilir. Bir istek yalnızca oluşturma seçenekleri (-new ve -newkey) belirtilmezse okunur.

-key anahtarıyla hazırda bir gizli anahtarınız var ve dosya yolunu vermek için kullanıyorsunuz demektir. Eğer bu anahtar yok ve -newkey anahtarı kullandıysanız gizli anahtarı oluşturursunuz. Oluşan gizli anahtarı ayrıca bir dosyaya yazdırmak isterseniz -keyout anahtarını kullanıp değer olarak gizli anahtarı yazmak istediğiniz dosya yolunu girebilirsiniz.

-keyform PEM|DER -key bağımsız değişkeninde belirtilen özel anahtar dosyasının biçimi. PEM varsayılan değerdir.

-new seçeneği yeni bir sertifika isteği oluşturur. Kullanıcıdan ilgili alan değerlerini (ülke, kent, kuruluş adı vs.) ister. İstenen gerçek alanlar ve bunların maksimum ve minimum boyutları yapılandırma dosyasında ve istenen uzantılarda belirtilir (ülke kodunun 2 karakter girmeniz gibi). -key seçeneği kullanılmazsa, yapılandırma dosyasında belirtilen bilgileri kullanarak yeni bir RSA özel anahtarı oluşturur.

-newkey anahtarı yeni bir sertifika isteği ve yeni bir gizli anahtar oluşturur. Argüman çeşitli biçimlerden birini alır. rsa: bit_sayısı, boyut olarak bir RSA anahtarı nbits üretir. Nbits atlanırsa, yani -newkey rsa belirtilirse, yapılandırma dosyasında belirtilen varsayılan anahtar boyutu (default_bits) kullanılır.

Diğer tüm algoritmalar -newkey alg:dosya biçimini destekler; burada dosya genpkey -genparam komutu tarafından oluşturulan bir algoritma parametre dosyası veya onay algoritmasına sahip bir anahtar için X.509 sertifikası olabilir.

param:file parametre dosyasını veya sertifika dosyasını kullanarak bir anahtar oluşturur, algoritma parametreler tarafından belirlenir. algname:dosya kullanım algoritması algname ve parametre dosya dosyası: iki algoritmanın eşleşmesi gerekir veya bir hata oluşur. algname sadece -pkeyopt parametresi ile gerekiyorsa algname algoritmasını ve parametreleri kullanır.

dsa: dosya adı dosya dosyasındaki parametreleri kullanarak bir DSA anahtarı oluşturur.

ec:dosya adı EC anahtarı üretir (hem ECDSA hem de ECDH algoritmalarıyla kullanılabilir), gost2001: dosya adı GOST R 34.10-2001 anahtarı üretir (yapılandırma dosyasında yapılandırılmış ccgost motoru gerektirir). Sadece gost2001 belirtilirse, bir parametre kümesi -pkeyopt paramset:X ile belirtilmelidir

-nodes seçeneği belirtilirse gizli anahtar oluşturulursa şifrelenmez. Gizli anahtarlarınızı şifreyle korumalı hale getirmek istiyorsanız bu anahtarı kullanmamalısınız.

-pubkey ile açık anahtarı dosyaya çıkarabilirsiniz. Otomatik CSR oluşturmuyorsanız bu anahtarı kullanabilmeniz için -in imzalama_isted_dosyası.csr nı vermeniz gerekir.

-verify anahtarıyla -in ile verdiğiniz sertifikanın geçerliliğini denetleyebilirsiniz.

-subject ve -noout Anahtarlarını aşağıdaki çıktılara bakarak siz deperlendirin:

$ openssl req -in servercert.csr
-----BEGIN CERTIFICATE REQUEST-----
MIIDrzCCApcCAQAwgZYxCzAJBgNVBAYTAlRSMRAwDgYDVQQHDAdBTlRBTFlBMSww
A1UECwwjRS1UaWNhcmV0I...........................................
y0zaI0xyUblNyP9bx3KPerzq9kU3IKyV7Ew/7VRlhYrIg/wRJXSI0tJbsR/ZJjT+
jCLyaL3v8KqOnGWbCh+Cm2AGQnLlCJI8qnMjcrO9CYzRFNQ=
-----END CERTIFICATE REQUEST-----

$ openssl req -in servercert.csr -subject
subject=C = TR, L = ANTALYA, O = Musteri E-Ticaret Sirketi Ltd. Sti., OU = E-Ticaret Yazilim Gelistirme Birimi, CN = *.musteri.com.tr
-----BEGIN CERTIFICATE REQUEST-----
MIIDrzCCApcCAQAwgZYxCzAJBgNVBAYTAlRSMRAwDgYDVQQHDAdBTlRBTFlBMSww
A1UECwwjRS1UaWNhcmV0I...........................................
y0zaI0xyUblNyP9bx3KPerzq9kU3IKyV7Ew/7VRlhYrIg/wRJXSI0tJbsR/ZJjT+
jCLyaL3v8KqOnGWbCh+Cm2AGQnLlCJI8qnMjcrO9CYzRFNQ=
-----END CERTIFICATE REQUEST-----

$ openssl req -in servercert.csr -subject -noout
subject=C = TR, L = ANTALYA, O = Musteri E-Ticaret Sirketi Ltd. Sti., OU = E-Ticaret Yazilim Gelistirme Birimi, CN = *.musteri.com.tr

-subj arg ile yeni istek için konu adını belirler veya bir isteği işlerken konu adının yerini alır. Bağımsız değişken /type0=value0/type1=value1/type2=..., olarak biçimlendirilmelidir, karakterleri \ (ters eğik çizgi) ile yazabiliriz ve tipler arasında boşluk kullanılamaz.

-x509 bu seçenek, sertifika isteği (CSR) yerine kendinden imzalı bir sertifika verir. Bu genellikle bir test sertifikası veya kendinden imzalı bir kök CA oluşturmak için kullanılır. Sertifikaya (varsa) eklenen uzantılar yapılandırma dosyasında belirtilir. set_serial seçeneği kullanılarak belirtilmedikçe, seri numarası için büyük bir rasgele sayı kullanılır. -in seçeneğiyle varolan sertifka istek dosyası parametre olarak verilirse, kendinden imzalı sertifikaya oluşturulur, aksi takdirde yeni sertifika imzalama isteği (SC) oluşturulur.

days gun_sayısı normalde ayar dosyasındaki default_days anahtarı kullanılır. -x509 seçeneği kullanıldığında bu, sertifikanın sertifikalandırılacağı gün sayısını belirtir. Varsayılan süre 30 gündür.

-set_serial n ile kendinden imzalı bir sertifika oluştururken kullanılacak seri numarasını bu parametreden alır. Bundan önce 0x ile başlıyorsa, ondalık değer veya onaltılık değer olarak belirtilebilir. Negatif seri numaraları kullanmak mümkündür, ancak bu önerilmez.


x509

req Komutuyla kendinden imzalı sertifikalar üretirken, kök veya ara sertifika yetkilisiyle imzalanacak sertifikalar için x509 veya ca komutlarını kullanırız.

openssl ca ile x509 Kıyası

"X509" ile neredeyse her şeyi yapabilirsiniz "ca" ile de yapabilirsiniz. En dikkat çekici fark, sadece "ca" yardımcı programını kullanarak CRL'ler oluşturur.

openssl x509:

openssl x509 -req \
-in client.req.pem \
-out client.cert.pem -signkey client.privkey.pem \
-CA ca.cert.pem -CAkey ca.key.pem -CAcreateserial -days 365

openssl ca:

openssl ca \
-in client.req.pem \
-out client.cert.pem \
-extensions client_ext \
-startdate `date +%y%m%d000000Z -u -d -2day` \
-enddate `date +%y%m%d000000Z -u -d +1years+1day`

Sertifkanın detaylı incelemesi: image


OpenSSL Ayar Dosyası

distinguished_name

openssl req komutu sertifikanın ayırt edici bilgileri (Distinguished Name) distinguished_name anahtarına atanmış ayar dosyasındaki bölüm adından okur.

image

default_bits

openssl req komutu openssl.cnf dosyası içinde yer alan [req] bölümündeki ayarları kullanır.

image

Komut satırından girilen rsa bit uzunluğu ayar dosyasındaki default_bits değerini ezecektir:

image

encrypt_key no|yes

Bu ayar no olarak ayarlanırsa, özel bir anahtar oluşturulursa şifrelenmez. Komut satırında -nodes seçeneğine eşdeğerdir. Uyumluluk için encrypt_rsa_key eşdeğer bir seçenektir.

[ req ]
encrypt_key             = yes

default_keyfile

Ayar dosyasında default_keyfile içinde yazan değer oluşacak gizli anahtar dosyasının adı olacak. Eğer -keyout anahtarına komut satırında değer atanırsa bu komut satırı değeri geçerli olur.

[req]
default_bits       = 4096
default_keyfile    = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions    = ca_extensions
string_mask        = utf8only
req_extensions     = v3_req
$ openssl
OpenSSL> req                                 \
>         -config openssl_musteri.com.tr.cnf \
>               -newkey rsa:2048             \
>               -sha256                      \
>               -nodes                       \
>               -out servercert.csr          \
>               -keyout gizliAnahtar.pem     \
>               -outform PEM
Generating a RSA private key
...................................+++++
.............+++++
writing new private key to 'gizliAnahtar.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Ulke (2 Harf) [TR]:
Sehir [ANTALYA]:
Organizasyon ismi [Musteri E-Ticaret Sirketi Ltd. Sti.]:
Organizasyon Birimi [E-Ticaret Yazilim Gelistirme Birimi]:
Ortak Ad [*.musteri.com.tr]:
OpenSSL>
OpenSSL> quit
$
$ ls gizliAnahtar.pem -l
-rw------a  1 Administrators   1732 Haz 13 18:36 gizliAnahtar.pem

default_md md5|sha1|mdc2

Bu seçenek, kullanılacak özet algoritmasını belirtir. Olası değerler arasında md5 sha1 mdc2 yer alır. Bu seçenek komut satırında geçersiz kılınabilir.

req_extensions

Bu seçenek sertifika isteğine eklenecek uzantıların listesini içeren yapılandırma dosyası bölümünü belirtir. -reqexts komut satırı anahtarı ile geçersiz kılınabilir. Uzantı bölümü biçiminin ayrıntıları için x509v3_config (5) kılavuz sayfasına bakınız.

x509_extensions

-x509 Anahtarı kullanıldığında oluşturulan sertifikaya eklenecek uzantıların listesini içeren yapılandırma dosyası bölümünü belirtir. -extensions komut satırı anahtarı ile geçersiz kılınabilir. Komutlar genellikle yapılandırma dosyasının adını ve bu dosyadaki bir bölümü belirtme seçeneğine sahiptir.

[ ca ]
default_ca              = identity_ca

[ identity_ca ]
# https://www.openssl.org/docs/manmaster/man5/x509v3_config.html
x509_extensions         = identity_ext          # Varsayılan sertifika uzantıları

[ identity_ext ]
# mutemel değerler: digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign, encipherOnly, decipherOnly
keyUsage                = critical,digitalSignature
basicConstraints        = CA:false                                      # Kök sertifikası ise CA:true olurdu
extendedKeyUsage        = emailProtection,clientAuth,msSmartcardLogin   
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always
authorityInfoAccess     = @issuer_info
crlDistributionPoints   = @crl_info
certificatePolicies     = blueMediumAssurance

[ issuer_info ]
caIssuers;URI.0         = $aia_url

[ crl_info ]
URI.0                   = $crl_url

Genel OpenSSL Komutları

Yeni bir özel anahtar ve Sertifika İmzalama İsteği oluşturma

openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key

Kendinden imzalı sertifika oluşturma

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt

Mevcut bir özel anahtar için sertifika imzalama isteği (CSR) oluşturma

openssl req -out CSR.csr -key privateKey.key -new

Mevcut bir sertifikayı temel alan bir sertifika imzalama isteği oluşturma

openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key

Özel anahtardan parolayı kaldırma

openssl rsa -in privateKey.pem -out newPrivateKey.pem

OpenSSL Kullanarak Kontrol Etme

Sertifika İmzalama İsteğini (CSR) Kontrol Etme

openssl req -text -noout -verify -in CSR.csr

Özel anahtarı kontrol etme

openssl rsa -in privateKey.key -check

Sertifikayı kontrol etme

openssl x509 -in certificate.crt -text -noout

PKCS#12 dosyasını kontrol etme

openssl pkcs12 -info -in keyStore.p12

OpenSSL Kullanarak Hata Ayıklama

Bir CSR veya özel anahtarda bulunanlarla eşleştiğinden emin olmak için ortak anahtarın MD5 karmasını kontrol edin

openssl x509 -noout -modulus -in certificate.crt | openssl md5 openssl rsa -noout -modulus -in privateKey.key | openssl md5 openssl req -noout -modulus -in CSR.csr | openssl md5

Bir SSL bağlantısını kontrol edin. Tüm sertifikalar (Ara ürünler dahil) gösterilmelidir

openssl s_client -connect www.paypal.com:443

Uzak sunucudan sertifika doğrulayın

  • With SNI: openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

  • Without SNI: openssl s_client -showcerts -connect www.example.com:443 </dev>

OpenSSL Kullanarak Dönüştürme

Bir DER dosyasını (.crt .cer .der) PEM'e dönüştürme

openssl x509 -inform der -in certificate.cer -out certificate.pem

Convert a PEM file to DER

openssl x509 -outform der -in certificate.pem -out certificate.der

Özel anahtar ve sertifikalar içeren bir PKCS#12 dosyasını (.pfx .p12) PEM'e dönüştürme

openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes

PKCS#12 dosyasındaki tüm bilgileri PEM biçiminde ekrana dökmek için şu komutu kullanın:

openssl pkcs12 -info -in dosyaAdi.p12 -nodes Enter Import Password: # PKCS dosyasının şifresini girin

Sadece gizli anahtarı görüntülemek istersek (dosyaya çıkarmak için -out OUTFILE.crt ):

openssl pkcs12 -info -in dosya_adi.p12 -nodes -nocerts

$ openssl pkcs12 -in browser.cinar.com.tr.p12 -out browser_komple.crt -nodes
Enter Import Password:

$ dir browser_komple.crt
14.06.2020  15:35             4.192 browser_komple.crt

$ cat browser_komple.crt
Bag Attributes
    localKeyID: 70 84 60 A9 B3 61 D2 74 38 47 30 38 B4 94 E6 F4 54 8A B1 32
subject=C = TR, L = ISTANBUL, O = Web Tarayicisi, OU = Internet Gezgini Kullanicilari, CN = *.cinar.com.tr

issuer=C = TR, ST = Turkey, L = IZMIR, O = Ara Sertifika Yetkilisi IZMIR, OU = Sertifika Uretim Merkezi IZMIR, CN = Ara Sertifika Yetkilisi IZMIR

-----BEGIN CERTIFICATE-----
MIIFcTCCA1mgAwIBAgIUYfemMzIt9Va/WYGWyqvPQjKdhFYwDQYJKoZIhvcNAQEL
BQAwgacxCzAJBgNVBAYTAlRSMQ8w....................................
ur5Ne54/i9HR6hdOCQOdbP35L3BqPVbqrS1z265g2RSH1/Aie0Kmyrd1t41hSftE
CNJ9y78=
-----END CERTIFICATE-----
Bag Attributes
    localKeyID: 70 84 60 A9 B3 61 D2 74 38 47 30 38 B4 94 E6 F4 54 8A B1 32
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC5PE9KLW+BH1dp
hbdJHI/MnAZ/1VQdQctWgtUUzHaoBgjd...............................
OiyPpxmi4/JW9E3EdDkznoIXzSfWOk1yS73bP8VbOCXhx3VMeSLhOMdUXQJwb4nL
fA8y4OVxndyiQ3DtxhtZbEw=
-----END PRIVATE KEY-----

Yukarıdaki çıktıda hem gizli anahtarı hem sertifikayı görebiliyoruz.

  • Sadece sertifika isteseydik -nokeys
  • Sadece anahtarı isteseydik -nocerts

argumanlarını komut satırına eklememiz yetecekti.

Sadece gizi anahtarı çıkarmak için:

$ openssl pkcs12 -in browser.cinar.com.tr.p12 -out browser_key.key -nocerts
Enter Import Password:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Bu şekliyle dosyaya çıkardığımızda private key dosyası şifreli olarak bu şekilde çıkartılmış olacak:

 cat browser_key.key
Bag Attributes
    localKeyID: 70 84 60 A9 B3 61 D2 74 38 47 30 38 B4 94 E6 F4 54 8A B1 32
Key Attributes: <No Attributes>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIHLkq4Zm8xoQCAggA
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECPLIciOuoD..................
zdavSQ/pl/ChnrZQmWzFT8agNSoJ8PAzPdOFn9qly21wwM/gIvt2LZBTN7YcFS0N
a+nkrwyyCC5v+udOKBKH+A==
-----END ENCRYPTED PRIVATE KEY-----

Ancak dosyayı pipe (|) karakteriyle rsa şifrelemeye yönlendirdiğimizde:

$ openssl pkcs12 -in browser.cinar.com.tr.p12 -nodes -nocerts | openssl rsa -out browser_key.key
Enter Import Password:
writing RSA key

Ve dosyayı görüntülemek istediğimizde:

$ cat browser_key.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAuTxPSi1vgR9XaYW3SRyPzJwGf9VUHUHLVoLVFMx2qAYI3eZT
9Dbu8rGMcJ1atN..................................................
qphTqrlGZ42dpMzTywRIu9qreTSg1Dosj6cZouPyVvRNxHQ5M56CF80n1jpNcku9
2z/FWzgl4cd1THki4TjHVF0CcG+Jy3wPMuDlcZ3cokNw7cYbWWxM
-----END RSA PRIVATE KEY-----

PEM sertifika dosyasını ve özel anahtarı PKCS#12'ye (.pfx .p12) dönüştürme

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

| Komut      | Açıklaması
| asn1parse  |  Parse an ASN.1 sequence.
| ca         |  Certificate Authority (CA) Management.
| ciphers    |  Cipher Suite Description Determination.
| cms        |  CMS (Cryptographic Message Syntax) utility.
| crl        |  Certificate Revocation List (CRL) Management.
| crl2pkcs7  |  CRL to PKCS#7 Conversion.
| dgst       |  Message Digest calculation. MAC calculations are superseded by mac(1).
| dhparam    |  Generation and Management of Diffie-Hellman Parameters. Superseded by genpkey(1) and pkeyparam(1).
| dsa        |  DSA Data Management.
| dsaparam   |  DSA Parameter Generation and Management. Superseded by genpkey(1) and pkeyparam(1).
| ec         |  EC (Elliptic curve) key processing.
| ecparam    |  EC parameter manipulation and generation.
| enc        |  Encoding with Ciphers.
| engine     |  Engine (loadable module) information and manipulation.
| errstr     |  Error Number to Error String Conversion.
| gendsa     |  Generation of DSA Private Key from Parameters. Superseded by genpkey(1) and pkey(1).
| genpkey    |  Generation of Private Key or Parameters.
| genrsa     |  Generation of RSA Private Key. Superseded by genpkey(1).
| info       |  Display diverse information built into the OpenSSL libraries.
| kdf        |  Key Derivation Functions.
| mac        |  Message Authentication Code Calculation.
| nseq       |  Create or examine a Netscape certificate sequence.
| ocsp       |  Online Certificate Status Protocol utility.
| passwd     |  Generation of hashed passwords.
| pkcs12     |  PKCS#12 Data Management.
| pkcs7      |  PKCS#7 Data Management.
| pkcs8      |  PKCS#8 format private key conversion tool.
| pkey       |  Public and private key management.
| pkeyparam  |  Public key algorithm parameter management.
| pkeyutl    |  Public key algorithm cryptographic operation utility.
| prime      |  Compute prime numbers.
| rand       |  Generate pseudo-random bytes.
| rehash     |  Create symbolic links to certificate and CRL files named by the hash values.
| req        |  PKCS#10 X.509 Certificate Signing Request (CSR) Management.
| rsa        |  RSA key management.
| rsautl     |  RSA utility for signing, verification, encryption, and decryption. Superseded by pkeyutl(1).
| s_client   |  This implements a generic SSL/TLS client which can establish a transparent connection to a remote server speaking SSL/TLS.
| s_server   |  This implements a generic SSL/TLS server which accepts connections from remote clients speaking SSL/TLS.
| s_time     |  SSL Connection Timer.
| sess_id    |  SSL Session Data Management.
| smime      |  S/MIME mail processing.
| speed      |  Algorithm Speed Measurement.
| spkac      |  SPKAC printing and generating utility.
| srp        |  Maintain SRP password file.
| storeutl   |  Utility to list and display certificates, keys, CRLs, etc.
| ts         |  Time Stamping Authority tool (client/server).
| verify     |  X.509 Certificate Verification.
| version    |  OpenSSL Version Information.
| x509       |  X.509 Certificate Data Management.

Dosya Türleri

image

.pem bir KODLAMA BİÇİMİDİR. PEM, Gizliliği Artırılmış Posta (Privacy Enhanced Mail) anlamına gelir ve base64 kodlu bir sertifikadır. Genel anahtar (public key) şifrelemesi kullanarak iletilerin daha güvenli taşınmasını sağlmak için e-postayı korumak adına IETF'nin bir önerisidir. Ancak günümüzde postaların güvenliği için kullanılmamaktadır.

Gizliliği Arttırılmış Posta

Sadece base64 şeklinde kodlanmış alt ve üst bilgi satırlarını gösterir. PEM'in içeriği üstbilgi ve altbilgi satırında ayrıntılı olarak açıklanır - .pem'in kendisi bir veri türü belirtmez - tıpkı .xml ve .html gibi bir dosyanın içeriğini belirtmez, yalnızca bir kodlama biçimini belirtir. PEM dosyasını basit metin düzenleyicisi kullanılarak kolayca okunabilir verilere dönüştürülebildiği için web sunucuları için sıklıkla kullanılır.

.pem RFC’nin 1421 ila 1424 sürümlerinde tanımlanan,

  • bir genel sertifika veya genel anahtar,
  • özel anahtar ve
  • kök sertifikalar gibi tüm sertifika zincirini içerebilen

bir kapsayıcı biçimidir.

Kafa karıştırıcı bir şekilde, PKCS10 formatı PEM'e çevrilebildiği için bir CSR'yi de kodlayabilir. Gizliliği Artırılmış Posta, güvenli e-posta için başarısız bir yöntem ancak kullandığı kapsayıcı biçimi yaşıyor ve x509 ASN.1 anahtarlarının base64 çevirisidir.

PEM, güvenlik sertifikaları (çeşitli X.509v3 dosya türleri) için yaygın olarak kullanılan bir kodlama biçimidir. Ana dosya uzantıları .pem, .ca-bundle, .crt şeklindedir.

gizli anahtar içeriği
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

açık anahtar içeriği
-----BEGIN PUBLIC KEY-----
-----END PUBLIC KEY-----

PEM kodlu sertifikayı görüntülemek için:

$ openssl x509 -in cert.pem -text -noout
$ openssl x509 -in cert.cer -text -noout
$ openssl x509 -in cert.crt -text -noout

Eğer görüntülemeye çalışırken aşağıdaki hatayı alırsak anlayacağızki base64 değil ikili DER kodlu bir sertifikayı görüntülüyoruz:

unable to load certificate
12626:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE

O zaman DER kodlu sertifika görüntülemeye çalışmalıyız.


.der uzantısı bir KODLAMA BİÇİMİDİR ve ikili tabanda DER kodlu sertifikalar için kullanılır. PEM formatının base64 kodlamasıyla okunabilir karakterler içerdiğini ama anlaşılamaz olduğunu hatırlayın (BEGIN ile END arasındaki base64 kodlaması). DER kodlu sertifikaları ikili oldukları için okuyamayacağız ancak bilgisayarların işlemek için daha az güç harcayacağı ve daha az alan kaplayacağı kodlamadır. Bu dosyalar ayrıca CER veya CRT uzantısını da taşıyabilir. Doğru kullanımı “DER sertifikam var” değil “DER kodlu sertifikam var” olacaktır.

.crt Uzantılı dosyamızı .der uzantılı hale getirerek içeriğine bakalım
$ openssl x509 -in Certificate.crt -outform der -out Certificate.der                                                  

Der kodlu sertifikamızı görüntüleyelim:
$ cat Certificate.der                                                                                                 ��U�Turkey1�0��UISTANBUL1!0��U�
��U�Turkey1�0��UISTANBUL1!0��U�10zilim Bolumu10��U��TRSunucu.GuvenliSohbet1&0$� *□H□□
�G�□e0□i*□H□□@guvenlisohbet.com0□"0lim Bolumu10��U��TRSunucu.GuvenliSohbet1&0$� *□H□□
□vW)□□Y}□□n□L□i□QX□□S□□Z|J2-□□□gO□�□□□□i!□e□□GB̈B□□□□□d□A□T□=□M!□□□□V□us□f□5'□□7i□`□□-
□□□f$□2□DNf□i□m1Ƙ~47({□M□95□|ܜ<□͙Ő□□□□H□-!c□□□□□>□□w□mF□ǃqɽ□F□a%□^□□□   (L□J□<□□□□□□mOj$        t□(=op%□<□]□□-v□M� □S0Q0��U�0�□Uf]□□□□g□□qd;t[□□6□□ՃS□□M_�□.j-□|b□-<cI□K□A□□g □□�□□□S□□    □□□N□#□□wEf□-□□Dž□□□□□□□□)r□□�□□\□□NEI #m□k□□□□□□3z□i□�□&R�□K□□5□��□ʳ□�□□3□�□G□q@�□□□□6hU□$ReH=艪j□□~□{�9}\□�Yg□□|x□+ٰ□S*G□@(g^□3tB□߿F1□□6□_8□□&n□□□9dF+}□ □Ww□V□B□~oV□□□□□□□□_

$ cat Certificate.crt                                                                                                 
-----BEGIN CERTIFICATE-----
MIIETzCCAzegAwIBAgIUSwbJ4dv71RAOyds+SULwuSHAB7MwDQYJKoZIhvcNAQEL
BQAwgbYxCzAJBgNVBAYTAlRSMQ8wDQYDVQQIDAZUdXJrZXkxETAPBgNVBAcMCElT
VEFOQlVMMSEwHwYDVQQKDBhHdXZlbmxpIFNvaGJldCBMdGQuIFN............
sd+/RjG49DbtXx4SOOy4Jm7VFYT2OWRGK30egiC+V3e1VtFCgn5vVpmj8htKvOzl
mO1f
-----END CERTIFICATE-----

İkili DER kodlu sertifika görüntülemesi için:

$ openssl x509 -in certificate.der -inform der -text -noout

Aşağıdaki gibi hata alırsak anlamalıyız ki ASCII PEM kodlu sertifikayı görüntülemeye çalışıyoruz.

unable to load certificate
13978:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306:
13978:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509

.key belirli bir sertifikanın yalnızca özel anahtarını içeren PEM biçimli bir dosyadır ve standart bir ad değil, yalnızca geleneksel bir addır. Herhangi bir anahtar türü olabilir, ancak genellikle gizli anahtardır - OpenSSL, genel ve standart PKCS#8 yapısındaki tüm algoritmalar (RSA, DSA, EC) için özel anahtarları sarabilir, ancak ayrı her algoritmayı destekler bir yapıdır. Anahtarlar ikili DER veya ASCII PEM (base64) olarak kodlanabilir. Apache kurulumlarında, bu genellikle /etc/ssl/private dizininde yer alır.


.csr, Sertifika İmzalama İsteği anlamına gelir, talep eden kişi için bir sertifika oluşturmak ve imzalamak için bir Sertifika Yetkilisi tarafından gereken açık anahtar (public key) ve ortak ad (CN-Common Name) gibi bilgileri içerir, PEM veya DER kodlamasıdır (ASN.1'in ikili kodlamasıdır)


.crt sadece X509v3 sertifikası olmak üzere sertifika anlamına gelir. Sertifikalar ikili DER veya ASCII PEM olarak kodlanabilir. CER ve CRT uzantıları neredeyse eşanlamlıdır. *nix sistemleri arasında en yaygındırlar. bir sertifika açık anahtarı ve çok daha fazla bilgiyi içerir (en önemlisi, elbette genel anahtar üzerindeki Sertifika Yetkilisinin imzasıdır).

gizli anahtar içeriği
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----

açık anahtar içeriği
-----BEGIN CERTIFICATE----- 
-----END CERTIFICATE-----

Bir sertifika zinciri kök, ara ve son sertifika olacak şekilde aşağıdaki formatta olacaktır:

-----BEGIN CERTIFICATE-----
(Birincil SSL sertifikanız: musteri.com.tr.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Ara Sertifika Yetkilisinin sertifikası: ara_sertifika_yetkilisi_kok_sertifikası.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Kök sertifikanız: TrustedRoot_kok_sertifika_yetkilisinin_kok_sertifikasi.crt)
-----END CERTIFICATE-----

.cer alternatif .crt biçimidir (Microsoft Convention). .crt dosyasını .cer (her iki DER kodlu .cer veya base64 [PEM] kodlu .cer) biçimine dönüştürmek için Windows'u kullanabilirsiniz .cer dosya uzantısı IE tarafından komut olarak da tanınır içeriği almak ve/veya görüntülemek için bir iletişim kutusu görüntüleyen bir MS cryptoAPI komutu (özellikle rundll32.exe cryptext.dll, CryptExtOpenCER) nasıl çalıştırılır.

.cert dosyasını .cer dosyasına dönüştürmek için:

$ openssl x509 -inform PEM -in <dosya_yolu>/<sertifika_dosyasinin_adi>.cert -out <yeni_dosya_adi>.crt

CRT Dosyasını CER dosyasına dönüştürmek için aşağıdaki ekran görüntülerini takip edelim:

.crt uzantılı dosyaya çift tıklayalım:

image image image image


.pkcs12 .pfx .p12 Bu, hem genel hem de özel sertifika çiftlerini içeren şifreli bir kapsayıcı biçimidir. .pem Dosyalarının aksine, bu kapsayıcı tamamen şifrelenmiştir. Başlangıçta RSA tarafından Açık Anahtarlı Şifreleme Standartlarında tanımlanmıştır (PKCS kısaltmasıdır). "12" varyantı başlangıçta Microsoft tarafından geliştirilmiş ve daha sonra RFC 7292 olarak sunulmuştur. Açık/gizli anahtarlarını içeren şifreli kapsayıcı PKCS#12 olarak adlandırılır. Sadece açık anahtar ise PKCS#7 kapsayıcısıdır.

PKCS = Ortak Anahtar Şifreleme Standardı (Public Key Cryptography Standard)

Openssl PKCS dosyalarını hem açık hem de gizli anahtarlarla bir .pem dosyasına dönüştürebilir:

$ openssl pkcs12 -in file-to-convert.p12 -out converted-file.pem -nodes

.p7b .keystore, RFC 2315'te PKCS numarası 7 olarak tanımlanan bu, Windows tarafından sertifika değişimi için kullanılan bir formattır. Java bunları yerel olarak anlar ve bunun yerine .keystore uzantısını kullanır.


.crl, Sertifika iptal listesi. Sertifika Yetkilileri, bunları süreleri dolmadan sertifikaların yetkisini kaldırmanın bir yolu olarak üretir. Bunları bazen CA web sitelerinden indirebilirsiniz (CLR içinde detaylı başlığı okuyabilirsiniz).

Dosya Dönüşümleri

x509 -> PEM

$ openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem

PEM -> XXX Formatına

PEM -> DER

$ openssl x509 -outform der -in certificate.pem -out certificate.der

PEM -> P7B

$ openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer

PEM -> PFX

$ openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt

PEM oluşturmadan P12 dönüşümüne:

$ openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 365 -out certificate.pem

Oluşturulan sertifikayı inceleyin:
$ openssl x509 -text -noout -in certificate.pem

Anahtarınızı ve sertifikanızı bir PKCS#12 (P12) paketinde birleştirin:
$ openssl pkcs12 -inkey key.pem -in certificate.pem -export -out certificate.p12

P2 dosyanızı doğrulayın
$ openssl pkcs12 -in certificate.p12 -noout -info

DER -> XXX Formatına

DER -> PEM

$ openssl x509 -inform der -in certificate.cer -out certificate.pem

P7B -> XXX Formatına

P7B to PEM

$ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

P7B to PFX

P7B -> CER
$ openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

CER + Private Key -> PFX
$ openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer

PFX -> XXX Formatına

PFX (PKCS#12) -> PEM

$ openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

PFX -> PKCS#8

PFX (PKCS#12) -> PEM
$ openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem

PEM -> PKCS#8
$ openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8

x509 sertifikaları açık anahtar (public key) ve diğer kodlanmış bilgileri içerir.

image

  • İlk kez 1988'de elektronik dizin hizmetleri için X.500 standartlarının yanı sıra tanıtıldı
  • X.509, IETF’in Açık Anahtar Altyapısı tarafından internet kullanımı için uyarlanmıştır
  • X.509 v2 sertifika iptal listesi (CRL) ve X.509 sertifika yolu doğrulaması için bir algoritma içerdi
  • RFC 5280, X.509 v3 sertifikasını belirledi

X.509, ortak anahtar sertifikaları ve kriptografik anahtar çiftlerini

  • web siteleri,
  • kişiler
  • veya kuruluşlar

gibi varlıklarla güvenli bir şekilde ilişkilendiren dijital belgeler için standart bir biçimdir.

X.509 sertifikalarının yaygın uygulamaları şunları içerir:

  • Kimliği doğrulanmış ve şifrelenmiş web taraması için SSL/TLS ve HTTPS
  • S/MIME protokolü aracılığıyla imzalanmış ve şifrelenmiş e-posta
  • Kod imzalama
  • Belge imzalama
  • İstemci kimlik doğrulaması
  • Devlet tarafından verilmiş elektronik kimlik
# OpenSSL intermediate CA configuration file.
# Copy to `/root/ca/intermediate/openssl.cnf`.
# Kaynaklar:
# - https://linux.die.net/man/1/ca
[ ca ]
# `man ca`
default_ca = CA_default
[ CA_default ]
# Directory and file locations.
dir = ./ca
certs = $dir/intermediate/certs
crl_dir = $dir/intermediate/crl
new_certs_dir = $dir/intermediate/newcerts # Zorunlu. -outdir komut satırı seçeneğiyle aynı. Yeni sertifikaların yerleştirileceği dizini belirtir.
database = $dir/intermediate/index.txt # Zorunlu. Kullanılacak metin tabanlı veritabanı dosyası. Bu dosya başlangıçta boş olsa da mevcut olmalıdır.
serial = $dir/intermediate/serial # Zorunlu. Onaltılı olarak kullanılacak bir sonraki seri numarasını içeren bir metin dosyası.
# Bu dosya mevcut olmalı ve geçerli bir seri numarası içermelidir.
RANDFILE = $dir/intermediate/private/.rand #
# The root key and root certificate.
private_key = $dir/private/ca.key # Zorunlu. -keyfile seçeneğiyle aynı. CA özel anahtarını içeren dosya.
certificate = $dir/certs/ca.crt # Zorunlu. -cert ile aynı. CA sertifikasını içeren dosyayı verir.
# For certificate revocation lists.
crlnumber = $dir/crlnumber # Onaltılı olarak kullanılacak bir sonraki CRL numarasını içeren bir metin dosyası.
# Crl numarası yalnızca bu dosya varsa CRL'lere eklenir. Bu dosya varsa, geçerli bir CRL numarası içermelidir.
crl = $dir/crl/intermediate.crl
crl_extensions = crl_ext # yapılandırma dosyasının dahil edilecek CRL uzantılarını içeren bölümü.
default_crl_days = 30
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256 # Zorunlu. -md seçeneğiyle aynı. Kullanılacak mesaj özeti.
name_opt = ca_default
cert_opt = ca_default
default_days = 1850 # default_days seçeneğini komut satırında -days ile ezebiliriz.
# default_days, default_startdate ve default_enddate sadece `openssl ca ...` komutuyla kullanılır (req veya x509 ile kullanılamaz).
preserve = no
policy = policy_loose
[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_loose ]
# Allow the intermediate CA to sign a more diverse range of certificates.
# See the POLICY FORMAT section of the `ca` man page.
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
# Options for the `req` tool (`man req`).
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
# Extension to add when the -x509 option is used.
x509_extensions = v3_ca
[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name
localityName = Locality Name
0.organizationName = Organization Name
organizationalUnitName = Organizational Unit Name
commonName = Common Name
emailAddress = Email Address
# Optionally, specify some defaults.
countryName_default = TR
stateOrProvinceName_default = Turkey
localityName_default = IZMIR
0.organizationName_default = Ara Sertifika Yetkilisi IZMIR
organizationalUnitName_default =
emailAddress_default =
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ usr_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always
[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning
[req]
distinguished_name = dn
req_extensions = v3_req
[dn]
C = Ulke
C_default = TR
L = Sehir
L_default = ANTALYA
O = Organizasyon ismi
O_default = Musteri E-Ticaret Sirketi Ltd. Sti.
OU = Organizasyon Birimi
OU_default = E-Ticaret Yazilim Gelistirme Birimi
CN = Ortak Ad
CN_default = *.musteri.com.tr
commonName_max = 64
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.musteri.com.tr
DNS.2 = forum.musteri.com.tr
DNS.3 = sss.musteri.com.tr
IP.1 = 127.0.0.1
IP.2 = 192.168.56.1
IP.3 = 87.67.231.12
# OpenSSL root CA configuration file.
# Copy to `/root/ca/openssl.cnf`.
[ ca ]
# `man ca`
default_ca = CA_default
[ CA_default ]
# Directory and file locations.
dir = /root/ca
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
RANDFILE = $dir/private/.rand
# The root key and root certificate.
private_key = $dir/private/ca.key.pem
certificate = $dir/certs/ca.cert.pem
# For certificate revocation lists.
crlnumber = $dir/crlnumber
crl = $dir/crl/ca.crl.pem
crl_extensions = crl_ext
default_crl_days = 30
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days = 375
preserve = no
policy = policy_strict
[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_loose ]
# Allow the intermediate CA to sign a more diverse range of certificates.
# See the POLICY FORMAT section of the `ca` man page.
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
# Options for the `req` tool (`man req`).
default_bits = 2048
distinguished_name = req_distinguished_name
string_mask = utf8only
# SHA-1 is deprecated, so use SHA-2 instead.
default_md = sha256
# Extension to add when the -x509 option is used.
x509_extensions = v3_ca
[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name
localityName = Locality Name
0.organizationName = Organization Name
organizationalUnitName = Organizational Unit Name
commonName = Common Name
emailAddress = Email Address
# Optionally, specify some defaults.
countryName_default = GB
stateOrProvinceName_default = England
localityName_default =
0.organizationName_default = Alice Ltd
organizationalUnitName_default =
emailAddress_default =
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ usr_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always
[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment