Version 1.6.6 (changelog: view source)
A newer and hopefully more often updated version of this HOWTO which also covers Apache 2 is available from httpraibledesigns.com/tomcat/ssl-howto.html. Also check out this tutorial covering Apache 2 on Windows Server 2003 if you use that

Spanish translation maintained by Sergio Artigas
French translation maintained by Jean-Francois Moreau
Danish translation maintained by Morten Fischer-Nielsen
German site
This page describes the installation of the Win32 version of Apache with
the mod_ssl extension. The newest version should always be available from httptud.at/programm/apache-ssl-win32-howto.php3

This process worked for many people on Windows NT, 98, ME, 2000 and XP; please mail me your suggestions and bug reports

You can even install Apache with SSL in addition to the Microsoft Internet Information Server if you need to

Note: sometimes, there are changes between the precompiled apache
distributions so that this HOWTO is not correct anymore. In this case,
if the current version does not work for you, download an older version -
one that was published before the modification date of this HOWTO

Or, if you like adventures, try to make it run, and mail me if you needed to change anything

Please note that Apache 1.3.x on Win32 is considered beta quality as it doesn't reach the stability and performance of Apache on Un*x platforms. The 2.x versions are perhaps better but this HOWTO doesn't cover 2.x yet

Get the Win32 version of the Apache web server from one of the mirrors. It is called something like
apache_x_y_z_win32.exe. This is a self-extracting archive that
contains the Apache base system and sample configuration files

Don't mix Apache versions 1.3 and 2! It won't work. If you find 1.3.x on modssl.org, you cannot expect it to work with 2.0.x

Install Apache as described in httpwww.apache.org/docs/windows.html

Note: You can skip this step and get a full Apache+SSL distribution from modssl.org, as described below. There will be no fancy installation program but you won't need to overwrite the stock Apache files. This is the better way if you are experienced and don't fear editing configuration files (which you will need to do anyway)

Change at least the following parameters in
Apache-dir/conf/httpd.conf:
Replace all occurences of www.my-server.dom with the real
domain name
Port 80to
(Comment it out;
#Port 80
Portis not necessary,
Listenoverrides it later.)
Listen 80
Listen 443(So your server listens on the standard SSL port)
ServerName

DocumentRootand the corresponding
to your
Inetpub\wwwroot
Install the Apache service (NT/2000 only) and start the server. Verify that everything works before proceeding to the SSL installation because this limits the possible errors

Try
 It won't be encrypted yet but if
this works then the port configuration (port 443) is right. httpwww.my-server.dom:443
Go to httpwww.modssl.org/contrib/
or httphunter.campbus.com/
and find a file called like
Apache_X-mod_ssl_Y-openssl_Z-WIN32[-i386].zip

Download and unzip it to a new directory

If you need the newest version, you will have to compile it yourself if it is not there. Don't ask me about it; I don't have it, I don't compile the versions on modssl.org, and I don't have access to development tools on Win32

Copy the files
ssleay32.dll and
libeay32.dll
from the Apache/modssl distribution directory to
WINNT\System32

This is important! About 70 % of the e-mails I receive is because people
forget to do this. If you don't find those files or openssl.exe in the
apache zip, get a file called like
openssl- from one of the download sites

*version*-win32.zip
You'll need a config file for
OpenSSL.exe

Here is one (right-click on it and "Save
as (There is an openssl.cnf in the distribution with different
wording of some questions, but it should do it, too.)
Copy it to the directory
openssl.exe is in

(This is a normal text file. It is really called so; however, some Windows versions insist on hiding the extension from you. You can edit it with Windows notepad or a good editor, but it shouldn't be necessary.)
The following instructions are from httpwww.apache-ssl.org/#FAQ

openssl req -config openssl.cnf -new -out my-server.csr
This creates a certificate signing request and a private key. When asked for
"Common Name (eg, your websites domain name give
the exact domain name of your web server (e.g

**www.my-server.dom The
certificate belongs to this server name and browsers complain if the name
doesn't match

openssl rsa -in privkey.pem -out my-server.key
This removes the passphrase from the private key. You MUST understand what this means;
my-server.key should be only readable by the apache
server and the administrator

You should delete the
.rnd file because it contains the entropy
information for creating the key and could be used for cryptographic
attacks against your private key

openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 365

This creates a self-signed certificate that you can use until you get a "real" one from a certificate authority. (Which is optional; if you know your users, you can tell them to install the certificate into their browsers.) Note that this certificate expires after one year, you can increase
-days 365 if you don't want this

If you have users with MS Internet Explorer 4.x and want them to be able
to install the certificate into their certificate storage (by downloading and
opening it), you need to create a DER-encoded version of the certificate:
openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
Create an
Apache/conf/ssl directory and move
my-server.key and
my-server.cert into it

Copy the executable files exe, *.dll, *.so) from the downloaded apache-mod_ssl distribution over your original Apache installation directory (remember to stop Apache first and DO NOT overwrite your edited config files etc

Find the LoadModule directives in your
httpd.conf file and
add this after the existing ones, according to the file you have found in the
distribution:
LoadModule ssl_module modules/ApacheModuleSSL.dll
or
LoadModule ssl_module modules/ApacheModuleSSL.so
or
LoadModule ssl_module modules/mod_ssl.so
in newer versions

In newer versions of the distribution, it could also be necessary to add
AddModule mod_ssl.c
after the AddModule lines that are already in the config file

Add the following to the end of
httpd.conf:
# see httpwww.modssl.org/docs/2.8/ssl_reference.html for more infoSSLMutex sem SSLRandomSeed startup builtin SSLSessionCache none SSLLog logs/SSL.log SSLLogLevel info # You can later change "info" to "warn" if everything is OK SSLEngine On SSLCertificateFile conf/ssl/my-server.cert SSLCertificateKeyFile conf/ssl/my-server.key 
Don't forget to call apache with
-D SSL if the
IfDefine directive
is active in the config file!
You might need to use
regedit to change the key
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\X.Y.Z to the
correct number if the
apache.exe from
modssl.org/contrib is not the same version as the previously installed
one. (This seems not to be necessary with recent versions.)
Also, if you use IfDefine directives and start apache as a service, you need
to edit the apache command line in the registry
(
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Apache2)
(I haven't tried this)

Start the server, this time from the command prompt (not as a service) in
order to see the error messages that prevent Apache from starting. If
everything is OK, (optionally) press CTRL+C to stop the server and start it
as a service if you prefer

If it doesn't work, Apache should write meaningful messages to the screen and/or into the error.log and SSL.log files in the Apache/logs directory

If something doesn't work, set all

LogLevels to the maximum
and
*look into the logfiles*. They are very helpful

DON'T e-mail me or the other contributors without having plain Apache
installed (Step 1). We will ignore your request; we are not the Free Apache
Helpdesk and there is enough good documentation on configuring Apache; if that
is not enough for you, you shouldn't run a secure server anyway. Also, DON'T
e-mail without having looked into the error.log and SSL.log with
LogLevel set to Debug

Problems connecting to the server with a browser can have many reasons, many of them on the client (proxy, DNS, general IE dumbness)

So, if you encounter problems connecting with SSL, try another browser and/or look into the settings. If even this doesn't work, you can use OpenSSL to debug the problem

bb@www$
openssl s_client -connect no-such-machine:443gethostbyname failure # Error resolving this DNS name. Connect with the IP address.connect:errno=2 bb@www$ openssl s_client -connect www1.tud.at:443connect: Connection refused connect:errno=111 # No SSL server on this port. Double-check thebb@www$ Listenand Portdirectives. openssl s_client -connectapcenter.apcinteractive.net :443 # everything OK. OpenSSL shows the information it obtained from the server.CONNECTED(00000003) depth=0 /C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/[email protected] verify error:num=18:self signed certificate verify return:1 depth=0 /C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/[email protected] verify return:1Certificate chain 0 s:/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/[email protected] i:/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/[email protected] certificate BEGIN CERTIFICATE MIIC0TCCAjoCAQAwDQYJKoZIhvcNAQEEBQAwgbAxCzAJBgNVBAYTAmF0MQ0wCwYDV9ucXUnk= END CERTIFICATE subject=/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/[email protected] issuer=/C=at/ST=Wien/L=Wien/O=APC interactive/OU=Lifecycle Management/CN=apcenter.apcinteractive.net/[email protected] client certificate CA names sentSSL handshake has read 1281 bytes and written 320 bytesNew, TLSv1/SSLv3, Cipher is EDH-RSA-DES-CBC3-SHA Server public key is 1024 bit SSL-Session: Protocol : TLSv1 Cipher : EDH-RSA-DES-CBC3-SHA Session-ID: 49ACE1CF484A67D2C476B923D52110A6FCA1A7CE53D76DF7F233DEBF2333D4FB Session-ID-ctx: Master-Key: 00E9FA964253752294ECD69C18ADBA527B7170C112E2B3BCB25EA8F4FD847EC46E1FF0194EF8E16985B5E38BF6F12131 Key-Arg : None Start Time: 980696025 Timeout : 300 (sec) Verify return code: 0 (ok)[Enter: GET / HTTP/1.0 and press RETURN twice]HTTP/1.1 200 OK Date: Sun, 28 Jan 2001 15:34:58 GMT Server: Apache/1.3.9 (Win32) mod_ssl/2.4.9 OpenSSL/0.9.4 Cache-Control: no-cache, no-store, must-revalidate, private Expires: 0 Pragma: no-cache X-Powered-By: PHP/4.0.4 Last-Modified: Sun, 28 Jan 2001 15:35:00 GMT Connection: close Content-Type: text/html   # the server shows its main document
Q: I see the following when starting Apache:
Syntax error on line [some number] of httpd.conf Cannot load apache/modules/mod_ssl.so into server (126) The module could not be found:
openssl.exeinto a directory of its own and executing it. If it complains about not being able to find some DLLs, then you haven't copied them into the correct directory

Q: I see the following when starting Apache:
Syntax error on line [some number] of apache/conf/httpd.conf: Cannot load apache/modules/apachemodulessl.dll into server: (127) The specified procedure could not be found:or:
Syntax error on line [some number] of apache/conf/httpd.conf: Invalid command 'SSLMutex', perhaps mis-spelled or defined by a module not included in the server configuration
Q: SSL doesn't work in the browser and I see the following in some logfile:
[Fri Nov 16 15:46:30 2001] [error] OpenSSL: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request [Hint: speaking HTTP to HTTPS portA: How much clearer can an error message get? Your VirtualHost or Listen configuration is wrong

Don't ask us about installing servlet extensions, recompiling mod_ssl or
Apache with EAPI, recompiled versions etc. We have no idea and won't be able
help you. We are just users and not programmers

If your needs are so special, you are better off with a Debian GNU/Linux or OpenBSD server. It will save you lots of trouble. Really

Apache Web Server: httpwww.apache.org
mod_ssl: httpwww.modssl.org
mod_ssl configuration: httpwww.modssl.org/docs/2.8/ssl_reference.html
OpenSSL: httpwww.openssl.org
PHP Hypertext preprocessor: httpwww.php.net
Author of this document: Balázs
Bárány (httptud.at)
(mail me your questions, but only after having looked into the error logs with
LogLevel debug. You can mail me in English, German and Hungarian

If I am constantly ignoring your e-mail, read all the hints in the HOWTO about how to e-mail me.)
Contributor: Horst
Bräuner (OpenSSL configuration on NT)
Contributor: Christoph Zich (Windows 98)
Contributor: Torsten Stanienda (Test with 1.3.12, IfDefine directive)
Contributor: Peter Holm (Listen and Port directives)
Last change: 2009-12-24
This document can be redistributed under the GNU Free Documentation License. © Balázs Bárány 1999-2009