07 stycznia 2015 blog ssl security apache lighttpd

Jak pobrać podpisany darmowy certyfikat SSL dla naszej domeny.

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ę.

Rejestracja

01

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.

Kolejne wizyty

02

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ą.

Walidacja domeny

18

Klikamy na zakładkę Validations Wizard i wybieramy Domain Name Validation.

19

Podajemy naszą domenę.

20

Wybieramy mail, na który zostanie wysłany kod potwierdzający.

Tworzenie certyfikatu

03

04

Klikamy na zakładkę Certificates Wizard i wybieramy Web Server SSL/TLS Certificate.

05

Wpisujemy hasło do klucza prywatnego.

06

07

Po wygenerowaniu klucza zapisujemy go do pliku, np. ssl-encrypted.key.

08

Odszyfrowujemy:

openssl rsa -in ssl-encrypted.key -out ssl.key

09

Podajemy hasło naszego klucza prywatnego.

10

Wygenerowaliśmy plik ssl.key.

11

Wybieramy domenę, do jakiej certyfikat przypisujemy.

12

13

Wybieramy poddomenę, do jakiej certyfikat przypisujemy.

14

Zapisujemy wygenerowany certyfikat do pliku ssl.crt.

15

16

Trzeba również ściągnąć intermediate oraz root, zgodnie z instrukcjami.

Instalacja certyfikatu na serwerze Apache

17

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>

Instalacja certyfikatu na serwerze Lighttpd

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" )
	}
}

Weryfikacja

21

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.

Linki