8.4. MOD_SSL

Af: Gunner Poulsen

Alle webtjenester, hvor dine brugere sender adgangskoder over internettet, skal være krypterede for at undgå at give crackere adgang til dit system. Hvis du fx tænker på at give eleverne adgang til at bruge skolens postserver hjemmefra, bør det ske via et webmail-script, hvor du har krypteret trafikken. Der findes et tillægsprogram til Apache, der klarer det - Mod_ssl. Det bygger på krypteringsprogrammet Openssl. Jeg vil her beskrive, hvordan man installerer Openssl og Mod_ssl. Når du er færdig mærkes der ingen forskel i den normale brug af Apache, du har bare fået muligheden for at gøre nogle kataloger tilgængelige via https:// (krypteret http) istedet for http://.

8.4.1. Installation af mod_ssl i RedHat 6.2

Hvis du kører RedHat 6.2 skal du have hentet Openssl og den Mod_ssl pakke, der passer til Apache 1.3.12, som følger med RedHat 6.2. Jeg foreslår at bruge mod_ssl-2.6.6_1.3.12-1.i386.rpm fra www.gnuskole.dk og Openssl fra ftp.sslug.dk. Installer dem som root med:

[root@gnuskole /root]# rpm -Uvh openssl-*.i386.rpm
[root@gnuskole /root]# rpm -Uvh mod_ssl-2.6.6_1.3.12-1.i386.rpm 

eller brug din foretrukne RPMmanager fx. Gnorpm.

Nu er mod_ssl faktisk installeret! Der er tilføjet en særlig httpd.conf.ssl til /etc/httpd/conf/, hvor der også er tilføjet filerne server.crt og server.key. De sidste to filer er et testcertificat og dets nøgle - dem vender vi tilbage til. I /etc/httpd/conf/httpd.conf er der til slut tilføjet:

Include conf/httpd.conf.ssl

det gør, at den nye fil læses efter den normale.

Du kan nu skrive https:// i stedet for http:// i en URL og den hentes krypteret. Hvis du vil have, at siderne i et katalog kun skal kunne hentes via SSL skal

<Directory /home/httpd/html/post>
Options ExecCGI
AllowOverride None
</Directory>

tilføjes til /etc/httpd/conf/httpd.conf.ssl. Vælg de Options, du ønsker.

Du kan finde ud af meget om Openssl og mod_ssl i den dokumentation, der blev installeret i /home/httpd/html/ssl-doc/. Specielt kapitel 6 er rent guf.

8.4.2. Installation af mod_ssl i RedHat 7.x

I Redhat 7.0 og 7.1 er alting stort set lavet om, derfor kommer det lige igen. Start med at se efter opdateringer af pakkerne på ftp.sslug.dk . Installer dem med:

[root@gnuskole /root]# rpm -Uvh apache*.rpm
[root@gnuskole /root]# rpm -Uvh openssl*.rpm
[root@gnuskole /root]# rpm -Uvh mod*.rpm

Så er du faktisk klar til at lave dit certifikat. Vær opmærksom på at opsætningen af https i RedHat 7.x foregår sidst i selve filen /etc/httpd/conf/httpd.conf

Vi vil foreslå at du opretter et særligt script-katalog til cgi-scripts der skal afvikles krypteret. Vi vil i resten af bogen gå ud fra at det er /var/www/scgi-bin

I /etc/httpd/conf/httpd.conf skal du så tilføje følgende til den del der handler om https:

ScriptAlias /scgi-bin/ "/var/www/scgi-bin/"

og derefter:

<Directory /var/www/scgi-bin>
	Options ExecCGI
	AllowOverride None
    	Allow from all
</Directory>

Put ALLE de krypterede cgi-scripts her. og brug /var/www/cgi-bin til tællere og andre scripts det ikke overfører system-brugernavne og adgangskoder.

I RedHat 7.0 ligger dokumentationen i /var/www/html/manual/mod/mod_ssl.

8.4.3. Lav dit eget SSL-server-certifikat

Det testcertifikat, der kom med mod_ssl, er meget godt til testformål, men det udløber efter 30 dage og giver nogle unødvendige fejlmeddelelser til brugerne. Heldigvis er det ikke svært at lave sit eget.

Servercertifikater indeholder en signatur fra en såkaldt Certificat Autority (CA). Det er dyrt at få sit certificat underskrevet af en af de store CA'er. Men til at kryptere sin trafik, så fremmede ikke kan sniffe dine brugeres adgangskoder er et såkaldt "selfsigned server certificat" helt fint - og gratis.

Før vi starter på at lave certifikatet vil jeg foreslå dig at lave et særligt katalog til at udvikle det i. Jeg foreslår dig at oprette /root/ssl/

[root@gnuskole /root]# mkdir /root/ssl/ 

Vi starter med at lave en CA underskrift til at underskrive vores certifikat med. Stil dig i det nye katalog /root/ssl/ Så skal vi have fyret en masse kommandoer af:

[root@gnuskole ssl]# openssl genrsa -des3 -out ca.key 1024
Enter PEM pass phrase: Her skrives en hemmelig sætning (CA adgangssætning) - husk den 
Verifying password - Enter PEM pass phrase: Her skrives den samme hemmelige sætning igen (CA adgangssætning) - husk den
[root@gnuskole ssl]# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Enter PEM pass phrase: Her skrives den samme hemmelige sætning igen (CA adgangssætning) - husk den
Country Name (2 letter code) [AU]: DA
State or Province Name (full name) [Some-State]: Danmark
Locality Name (eg, city) []: Gnu (Skriv hvor skolen ligger)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: GnuSkole (Skolens navn) 
Organizational Unit Name (eg, section) []: .  (Skriv et . hvis du ikke vil skrive noget) 
Common Name (eg, YOUR name) []: Kontoret på Gnu Skole (Dette navn vil optræde i certifikatet).

Nu har du fået lavet din CA nøgle og dit CA certificat.

Før vi skal igang med at underskrive et servercertifikat, skal vi have kopieret det script, vi skal bruge til det nye katalog. I RedHat 6.2 gøres det med:

[root@gnuskole ssl]# cp /usr/share/ssl/mod_ssl/sign.sh /root/ssl/sign.sh

I RedHat 7.x følger scriptet sign.sh af uforklarlige grunde ikke med, men det kan hentes her. Og det lægges i /root/ssl/

Nu skal vi så have lavet et certifikat til webserveren. Skriv:

[root@gnuskole ssl]# openssl genrsa -des3 -out server.key 1024
Enter PEM pass phrase: Skriv en ny sætning (din serveradgangssætning) - husk den
Verifying password - Enter PEM pass phrase: Skriv den samme nye sætning (din serveradgangssætning) - husk den
[root@gnuskole ssl]# openssl req -new -key server.key -out server.csr
Enter PEM pass phrase: Her skrives sin serveradgangssætning.
Country Name (2 letter code) [AU]: DA
State or Province Name (full name) [Some-State]: Danmark
Locality Name (eg, city) []: Gnu (Skriv skolens by)
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Gnu Skole
Organizational Unit Name (eg, section) []: Internetserveren (eller . )
Common Name (eg, YOUR name) []: www.gnuskole.dk (DET ER VIGTIGT AT DU DENNE GANG SKRIVER SERVERENS NAVN -OBS)
Email Address []: nørd@gnuskole.dk (Skriv din egen e-mailadresse på skolen)
A challenge password []: En ny adgangskode (ansøgningsadgangskode)
An optional company name []: Gnu Skole (Skolens navn) 
[root@gnuskole ssl]# ./sign.sh server.csr
Enter PEM pass phrase: Skriv din CA adgangssætning (Den første du skrev)
Sign the certificate? [y/n]: y
1 out of 1 certificate requests certified, commit? [y/n] y

Så har du lavet den server.key og server.crt fil du kan bruge. Gem dem et sikkert sted i deres nuværende form! (og gem adgangssætningerne). De er dog lidt træls at bruge, fordi man skal skrive adgangssætningen hver gang man genstarter httpd. Du bør derfor lave en udgave af server.key uden adgangskode.

[root@gnuskole ssl]# cp server.key server.key.org
[root@gnuskole ssl]# openssl rsa -in server.key.org -out server.key
Enter PEM pass phrase: Skriv din serveradgangssætning 
[root@gnuskole ssl]# chmod 400 server.key

Den sidste kommando er ULTRAVIGTIG - da det absolut kun er Root, der må kunne læse den ukrypterede server.key

Nu mangler der bare at kopiere server.key og server.crt på plads, og tjekke, at server.key stadig kun kan læses af Root. I RedHat 6.2 skal du gøre følgende:

[root@gnuskole ssl]# cp -p /root/ssl/server.key /etc/httpd/conf/server.key
cp: overwrite `/etc/httpd/conf/server.key'? y
[root@gnuskole ssl]# cp -p /root/ssl/server.crt /etc/httpd/conf/server.crt
cp: overwrite `/etc/httpd/conf/server.crt'? y
[root@gnuskole ssl]# cd /etc/httpd/conf/
[root@gnuskole conf]# ls -all
-r--------    1 root     root          887 Jun  2 01:47 server.key

I RedHat 7.x er de tilsvarende kommandoer:

[root@gnuskole ssl]# cp -p /root/ssl/server.key /etc/httpd/conf/ssl.key/server.key
cp: overwrite `/etc/httpd/conf/ssl.key/server.key'? y
[root@gnuskole ssl]# cp -p /root/ssl/server.crt /etc/httpd/conf/ssl.crt/server.crt
cp: overwrite `/etc/httpd/conf/ssl.crt/server.crt'? y
[root@gnuskole ssl]# cd /etc/httpd/conf/ssl.key/
[root@gnuskole conf]# ls -all 
-r--------    1 root     root          887 Jun  2 01:47 server.key

Hvis sidste linie ikke starter med

-r--------    1 root     root

har du sikkert glemt -p i cp kommandoen. Kør STRAKS:

[root@gnuskole conf]# chmod 400 server.key 
og
[root@gnuskole conf]# ls -all 

for at se at det er i orden nu.

Hvis det er i orden er det bare at skrive:

[root@gnuskole conf]# /etc/init.d/httpd restart
Starting httpd:                  [  OK  ]

og se at alt er i orden.