Php ldap and Custom CA signed certificates


Have you ever had a problem connecting a secure ldap server using php's ldap functions?

It is probably caused by certificate trust issues and 9 out of 10 times root cause is the custom CA can not be recognized by php interpreter.  And as any self respecting devops engineer would solve it by introducing CA's certificate to the system.

But php is a damned monster the normal way to do this, putting the certificate to cacerts dir never works. Even adding  
TLS_CACERT [full.path.to.ca.cert]
line into ldap.conf won't help you. Of course some lucky ones with special deals with Murphy may not have this issue. But believe me, php.net's documentation comments and the internet are full of unresolved ca issues. And sometimes the solution presented is "recompile php with openssl/gnutls/libressl with this custom conf".

If the hell has not opened doors and the earth is not full with demons this solution can not be accepted. there must be a solution.

And of course there is a simple one. PHP uses openssl and openssl respects some environment variables even if you can not make it respect an ldap.conf file. So adding the following lines to your php app with the corresponding paths to your case will fix the issue:

<?php
   putenv('LDAPTLS_CACERTDIR=/etc/ssl/certs/');
   putenv('LDAPTLS_CACERT=/etc/ssl/certs/myCustomCA.crt');
?>

But sometimes even adding ca cert can not be enough. You may have expired certificates or something. So you may need to scrape away the whole certificate validation process. Adding

<?php
   putenv('LDAPTLS_REQCERT=never');
?>
Line to the beginning of your script would solve this issue. And I strongly advice you against doing this.

But this is a simple work around which would work for small scripts or isolated incidents. If you have an established application and you can not modify it? It's one solution to set this environment variables globally in the php server or you may use php's mostly unknown and discarded gem auto_prepend_file.

Just create a file with only the envirionment variable setting lines and use php.ini to prepend this to all php files.





15 Temmuz 2014

Posted In: 2 cents, ca, certificate, devops, ldap, openssl, php, self signed, SSL, TLS

SSL Sertifikası Nasıl Üretilir?

SSL sertifikasının iki farklı türü bulunuyor; bunlar otorite imzalı SSL sertifikaları ve kendini imzalamış (self signed) SSL sertifikaları.

Kendini imzalamış sertifikalar genellikle test amaçlı veya lokal kullanımda tercih ediliyor. Biri diğerine göre daha güvenli değil. Otoriterler güvenli anahtar değiş tokuşuna olanak sağlarlar ve paylaşılan açık anahtarların doğruluğunu kanıtlarlar.

https sslSSL, anahtar değişiminde asimetrik algoritmalar (RSA,DSA), akan trafikte simetrik algoritmalar (AES, 3DES, RC4 …) kullanılır. Asimetrik kriptografi yaygın olarak açık anahtar (public key, PKI) kriptografisi olarak da anılmaktadır. Açık anahtar kriptografisinde açık (public) ve gizli (private) olmak üzere iki anahtar oluşturulur. Açık anahtar ile kriptolanan veri ancak anahtar çiftinin gizli olan yarısı ile çözülebilir. Bunun tam tersi; gizli anahtar ile kriptolanan veri anahtar çiftinin açık olan yarısı ile çözümlenebilir, bu kaynağın doğrulanması için kullanılır (sertifika doğrulama).

SSL açık anahtar ile şifrelenmiş veriyi İnternet’e gönderiyorsa, neden sertifikaya ihtiyaç duyuluyor? Sertifikalar, güvenilir sertifika otoriteleri tarafından imzalanmış açık anahtarlardır ve sertifikayı gönderen tarafın gerçekten o kişi olduğunu doğrularlar. Güvenilir otorite tarafından imzalanmayan sertifikalar kullanıldığında da veri kriptolanır fakat iletişim kurulan tarafın doğru kişi olduğu kanıtlanamaz.

1- Özel Anahtarın Oluşturulması

SSL özel anahtar oluştururken seçebileceğimiz iki farklı algoritma var, DSA ve RSA. Algoritma seçimi yaparken pek çok farklı kriter göz önünde bulundurulur. Seçimi siyasi veya teknik detaylar belirleyebilir. Örnek olarak yaygın kullanılan RSA‘yı seçiyoruz;

openssl genrsa -out sunucu.pem 2048

Oluşturulan dosya PEM biçimindedir ve ASCII olarak okunabilir.

2- Sertifika İmza Talebinin Oluşturulması CSR (Certificate Signing Request)

CSR üretilirken, özel anahtar kullanılarak açık anahtar oluşturulur ve  imzalanır. Bu CSR dosyası sertifika otoritesine gönderilerek imzalanması istenir. İşlemden sonra otorite imzalı açık anahtarı sertifika olarak geri döner. Bu süreçte gizli anahtarın karşı tarafa gönderilmesine gerek yoktur.

CSR dosyasını sertifika otoritesine göndermek yerine kendi özel anahtarımız ile imzalayabiliriz. Bu tip sertifikalara, kendi imzalamış sertifika (self signed certificate) denir.

CSR dosyası oluşturulurken, sertifika üzerinde X.509 alanlarının tanımlanması istenecek. Bu alanlardan en önemlisi “Common Name” alanıdır. Bu alana SSL ile korumak istediğiniz alanadını yazmanız gerekiyor (fully qualified domain name).

openssl req -new -key sunucu.pem -out sunucu.csr

Country Name (2 letter code) [GB]:TR
State or Province Name (full name) [Berkshire]:Cankaya
Locality Name (eg, city) [Newbury]:Ankara
Organization Name (eg, company) [My Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:ozcan.com
Email Address []:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

3- Kendini İmzalamış Sertifika (self-signed certificate)

Oluşturacağınız sertifikayı bir otoriteye imzalatmayacaksanız, kendi özel anahtarınız ile CSR dosyasının imzalanması gerekiyor. Self-signed sertifika kullandığınızda tarayıcınız uyarı görüntüleyecektir. Bu uyarının sadece kendi sisteminizde görüntülenmesini önlemek için, sertifikayı tarayıcınızın güvenilir kök sertifikalar (trusted root certification authorities) bölümüne eklemeniz yeterli.

openssl x509 -req -days 365 -in sunucu.csr -signkey sunucu.pem -out sunucu.crt

4- Özel Anahtarın Güvenlik Parolasının Kaldırılması

Özel anahtar oluşturulurken tanımlanmış bir parola var ise bunun kaldırılması, web servisleri yeniden başlatıldığında kolaylık sağlayacaktır. Ek güvenlik gereken durumlarda bu parola tanımlanır ve web servislerinin her açılışında parolanın girilmesi gerekir. Parolayı kaldırdıktan sonra özel anahtara sadece root kullanıcısının erişebilir olması güvenliği açısından önemlidir.

openssl rsa -in server.key.org -out server.key

5- Sertifikanın Web Sunucuya Eklenmesi

Aşağıda Apache web sunucu için örnek ayar satırları bulunuyor;

SSLEngine on
SSLCertificateFile /usr/local/apache/conf/sunucu.crt
SSLCertificateKeyFile /usr/local/apache/conf/sunucu.pem
SSLCACertificateFile /usr/local/apache/conf/sub.class1.server.ca.pem

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !$

CipherSuite ile trafik kripto algoritma önceliği belirlenir. Anahtar derinliği arttıkça performans düşecektir.

Hamdi ÖZCAN – ozcan.com

25 Haziran 2014

Posted In: 3DES, AES, apache, dsa, lkd, openssl, pki, private key, public key, rsa, sertifika, SSL, teknik, tr, web

WP Twitter Auto Publish Powered By : XYZScripts.com