07 stycznia 2015 blog ssl security apache lighttpd
Większość podpisanych certyfikatów jest płatna, dlatego warto skorzystać z darmowej alternatywy. Za darmo dostajemy certyfikat klasy pierwszej, dzięki któremu możemy zabezpieczyć naszą domenę oraz jedną poddomenę.
Rejestrujemy się na stronie StartSSL. Wybramy Sign-up i postępujemy zgodnie z instrukcjami. Podajemy nasze dane osobowe i wklejamy kod przesłany na mail.
Pod koniec rejestracji nasz wstępny certyfikat zostanie dodany do przeglądarki. Przy kolejnych wizytach będziemy go używać, aby się zalogować. Warto stworzyć kopię zgodnie z instrukcją.
Klikamy na zakładkę Validations Wizard i wybieramy Domain Name Validation.
Podajemy naszą domenę.
Wybieramy mail, na który zostanie wysłany kod potwierdzający.
Klikamy na zakładkę Certificates Wizard i wybieramy Web Server SSL/TLS Certificate.
Wpisujemy hasło do klucza prywatnego.
Po wygenerowaniu klucza zapisujemy go do pliku, np. ssl-encrypted.key
.
Odszyfrowujemy:
openssl rsa -in ssl-encrypted.key -out ssl.key
Podajemy hasło naszego klucza prywatnego.
Wygenerowaliśmy plik ssl.key
.
Wybieramy domenę, do jakiej certyfikat przypisujemy.
Wybieramy poddomenę, do jakiej certyfikat przypisujemy.
Zapisujemy wygenerowany certyfikat do pliku ssl.crt
.
Trzeba również ściągnąć intermediate
oraz root
, zgodnie z instrukcjami.
Możemy skorzystać z instrukcji na stronie StartSSL lub z innego mojego wpisu.
Poniżej przykład dla Apache.
Wgrywamy 4 pliki ssl.crt
, ssl.key
, sub.class1.server.ca.pem
, ca.pem
na nasz serwer i konfigurujemy VirtualHost
:
<IfModule mod_ssl.c>
<VirtualHost devsite.pl:443>
ServerName devsite.pl
ServerAlias devsite.pl
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCompression off
# Add six earth month HSTS header for all users...
Header always set Strict-Transport-Security "max-age=15768000"
# If you want to protect all subdomains, use the following header
# ALL subdomains HAVE TO support HTTPS if you use this!
# Strict-Transport-Security: "max-age=15768000 ; includeSubDomains"
SSLCipherSuite 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA'
SSLCertificateFile /etc/apache2/cert/ssl.crt
SSLCertificateKeyFile /etc/apache2/cert/ssl.key
SSLCertificateChainFile /etc/apache2/cert/sub.class1.server.ca.pem
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
Możemy ustawić przekierowanie z normalnego ruchu HTTP na HTTPS:
<VirtualHost devsite.pl:80>
ServerName devsite.pl
ServerAlias devsite.pl
Redirect permanent / https://devsite.pl/
</VirtualHost>
Poniżej przykład dla Lighttpd.
server.modules += ( "mod_auth" )
server.modules += ( "mod_setenv" )
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/lighttpd.pem" #cat ssl.key ssl.crt > lighttpd.pem
ssl.ca-file = "/etc/lighttpd/ca.crt"
ssl.cipher-list = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA"
ssl.honor-cipher-order = "enable"
ssl.use-compression = "disable"
ssl.use-sslv2 = "disable"
ssl.use-sslv3 = "disable"
ssl.disable-client-renegotiation = "enable"
setenv.add-response-header = (
"X-Frame-Options" => "DENY",
"Strict-Transport-Security" => "max-age=15768000", # six months
# use this only if all subdomains support HTTPS!
# "Strict-Transport-Security" => "max-age=15768000; includeSubDomains"
)
$HTTP["useragent"] =~ "MSIE" {
server.max-keep-alive-requests = 0
}
}
$HTTP["host"] == "devsite.pl" {
server.document-root = "/home/dmn/http/"
auth.require = (
"/priv/" => ( "method" => "basic", "require" => "valid-user", "realm" => "private stuff" ),
)
}
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/etc/lighttpd/htpasswd"
Przekierowanie:
$HTTP["scheme"] == "http" {
$HTTP["host"] == "devsite.pl" {
url.redirect = (".*" => "https://devsite.pl$0")
setenv.add-environment = ( "HTTPS" => "on" )
}
}
Jeśli wszystko wykonaliśmy poprawnie, taki oto widok powinien być naszą nagrodą :)
W innym wypadku warto zerknąć do FAQ.
Poprawność zastosowanych zabezpieczeń warto sprawdzić na stronie SSL Labs.