<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>instant-thinking.de &#187; mod_ssl</title>
	<atom:link href="http://instant-thinking.de/tag/mod_ssl/feed/" rel="self" type="application/rss+xml" />
	<link>http://instant-thinking.de</link>
	<description>Just enough to get you started and leave you confused</description>
	<lastBuildDate>Thu, 26 Jan 2012 15:02:31 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>HTTPS f&#252;r einen Mac OS X Webserver</title>
		<link>http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/</link>
		<comments>http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 18:25:23 +0000</pubDate>
		<dc:creator>der Dennis</dc:creator>
				<category><![CDATA[]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[mod_ssl]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[terminal]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://instant-thinking.de/?p=1917</guid>
		<description><![CDATA[Wenn man einen Webserver unter Mac OS X betreibt, und ausserdem m&#246;chte, dass die gesamte Kommunikation mit diesem verschl&#252;sselt abl&#228;uft, wird man sich fr&#252;her oder sp&#228;ter mit dem mod_ssl-Modul des Apache Webservers befassen. Dieses fantastische St&#252;ck Software sorgt beispielsweise daf&#252;r, dass nicht jeder der im gleichen WLAN sitzt oder sonst irgendwie den Datenverkehr mitschneiden kann, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://instant-thinking.de/wp-content/uploads/2009/08/Wireshark_Roundcube_Passwort.jpg" rel="lightbox" class="liimagelink"><img src="http://instant-thinking.de/wp-content/uploads/2009/08/Wireshark_Roundcube_Passwort.jpg" alt="Wireshark_Roundcube_Passwort" title="Wireshark_Roundcube_Passwort" width="400" class="center" /></a></p>

<p>Wenn man einen Webserver unter Mac OS X betreibt, und ausserdem m&#246;chte, dass die gesamte Kommunikation mit diesem verschl&#252;sselt abl&#228;uft, wird man sich fr&#252;her oder sp&#228;ter mit dem <code><a href="http://www.modssl.org/" class="liexternal">mod_ssl</a></code>-Modul des Apache Webservers befassen. Dieses fantastische St&#252;ck Software sorgt beispielsweise daf&#252;r, dass nicht jeder der im gleichen WLAN sitzt oder sonst irgendwie den Datenverkehr mitschneiden kann, auch die Usernamen, Passw&#246;rter oder sonstige interessante Daten frei Haus erh&#228;lt. In dem oben stehenden Bild ist mein Login &#252;ber HTTP sch&#246;n zu sehen<sup><a href="http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#footnote_0_1917" id="identifier_0_1917" class="footnote-link footnote-identifier-link" title="Und nein, mein Passwort ist &uuml;blicherweise nicht &ldquo;test123&Prime;">1</a></sup>.</p>

<p>Wie man das ganze unter OS X recht flugs, allerdings auch nicht so richtig geeignet f&#252;r ein echtes Produktivsystem, hin bekommt wird hier in f&#252;nf Schritten beschrieben.</p>

<ol>
    <li>Erstellung einer eigenen Certification Authority (CA)</li>
    <li>Erstellung eines Private Key f&#252;r den Web Server</li>
    <li>Erstellung eines Certificate Request f&#252;r den gerade erstellten Private Key des Webservers</li>
    <li>Unterschreiben des Certificate Request mit dem Key der CA</li>
    <li>Anpassen der Apache-Configs</li>

</ol>

<p>Weiter geht es nach dem Klick&#8230;</p>

<p><strong>Erstellung einer eigenen Certification Authority</strong></p>

<p>Man erstellt auf der Konsole in seinem &#8220;Dokumente&#8221; Verzeichnis einen neuen Ordner und wechselt hinein. So sind die Zertifikate h&#252;bsch ordentlich aufgehoben.</p>

<p><code class="prettyprint">
cd ~/Documents
mkdir certs
cd certs
</code></p>

<p>In diesem Verzeichnis wird dann mit dem CA.pl Script eine neue Certification Authority erstellt.</p>

<p><code class="prettyprint">
/System/Library/OpenSSL/misc/CA.pl -newca</p>

<p>CA certificate filename (or enter to create)</p>

<p>Making CA certificate ...
Generating a 1024 bit RSA private key
.........++++++
.................++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:</p>

<h2>Verifying - Enter PEM pass phrase:</h2>

<p>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.
</code></p>

<p>Die folgenden Fragen sollte man so beantworten, dass die Herkunft der CA f&#252;r Besucher des verschl&#252;sselten Servers erkennbar ist. Bei mir etwa so:</p>

<p><code class="prettyprint">
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Essen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:Dennis TestCA
Email Address []:dennis@instant-thinking.de
</code></p>

<p>Jetzt existiert in dem <code>certs</code> Verzeichnis eine neue CA in einem eigenen Ordner:</p>

<p><code class="prettyprint">
certs/
<code>-- demoCA
    |-- cacert.pem
    |-- certs
    |-- crl
    |-- index.txt
    |-- newcerts
    |-- private
    |</code>-- cakey.pem
    `-- serial
</code></p>

<p><strong>Erstellung eines Private Key f&#252;r den Web Server</strong></p>

<p>Mit dem folgenden openssl Befehl wird nun ein private key f&#252;r den Webserver erstellt.</p>

<p><code class="prettyprint">
openssl genrsa -des3 -out webserver.key 1024
</code></p>

<p>Bei der darauf folgenden Passwortabfrage, sollte man eines w&#228;hlen, das von dem Passwort der CA abweicht.</p>

<p><code class="prettyprint">
Generating RSA private key, 1024 bit long modulus
...................++++++
................++++++
e is 65537 (0x10001)
Enter pass phrase for webserver.key:
Verifying - Enter pass phrase for webserver.key:
</code></p>

<p>Aus praktischen Gr&#252;nden wird jetzt noch ein Schl&#252;ssel ohne die Passphrase erstellt:</p>

<p><code class="prettyprint">
openssl rsa -in webserver.key -out webserver.nopass.key
Enter pass phrase for webserver.key:
writing RSA key
</code></p>

<p>Der Schl&#252;ssel mit Passphrase ist jetzt <code>webserver.key</code> und der ohne ist <code>webserver.nopass.key</code>.</p>

<p>Diese &#220;bung ist n&#246;tig, weil ein Webserver der mit einem Zertifikat mit Passphrase verschl&#252;sselt, diese Passphrase bei jedem Neustart des Servers erwartet. Das w&#252;rde f&#252;r einen normalen Mac bedeuten, dass der Start des Systems h&#228;ngt, da der Apache auf die Eingabe der Passphrase wartet. Man kann den Mac zwar im Verbose-Mode booten und die Eingabe vornehmen, komfortabel ist das aber nicht.</p>

<p><strong>Erstellung eines Certificate Request f&#252;r den gerade erstellten Private Key des Webservers</strong></p>

<p>F&#252;r den gerade erstellten Schl&#252;ssel wird nun eine Zertifikatsanforderung<sup><a href="http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#footnote_1_1917" id="identifier_1_1917" class="footnote-link footnote-identifier-link" title="g&uuml;ltig f&uuml;r 10 Jahre">2</a></sup> erstellt. Diese wird dann im n&#228;chsten Schritt mit dem Schl&#252;ssel der CA unterschrieben.</p>

<p><code class="prettyprint">
openssl req -config /System/Library/OpenSSL/openssl.cnf -new -key webserver.key -out newreq.pem -days 3650
</code></p>

<p>Bei der folgenden Abfrage ist es wichtig darauf zu achten, dass bei &#8220;Common Name (eg, YOUR name)&#8221; der wirkliche Name des Servers eingetragen wird, unter dem er auch sp&#228;ter erreichbar sein soll. Bei einem Test auf dem lokalen System w&#228;re das z.B. &#8220;localhost&#8221; oder &#8220;127.0.0.1&#8243;. Bei einem Test in einem lokalen Netz ohne Namensaufl&#246;sung z.B. &#8220;192.168.1.6&#8243; und bei einem System das unter einem DNS-Namen erreichbar ist eben dieser. Wenn hier nicht der exakt passende Name des Servers steht wird es sp&#228;ter zu Zertifikatsfehlern kommen, <a href="http://www.urbandictionary.com/define.php?term=YMMV" class="liexternal">YMMV</a>.</p>

<p>Die Extra Attribute &#8220;challenge password&#8221; und &#8220;company name&#8221; k&#246;nnen leer gelassen werden.</p>

<p><code class="prettyprint">
Enter pass phrase for webserver.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,</p>

<h2>If you enter '.', the field will be left blank.</h2>

<p>Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Essen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:.
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:meineadresse.de
Email Address []:dennis@instant-thinking.de</p>

<p>Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
</code></p>

<p>Damit wurde die Zertifikatsanforderung <code>newreq.pem</code> erstellt.</p>

<p><strong>Unterschreiben des Certificate Request mit dem Key der CA</strong></p>

<p>Mit dem folgenden Befehl wird das Unterschreiben der Zertifikatsanforderung angestossen:</p>

<p><code class="prettyprint">
/System/Library/OpenSSL/misc/CA.pl -signreq
</code></p>

<p><code class="prettyprint">
Using configuration from /opt/local/etc/openssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            b4:cd:0a:12:5b:00:5b:2b
        Validity
            Not Before: Aug 25 21:19:04 2009 GMT
            Not After : Aug 25 21:19:04 2010 GMT
        Subject:
            countryName               = DE
            stateOrProvinceName       = NRW
            localityName              = Essen
            commonName                = meineadresse.de
            emailAddress              = dennis@instant-thinking.de
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                08:F3:5C:D2:0D:96:3E:2F:53:DA:EF:9D:34:73:B2:16:77:83:94:E0
            X509v3 Authority Key Identifier: 
                keyid:01:54:22:97:39:C2:41:2D:17:48:41:6D:BB:A1:C7:F0:B3:88:B4:4F</p>

<p>Certificate is to be certified until Aug 25 21:19:04 2010 GMT (365 days)
Sign the certificate? [y/n]:y</p>

<p>1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
</code></p>

<p>Damit ist das Zertifikat <code>newcert.pem</code> erstellt. Jetzt ist es eine gute Idee ein weiteres Verzeichnis mit dem Namen des Servers zu erstellen und alle f&#252;r ihn erstellten Dateien hinein zu bewegen.</p>

<p><code class="prettyprint">
mkdir meineadresse.de
mv webserver.key webserver.nopass.key newreq.pem newcert.pem meineadresse.de/
</code></p>

<p>Das ganze schaut dann etwa so aus:</p>

<p><code class="prettyprint">
certs/
|-- demoCA
|   |-- cacert.pem
|   |-- certs
|   |-- crl
|   |-- index.txt
|   |-- index.txt.attr
|   |-- index.txt.old
|   |-- newcerts
|   |   <code>-- B4CD0A125B005B2B.pem
|   |-- private
|   |</code>-- cakey.pem
|   |-- serial
|   <code>-- serial.old</code>-- meineadresse.de
    |-- newcert.pem
    |-- newreq.pem
    |-- webserver.key
    `-- webserver.nopass.key
</code></p>

<p><strong>Anpassen der Apache-Configs</strong></p>

<p>Als letztes wird der Apache-Server f&#252;r verschl&#252;sselte Verbindungen konfiguriert. Dazu wird zun&#228;chst in der Datei <code>/etc/apache2/httpd.conf</code> die Datei <code>httpd-ssl.conf</code> inkludiert in der dann die restlichen Eintr&#228;ge vorgenommen werden. Die passende Zeile ist bereits vorhanden<sup><a href="http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#footnote_2_1917" id="identifier_2_1917" class="footnote-link footnote-identifier-link" title="in meiner Installation war es die Zeile 473">3</a></sup> und muss nur auskommentiert<sup><a href="http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#footnote_3_1917" id="identifier_3_1917" class="footnote-link footnote-identifier-link" title="Also die Raute &ldquo;#&rdquo; vor der Zeile l&ouml;schen">4</a></sup> werden.</p>

<p>Das Ergebnis sollte so aussehen:</p>

<p><code class="prettyprint"></p>

<h1>Secure (SSL/TLS) connections</h1>

<p>Include /private/etc/apache2/extra/httpd-ssl.conf
</code></p>

<p>In der Datei <code>/etc/apache2/extra/httpd-ssl.conf</code> m&#252;ssen nun die folgenden Variablen auf die vorhin erstellten Dateien inklusive dem vollen Pfad zeigen:</p>

<p><code class="prettyprint">
SSLCertificateFile "/Users/dennis/Documents/certs/meineadresse.de/newcert.pem"
SSLCertificateKeyFile "/Users/dennis/Documents/certs/meineadresse.de/meineadresse.de.nopass.key"
SSLCACertificateFile "/Users/dennis/Documents/certs/demoCA/cacert.pem"
SSLCARevocationPath "/Users/dennis/Documents/certs/demoCA/crl"
</code></p>

<p>Man kann hier auch das <code>DocumentRoot</code> auf einen anderen Pfad als die nicht verschl&#252;sselten Inhalte setzen wenn man das m&#246;chte. Das kann dann z.B. so ausschauen:</p>

<p><code class="prettyprint">
DocumentRoot "/Users/dennis/Sites/SSL"
</code></p>

<p>Jetzt kann man den Apache mit <code>sudo apachectl graceful</code> neu starten und sollte dann unter https://localhost<sup><a href="http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#footnote_4_1917" id="identifier_4_1917" class="footnote-link footnote-identifier-link" title="bzw. der jeweiligen Adresse">5</a></sup> eine verschl&#252;sselte HTTP-Verbindung herstellen k&#246;nnen.</p>

<p>Usernamen und Passw&#246;rter die oben noch im Klartext zu lesen waren sehen f&#252;r potentielle Mitlauscher nun nur noch so aus:</p>

<p><a href="http://instant-thinking.de/wp-content/uploads/2009/08/wireshark_roundcube_ssl.jpg" rel="lightbox" class="liimagelink"><img src="http://instant-thinking.de/wp-content/uploads/2009/08/wireshark_roundcube_ssl.jpg" alt="wireshark_roundcube_ssl" title="wireshark_roundcube_ssl" width="400" class="center" /></a></p>

<p>Und das ist eine gute Sache.</p>

<p>Wenn man ein solches System produktiv einsetzen m&#246;chte, sollte man zu allermindestens die CA auf einen anderen Computer auslagern. Noch besser<sup><a href="http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/#footnote_5_1917" id="identifier_5_1917" class="footnote-link footnote-identifier-link" title="aber auch mit Kosten verbunden">6</a></sup> w&#228;re es, sich sein Zertifikat von einer richtigen CA unterschreiben zu lassen. Dann m&#252;sste man auch nicht mehr mit der unvermeidlichen Fehlermeldung leben, dass das Zertifikat von einer unbekannten CA ausgestellt wurde&#8230;</p>

<p><a href="http://instant-thinking.de/wp-content/uploads/2009/08/ssl-cert-error.jpg" rel="lightbox" class="liimagelink"><img src="http://instant-thinking.de/wp-content/uploads/2009/08/ssl-cert-error.jpg" alt="ssl-cert-error" title="ssl-cert-error" width="400" class="center" /></a></p>

<p>Nat&#252;rlich kann man f&#252;r seinen Browser eine passende Ausnahme konfigurieren, f&#252;r einen Produktivserver ist so etwas aber nicht hinnehmbar.</p>

<p>(via: <a href="http://developer.apple.com/internet/serverside/modssl.html" class="liexternal">Apple</a> &amp; <a href="http://www.macosxhints.com/article.php?story=20080628074917113" class="liexternal">macosxhints.com</a>)</p>
<ol class="footnotes"><li id="footnote_0_1917" class="footnote">Und nein, mein Passwort ist &#252;blicherweise nicht &#8220;test123&#8243;</li><li id="footnote_1_1917" class="footnote">g&#252;ltig f&#252;r 10 Jahre</li><li id="footnote_2_1917" class="footnote">in meiner Installation war es die Zeile 473</li><li id="footnote_3_1917" class="footnote">Also die Raute &#8220;#&#8221; vor der Zeile l&#246;schen</li><li id="footnote_4_1917" class="footnote">bzw. der jeweiligen Adresse</li><li id="footnote_5_1917" class="footnote">aber auch mit Kosten verbunden</li></ol>]]></content:encoded>
			<wfw:commentRss>http://instant-thinking.de/2009/08/26/https-fuer-einen-mac-os-x-webserver/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

