keytool - bozkurtmithat/glaptop GitHub Wiki

# SERTİFİKA İŞLEMLERİ

**resources/security/my-key.p12** sertifika deposu liberty sunucusunun kullandığı sertifikaları tutar. Alınabilecek ssl/tls hataları için aşağıdaki işlemler yapılabilir. Sertifika işlemleri için java ile gelen **keytool** veyA **openssl** programı kullanılır.

## Sertifika Görüntüleme

### Uzak sunucudaki sertifikayı görüntüleme

```sh
keytool -printcert -sslserver host[:port] -rfc

openssl s_client -connect host:port -showcerts </dev/null | openssl x509 -outform PEM > server_certificates.pem

Örnekler

#keytool ile
keytool -printcert -sslserver www.google.com -rfc

#openssl ile
openssl s_client -connect www.google.com:443 -showcerts </dev/null | openssl x509 -outform PEM > google.pem

Dosya sistemindeki sertifikayı görüntüleme

#keytool ile 
keytool -printcert  -file  google.pem

#openssl ile
openssl x509 -in certificatename.cer -outform PEM [-out cert.pem]

Sertifika deposundaki sertifikayı görüntüleme

keytool -list  -rfc -alias takmaAd -keystore src/main/liberty/config/resources/security/key.p12 -storetype PKCS12 -storepass sifre

Self-Signed Sertifika Oluşturma

Self-signed(Kendinden onaylı yani veren kuruluşu(CA) kendi olan) sertifikalar güvenilen bir otorite(Certificate Authority(CA) ) tarafından sağlanmadığı için SSL/TLS işlemlerinde kullanılmak istendiğinde browser veya sunucu tarafından engellenebilirler. Bu sorunu aşmak için sertifikanın açık anahtarını browser veya sunucunun güven deposuna(trust store) eklemeniz gerekmektedir.

keytool -genkey -keyalg RSA -validity 3600 -keysize 2048 -dname="CN=mydomain.com.tr, OU=ITDPRT, O=MYCOMPANY, L=YENIMAHALLE, ST=ANKARA, C=TR" -alias selfsigned-mydomain.com.tr -keystore src/main/liberty/config/resources/security/key.p12 -storetype PKCS12 -storepass sifre

Mevcut sertifikayı sertifika deposuna ekleme

Javanın default sertifika deposu cacerts dosyasıdır. Bu dosyaya yazma hakkınız olması gerektiğini unutmayın. Dosyaya ekleme, silme ve okuma işlemi yapabilmeniz için parolasını bilmeniz gereklidir. Varsayılan şifre changeit dir.

Open Liberty için server.xml dosyasında sertifika deposunun tipi, adı, yolu ve şifresi özelleştirilebilir. Varsayılan olarak kendisini ${server.output.dir}/resources/security/key.p12 sertifika deposunu oluşturur. şifresi ${server.output.dir}/server.env dosyasında keystore_password anahtarı ile tutulmaktadır.

Uzak sunucudaki sertifikayı ekleme

keytool -printcert -sslserver host[:port] -rfc | keytool -import -noprompt -alias takmaAd -keystore ksdosyasi -storepass parola [-storetype tipi]

#ornek-1
keytool -printcert -sslserver www.google.com -rfc | keytool -import -noprompt -alias mydomain-open_liberty -keystore /usr/lib/jvm/jdk1.8.0_333/jre/lib/security/cacerts -storepass changeit -storetype pkcs12

#ornek-2
keytool -printcert -sslserver vault.k8s.mydomain.com.tr -rfc | keytool -import -noprompt -alias vault-k8s -keystore src/main/liberty/config/resources/security/my-key.p12 -storepass changeit -storetype pkcs12


#Aynı işlem `openssl` programı ile de yapılabilir.**
openssl s_client -connect host:port </dev/null | openssl pkcs12 -export -nokeys [-caname nm] [-passout option] -out p12file

Sertifika deposundaki bir sertifikayı dışarı alma

#dump cert to file
keytool -export -alias selfsigned-mydomain.com.tr -keystore src/main/liberty/config/resources/security/key.p12 -storetype PKCS12 -storepass sifre -file selfsigned-mydomain.com.tr-public.cer

Dosya sistemindeki sertifikayı ekleme


#import cert to trusted certificates. use -noprompt parameter to accept all prompts. 
keytool -import -alias selfsigned-mydomain.com.tr  -file selfsigned-mydomain.com.tr-public.cer -storepass changeit -storetype JKS -keystore /usr/lib/jvm/jdk1.8.0_333/jre/lib/security/cacerts

NGINX Sunucu Yapılandırması

Birden fazla ws'inizin olduğunu ve hepsinin aynı anda 443 portundan hizmet veren sunucularını ayağa kaldırmak istediğinizde ilk ayağa kalkan sunucu 443 portunu LISTEN edebilecek diğerleri muhtemelen açılamayacaktır. Bunun önüne geçmek için nginx gibi http sunucuyu reverse proxy olarak ayarlayabilirsiniz. 443 portunu LISTEN eden nginx'in kendisi olacak ve yapılandırmaya göre sunucunularınızı dağıtımı kendisi yapacaktır. Bunun avantajlarından biri de nginx root kullanıcısı ile çalışırken open liberty sunucularınız kendi kullanıcınız ile çalışabilir.

SELF-SIGNED sertifika oluşturma

SSL sertifikası ve özel anahtar dosyası genellikle birlikte bir SSL sertifikası sağlayıcısından veya kendiniz tarafından oluşturulur. SSL sertifikası genellikle bir sertifika otoritesinden (CA) satın alınır veya ücretsiz olarak alınabilir (örneğin, Let's Encrypt gibi).

SSL sertifikası oluşturulduktan sonra, genellikle bir özel anahtar (private key) oluşturmanız gerekecektir. Özel anahtar, SSL sertifikasını oluşturduğunuzda kullanılan şifreli bir anahtardır ve sunucunuzdaki güvenli iletişimi sağlamak için kullanılır.

Self-signed (kendi kendine imzalı) bir SSL sertifikası oluşturmak için OpenSSL gibi bir araç kullanabilirsiniz. Self-signed sertifika, bir sertifika otoritesi tarafından değil, doğrudan kendi kontrolünüz altında üretilen bir sertifikadır. Bu tür sertifikalar genellikle geliştirme veya test ortamları için kullanılır ve üretim ortamlarında tercih edilmezler, çünkü tarayıcılar genellikle bu tür sertifikaları güvenilir kabul etmezler. SSL sertifikası ve özel anahtar dosyası çifti genellikle şu adımları izleyerek oluşturulur:

1. Özel Anahtar (Private Key) Oluşturma:

Bu komut, 2048 bitlik bir RSA özel anahtarını /path/to/your_private_key.key dosyasına kaydeder. Dosya yolunu kendi tercihinize göre ayarlayabilirsiniz.

openssl genpkey -algorithm RSA -out /path/to/your_private_key.key -pkeyopt rsa_keygen_bits:2048

2. Self-signed Sertifika Oluşturma:

Bu komut, özel anahtarı kullanarak yeni bir self-signed sertifika oluşturur ve your_self_signed_certificate.crt adlı bir dosyaya kaydeder. -days 365, sertifikanın geçerlilik süresini 365 gün (1 yıl) olarak ayarlar. İhtiyacınıza göre bu süreyi değiştirebilirsiniz. Komut çalıştırıldığında, sertifikanın bilgilerini girmeniz istenecektir (örneğin ülke, şehir, organizasyon, alan adı gibi). Bu bilgiler, sertifikanın meta verileri olarak kullanılır. Bu adımlar sonucunda, belirttiğiniz yol (/path/to/) altında your_private_key.key (özel anahtar) ve your_self_signed_certificate.crt (self-signed sertifika) adında iki dosya oluşturulmuş olacaktır.

Nginx için SSL özelliğini aktif etmek amacıyla kullanabileceğiniz bir özel anahtar ve sertifika oluşturmak java keytool ile özeli anahtarı sertifikayı oluşturabiliyorsunuz ama sonrasında nginx ayarında ssl_certificate ve ssl_certificate_key değerlerini setlemek için bu değerleri keytool ile alamıyorsunuz bunu openssl ile yapmak gerekiyor.

openssl req -x509 -new -key /path/to/your_private_key.key -out /path/to/your_self_signed_certificate.crt -days 365

3. nginx ssl yapılandırması

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /path/to/your_ssl_certificate.crt;
    ssl_certificate_key /path/to/your_ssl_certificate_key.key;

    # Diğer SSL ayarları
    ssl_protocols TLSv1.2 TLSv1.3; # Kullanılan SSL protokolleri
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH'; # Şifreleme algoritmaları
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        proxy_pass http://backend_server_ip:backend_port;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

private key ve public certi tek bir dosyada birleştirebilir ve yapılandırmaya bu dosyayı verebilirsiniz.

cat /path/to/your_certificate.crt /path/to/your_private_key.key > /path/to/your_combined_cert.key

yukarıdaki yapılandırmadaki değerleri yenisi ile değiştirebilirsiniz

    ssl_certificate     /path/to/your_combined_cert.key;
    ssl_certificate_key /path/to/your_combined_cert.key;

Linux işletim sistemine sertifikayı tanımlama

#Install the CA certificate package
sudo apt-get install -y ca-certificates

#Copy your certificate to the local CA certificates directory
sudo cp local-ca.crt /usr/local/share/ca-certificates

#Add the certificate to your trust store
sudo update-ca-certificates

#Verify that your certificate is in pem format
sudo ls /etc/ssl/certs/ | grep local-ca