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://.
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.
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.
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.