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.
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
$ 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
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
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
$ 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:..............
$ 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>
$ 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: