OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
OGC WMS en WFS beveiligd met PKI-certificaten: problemen en oplossingen Versie 0.1, 19-01-2015 Maarten Brugman, DICTU – Ministerie van Economische Zaken Inhoud 1. Inleiding ............................................................................................................................. 2 2. WMS en WFS over internet in combinatie met PKI-certificaten ...................................... 2 2.1. Tweezijdig TLS .......................................................................................................... 2 2.2. Probleem: URLs in de berichten zijn ‘ongeldig’ ....................................................... 3 3. Een oplossing ..................................................................................................................... 4 3.1. WMS/WFS vertalers .................................................................................................. 5 3.2. TLS clients ................................................................................................................. 5 3.3. Een TLS client en WMS/WFS vertaler ineen: Apache web server ........................... 5 3.3.1. Machine beschikbaar hebben voor Apache ........................................................ 5 3.3.2. Configuratie-parameters verzamelen ................................................................. 6 3.3.3. Apache installeren .............................................................................................. 6 3.3.4. Certificaat-request genereren ............................................................................. 6 3.3.5. Certificaat verkrijgen .......................................................................................... 7 3.3.6. Client-certificaat installeren ............................................................................... 7 3.3.7. CA-certificaten installeren ................................................................................. 7 3.3.8. Apache configureren .......................................................................................... 8 3.3.9. Testen ................................................................................................................. 9 3.3.10. Troubleshooting ................................................................................................. 9 3.3.11. Proxy-URL ter beschikking stellen aan gebruikers ............................................ 9 4. Onderhoud ........................................................................................................................ 10 4.1. Apache server ........................................................................................................... 10 4.2. Certificaat vernieuwen ............................................................................................. 10 4.3. Meerdere beveiligde servers ..................................................................................... 10
1 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
1. Inleiding De communicatie met services tussen overheden onderling over een onvertrouwd netwerk zoals internet wordt in de regel beveiligd tegen ongeautoriseerde toegang op basis van PKIcertificaten, zoals vereist wordt door de overheidsstandaard Digikoppeling. In feite gaat het om het zogenaamde TLS-protocol, dat zeer veel wordt gebruikt voor beveiliging van communicatie op internet. (TLS = Transport Level Security, hierover is veel informatie te vinden op Internet.) Ook voor het ontsluiten van OGC GIS-services van een overheid naar een andere kan dit protocol goed gebruikt worden. Dan gaat het vooral om WMS en WFS. Het inrichten van een met TLS beveiligde verbinding geeft echter regelmatig problemen. Er zijn in feite 2 functies nodig aan de client-kant: 1. de afhandeling van het TLS-protocol, als ‘client’ van een (of meerdere) met TLS beveiligde WMS/WFS-service 2. een proxy die de WMS/WFS-service ter beschikking stelt en die URLs die in WMS/WFS-berichten worden gebruikt, vertaalt naar URLs die ‘geldig’ zijn voor de GIS-applicaties die de WMS/WFS-services willen gebruiken. Wat is nou eigenlijk het probleem? Wat gaat er mis bij de inrichting? Dat verdient wat nadere uitleg.
2. WMS en WFS over internet in combinatie met PKIcertificaten WMS en WFS zijn gebaseerd op het bekende internet-protocol HTTP. En HTTP-verkeer valt prima te beveiligen met het protocol TLS (of zijn voorganger SSL, maar die is heden ten dage niet veilig genoeg meer). Bijna alle HTTP-verkeer dat vertrouwelijk is, zoals on-line bankieren en on-line webshops, wordt beveiligd met TLS. Dat heet ook wel HTTPS (HTTPSecure), maar in feite wordt het TLS-protocol gebruikt en daarbinnen weer HTTP. Bij de beveiliging van WMS/WFS-services tussen overheden wordt zoals gezegd vaak gebruik gemaakt van PKI-certificaten. PKI staat voor Public Key Infrastructuur, een stelsel van afspraken over gebruik van digitale certificaten voor beveiliging van communicatie en de daarbij behorende voorzieningen voor uitgifte en beheer van die digitale certificaten. De beveiliging is gebaseerd op zgn. Public key cryptografie, vandaar de term Public Key Infrastructuur.
2.1.
Tweezijdig TLS
Bij de beveiliging van WMS/WFS-services tussen overheden wordt vaak vereist dat zowel de service-aanbieder als de service-afnemer zich wederzijds naar elkaar toe identificeren en authenticeren met een PKI-certificaat. De afnemer van een beveiligde service gebruikt een PKI client-certificaat, en de aanbieder gebruikt een PKI server certificaat. Zie onderstaand diagram:
2 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
GISapplicatie
1. http request
TLS client proxy
Versie 0.1
Onvertrouwd netwerk (internet)
2. http 3. http over TLS request (https) TLS WMS/WFS server service 5. http over TLS (https)
6. http response
4. http response
servercertificaat
clientcertificaat
De GIS-applicatie doet bijvoorbeeld een aanroep van een WMS-service voor het tonen van een kaart-figuur (map image), via de TLS client (pijl 1 in het diagram). De TLS client proxy stuurt de WMS-aanroep via TLS naar de TLS-server (pijl 2). De TLS-server stuurt de aanroep door naar de WMS-service (pijl 3). De WMS-service stuurt het antwoord (de map image) terug naar de TLS-server (pijl 4), die het weer doorstuurt naar de TLS client proxy (pijl 5), die het weer doorstuurt naar de GIS-applicatie (pijl 6).
2.2.
Probleem: URLs in de berichten zijn ‘ongeldig’
Nu is het zo dat er in de WMS- en WFS-berichten die worden uitgewisseld, server-URLs voorkomen die door het gebruik van TLS niet direct bruikbaar zijn. De communicatie tussen een GIS-applicatie en een WMS/WFS-service begint meestal met een zgn. GetCapabilities request die de GIS-applicatie naar de proxy stuurt. Zo’n GetCapabilities request ziet er bijvoorbeeld als volgt uit: http://pdok-proxy.intern/wms?service=WMS&request=GetCapabilities&version=1.3.0 De GIS-applicatie stuurt in feite het volgende HTTP request naar de TLS-client proxy met machinenaam pdok-proxy.intern: GET http://pdok-proxy.intern/wms?service=WMS&request=GetCapabilities& version=1.3.0 HTTP/1.1
Dit wordt door de TLS client en server doorgegeven naar de WMS-server. Deze antwoordt met een uitgebreid XML-bericht dat beschrijft wat deze WMS-service allemaal te bieden heeft, bijvoorbeeld: <WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms" [...] > <Service>
WMS <Title>WMS Wegenkaart Nederland [...]
[...] [...]
3 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
[...] [...] <Style> [...] image/png
(Dit voorbeeld is ingekort door een aantal regels te vervangen door ‘[…]’.) Wat we zien in dit voorbeeld, is dat in het antwoord-bericht weer verwijzingen zitten naar de WMS-server zelf; in dit voorbeeld is dat “https://eenwmsserver.com/wms”, de dikgedrukte delen hierboven. Volgens de WMS/WFS-standaarden moet de GIS-applicatie nu deze verwijzingen gebruiken voor het gebruik van de WMS/WFS service. Maar… als de GIS-applicatie die verwijzingen gebruikt, dan gaat het mis! De GIS-applicatie kan namelijk geen berichten direct naar ‘https://eenwmsserver.com’ sturen, want die server is juist beveiligd met TLS. Alleen de TLS client proxy kan de WMS-server benaderen, doordat hij via TLS kan communiceren met de WMS-service. Als de GIS-applicatie een aanroep direct naar ‘https://eenwmsserver.com’ probeert te sturen, hangt het van de daadwerkelijke netwerk-configuratie af wat er gebeurt: Als de GIS-applicatie de TLS-server ‘https://eenwmsserver.com’ kan bereiken via het netwerk (al dan niet via een HTTP proxy-server), zal hij geen TLS-communicatie met de TLS-server kunnen opzetten en er zal bijvoorbeeld een fout optreden in de GISapplicatie. Als de GIS-applicatie de server niet kan bereiken, zal ook een fout optreden in de GISapplicatie. In beide gevallen zitten we met een GIS-applicatie die de WMS/WFS-service niet kan gebruiken. Sommige GIS-applicaties kunnen ‘eigenwijs’ zijn, en de diverse WMS/WFS-aanroepen sturen naar ‘http://pdok-proxy.intern’, in plaats van naar ‘https://eenwmsserver.com’. Dan werkt de GIS-applicatie wel correct, ondanks de TLS-tussenstap. Een voorbeeld hiervan is het open source GIS-pakket QGIS. Maar niet alle GIS-applicaties kunnen dit. Een voorbeeld van een GIS-applicatie die dit niet kan, is Esri’s ArcMap1.
3. Een oplossing Een structurele oplossing voor het probleem met de niet-bereikbare verwijzingen is als volgt. We kunnen een extra component toevoegen tussen de GIS-applicatie en de TLS-client die de verwijzingen naar de WMS/WFS-service vertaalt naar verwijzingen die wel werken. Deze component moet dus de GetCapabilities-aanroepen afvangen en in het antwoord-bericht alle 1
ArcMap kan dit in ieder geval tot en met versie 10.2.2 niet.
4 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
verwijzingen ‘https://eenwmsserver.com’ vervangen door ‘http://pdok-proxy.intern’. Dit geeft dan de volgende configuratie.
2. http 1. http request WMS/ request TLS GISapplicatie WFS Client vertaler proxy 7. http 8. http response response met vertaalde URLs clientcertificaat
Onvertrouwd netwerk (internet)
3. http over TLS (https)
TLS server
6. http over TLS (https)
4. http request 5. http response
WMS/ WFS service
servercertificaat
In dit diagram hebben we dus een ‘WMS/WFS vertaler’ toegevoegd.
3.1.
WMS/WFS vertalers
Er zijn diverse producten die URL-vertaling kunnen doen in WMS/WFS requests, onder andere De open source GIS-server GeoServer kan WMS- en WFS-services ‘herpubliceren’ inclusief URL-vertaling. Diverse proxy-servers kunnen URL-vertaling in http responses doen. Apache web server kan dit ook doen.
3.2.
TLS clients
Er zijn ook diverse producten die als een TLS client kunnen fungeren, onder andere: Diverse proxy-servers kunnen dit doen. Web service management software kan dit doen. GeoServer kan https-verbindingen opzetten waarbij ook een client-side certificaat wordt gebruikt. Op het moment van schrijven heb ik dit wel uitgeprobeerd, maar ik heb het (nog) niet werkend gekregen. Apache web server kan fungeren als TLS client.
3.3. Een TLS client en WMS/WFS vertaler ineen: Apache web server Het is mogelijk om beide boven beschreven functies, van TLS client en WMS/WFS vertaler, te combineren in de bekende Apache web server. Hieronder wordt de configuratie hiervan beschreven. De installatie en configuratie bestaat uit de volgende stappen.
3.3.1. Machine beschikbaar hebben voor Apache Zorg dat je een machine beschikbaar hebt waarop Apache web server kan draaien.
5 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
Dat kan een Windows-server zijn of een Unix-server (ook Linux, Mac OS). Zorg dat je ook beheerrechten hebt op de machine om software te installeren. Op deze machine komt ook een bestand met de zgn. private key te staan die in combinatie met het PKI client-certificaat wordt gebruikt voor de communicatie. Dit private key bestand is de sleutel waarmee de TLS-client zich authenticeert naar de TLS-server, en daarom moet dit bestand goed beveiligd zijn tegen ongeoorloofd gebruik dan wel kopiëren. Dat wil zeggen dat de toegang tot dit bestand zo beperkt mogelijk moet zijn, dus alleen voor de systeembeheerder(s) die dit bestand zullen aanmaken.
3.3.2. Configuratie-parameters verzamelen -
-
Bepaal de URL van de beveiligde service. Voor beveiligde PDOK-services wordt bijvoorbeeld gebruikt https://secure.geodata2.nationaalgeoregister.nl. Dit noemen we verderop de beveiligde URL. Bepaal de URL van de machine waarop de Apache proxy komt te draaien en waarop deze benaderbaar is voor de GIS-applicaties. Bijvoorbeeld: http://pdok-proxy.intern. Dit noemen we verderop de proxy-URL.
3.3.3. Apache installeren Installeer Apache op de machine. Er zijn diverse manuals hiervoor te vinden op internet. Voor Windows is het handig om een binary versie te downloaden, bijvoorbeeld van http://www.apachelounge.com/. Voor Linux/Unix raadt de Apache site aan om zelf te compileren: http://httpd.apache.org/docs/2.4/install.html Maar het is ook mogelijk om te installeren met de Linux/Unix-specifieke tools zoals apt-get of rpm. Als je Apache eenmaal werkend hebt, kun je als het goed is de Apache server benaderen met een browser, op een URL zoals http://pdok-proxy.intern.
3.3.4. Certificaat-request genereren Als je Apache eenmaal werkend hebt, start dan een command prompt (hetzij Windows, hetzij Linux/Unix) en voer de volgende commando’s uit. (op Unix/Linux: vervang de \ door /) cd cd conf ..\bin\openssl req -config openssl.cnf -out CSR.csr –new -newkey rsa:2048 -nodes -keyout privatekey.key
Nu wordt het volgende getoond in de command line, en er wordt om input gevraagd. Vul dat als volgt in, zoals hieronder dikgedrukt, maar dan in plaats van ‘een overheid’, je eigen organisatiegegevens: WARNING: can't open config file: openssl.cfg Loading 'screen' into random state - done Generating a 2048 bit RSA private key .............................+++ ..........+++ writing new private key to 'privateKey.key' ----You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----Country Name (2 letter code) [AU]:NL State or Province Name (full name) [Some-State]: Locality Name (eg, city) []:
6 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Een Overheid Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:client.eenoverheid.nl Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
Voer vervolgens nog het volgende commando uit om de zojuist gegenereerde private key van PKCS#8 naar RSA formaat te converteren: ..\bin\openssl rsa -in privatekey.key -out clientcert.pem
Beide zijn leesbare tekst-bestanden Het enige verschil is dat ‘privatekey.key’ een header bevat van de vorm: -----BEGIN PRIVATE KEY-----
En het bestand ‘clientcert.pem’ bevat een header van de vorm: -----BEGIN RSA PRIVATE KEY-----
Het bestand ‘clientcert.pem’ bevat nu nog alleen maar de private key. Hieraan zal later het verkregen certificaat worden toegevoegd.
3.3.5. Certificaat verkrijgen In de vorige stap is een bestand \conf\CSR.csr gegenereerd (CSR = ‘Certificate Signing Request’). Met dit bestand kun je een PKI-overheidcertificaat aanvragen bij een PKI overheid certificaat-provider. Zie http://www.pkioverheid.nl. Je moet daar een administratieve procedure doorlopen.
3.3.6. Client-certificaat installeren Uiteindelijk krijg je een certificaat-bestand dat moet worden geïnstalleerd in Apache. Zorg dat je dat bestand in zgn. PEM-formaat krijgt. Het is dan leesbaar in een text editor, en ziet er als volgt uit: -----BEGIN CERTIFICATE----MIIFhTCCA22gAwIBAgIDD3STMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv … -----END CERTIFICATE-----
Op internet zijn handleidingen te vinden om certificaten eventueel te converteren naar PEMformaat, bijvoorbeeld https://www.sslshopper.com/ssl-converter.html. Kopieer het certificaat-bestand in PEM-formaat naar de Apache-machine, naar \conf\cert1.pem. Start op de Apache-machine weer een command prompt (hetzij Windows, hetzij Linux/Unix) en voer de volgende commando’s uit. (op Unix/Linux: vervang de \ door /) cd cd conf cat cert1.pem >> clientcert.pem
Wat je hiermee doet, is de tekst van het PEM-bestand toevoegen achteraan privateKey.key. Dit kun je trouwens ook met een tekst editor doen, als je wilt.
3.3.7. CA-certificaten installeren Je krijgt vaak ook de zgn. CA-certificaten meegeleverd, of die moet je van een website downloaden. Deze certificaten moeten ook in PEM-formaat in een tekstbestand achter elkaar
7 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
worden opgenomen. Het gaat om het zgn. root-certificaat en de intermediate CA-certificaten. Zo’n bestand ziet er dan als volgt uit: -----BEGIN CERTIFICATE----MIID8zCCAtugAwIBAgIJAPNlHueexYqoMA0GCSqGSIb3DQEBBQUAMIGPMQswCQYD … -----END CERTIFICATE---------BEGIN CERTIFICATE----MIID8zCCAtugAwIBAgIJAPNlHueexYqoMA0GCSqGSIb3DQEBBQUAMIGPMQswCQYD … -----END CERTIFICATE-----
Mogelijk is er nog een derde certificaat van een intermediate CA; voor PKI overheid is dit het geval. Maak zo’n tekst-bestand met de CA-certificaten aan en plaats het in \conf\cacerts.pem.
3.3.8. Apache configureren Open op de Apache-machine het bestand \conf\httpd.conf met een tekst-editor. Doe daarin de volgende aanpassingen: - Er staat een lange lijst met ‘LoadModule’ directives. Verwijder het #-teken voor de volgende regels: LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule LoadModule
filter_module modules/mod_filter.so headers_module modules/mod_headers.so proxy_module modules/mod_proxy.so proxy_connect_module modules/mod_proxy_connect.so proxy_http_module modules/mod_proxy_http.so socache_shmcb_module modules/mod_socache_shmcb.so ssl_module modules/mod_ssl.so substitute_module modules/mod_substitute.so
-
Zoek op ServerName en zorg dat daar de naam van de server staat, bijvoorbeeld: ServerName pdok-proxy.intern
-
Voeg het volgende toen helemaal onderaan het bestand: # Inter-Process Session Cache: shared memory file in RAM. # This is not a path on the file system, so the path does not have to # exist on the server's file system! SSLSessionCache "shmcb:/var/apache2.4/ssl_scache(512000)" SSLSessionCacheTimeout 300 SSLProxyEngine on SSLProxyMachineCertificateFile "conf/clientcert.pem" SSLProxyMachineCertificateChainFile "conf/cacerts.pem" ProxyPass / https://beveiligde-URL/ ProxyPassReverse https://beveiligde-URL/ # Verwijder Accept-encoding header, anders is de content al gzip-encoded en # werkt de substitutie niet! RequestHeader unset Accept-Encoding FilterDeclare subst FilterProvider subst SUBSTITUTE "%{QUERY_STRING} =~ m#request=getcapabilities#i" FilterChain subst Substitute "s|https://beveiligde-URL/|http://pdok-proxy.intern/|in"
Hierbij moet https://beveiligde-URL/ dworden vervangen door de beveiligde URL uit stap 2, bijvoorbeeld https://secure.geodata2.nationaalgeoregister.nl. En http://pdok-proxy.intern/ moet vervangen worden door de proxy-URL. Herstart nu Apache om de configuratie opnieuw in te lezen.
8 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
3.3.9. Testen Nu zijn we eindelijk klaar voor testen. Zorg dat je weet welke service(s) je precies kunt aanroepen op de beveiligde URL, inclusief wat er na de domeinnaam komt, bijvoorbeeld https://secure.geodata2.nationaalgeoregister.nl/lv-beeldmateriaal/2014/wms Start een browser en voer dit adres in, maar gebruik daarbij de proxy-machine, bijvoorbeeld: http://pdok-proxy.intern/lv-beeldmateriaal/2014/wms. Dit is geen geldig WMS/WFS request, en daarom zul je in de regel een lege pagina te zien krijgen. Het volgende request op een WMS-service zou moeten resulteren in een XML-bestand: http:// pdok-proxy.intern/ lvbeeldmateriaal/2014/wms?SERVICE=WMS&request=getcapabilities&version=1.3.0. Het resultaat zou bijvoorbeeld moeten zijn: <WMS_Capabilities version="1.3.0" xmlns:erdas="http://www.erdas.com/versions/4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wms http://pdok-proxy.intern/lvbeeldmateriaal/2013/wms/REQUEST/getdir/DIR/BASE/DATA/LPR/wms/1.3.0/capabilities.x sd http://www.ionicsoft.com/wms http://pdok-proxy.intern/lvbeeldmateriaal/2013/wms/REQUEST/getdir/DIR/BASE/DATA/LPR/wms/1.3.0/extensions.xsd " xmlns="http://www.opengis.net/wms" xmlns:xlink="http://www.w3.org/1999/xlink"> <Service> OGC:WMS <Title>Landelijke Voorziening Beeldmateriaal Een jaarlijks te vernieuwen dataset van luchtopnamen van Nederland van zowel hoge als lage resolutie. De lage resolutie ook in infra rood. Landelijke voorziening beeldmateriaal Orthofoto Hoge resolutie Lage resolutie Infrarood Orthofotomozaïek ...
Hierin zien we dat de beveiligde URLs inderdaad vertaald zijn naar onze interne proxy-URLs. Als dit niet werkt, is er een probleem…
3.3.10.
Troubleshooting
Er kan worden gekeken in directory /log/. Daar staan logbestanden die foutmeldingen kunnen bevatten die aangeven wat het probleem is. Je kunt ook het logging-niveau van Apache verhogen door in \conf\httpd.conf naar de regel met ‘LogLevel’ te zoeken en die ter vervangen door LogLevel debug
Om dit te activeren moet Apache uiteraard weer herstart worden.
3.3.11.
Proxy-URL ter beschikking stellen aan gebruikers
Als de configuratie eenmaal werkt, kunnen de URLs ter beschikking worden gesteld aan de gebruikers.
9 / 10
OGC WMS en WFS beveiligd met PKI-certificaten
Versie 0.1
4. Onderhoud 4.1.
Apache server
Apache-servers behoeven in het algemeen weinig onderhoud. Mocht het geheugengebruik van Apache na verloop van tijd toenemen, dan kan een automatische nachtelijkse of wekelijkse herstart worden ingeregeld.
4.2.
Certificaat vernieuwen
Het client-certificaat heeft een bepaalde geldigheidsperiode, bij de meeste certificaatproviders is dat 1 jaar. Voor die tijd moet er een nieuw certificaat worden aangevraagd. Zorg dat je dat agendeert als ene beheertaak voordat het certificaat verloopt. Bij de verlengingsaanvraag moet afhankelijk van de provider wel of niet een nieuw certificate signing request worden meegeleverd, zoals hierboven in par. 3.3.4 beschreven. Let daarbij op dat je de bestaande private key niet overschrijft.
4.3.
Meerdere beveiligde servers
Door aanpassing van de configuratie van de Apache proxy kunnen ook meerdere beveiligde URLs worden geproxied, op verschillende URI’s, bijvoorbeeld http://pdok-proxy.intern/pdok http://pdok-proxy.intern/cbs http://pdok-proxy.intern/eenandereservice etc.
10 / 10