I'm trying to set up HTTPS on Apache, using a self-signed certificate. But instead of displaying the page, I get a bunch of weird errors. An a different error from each browser!
From Chrome:
Error 2 (net::ERR_FAILED): Unknown error.
From Firefox:
SSL received a record that exceeded the maximum permissible length. (Error code: ssl_error_rx_record_too_long)
I followed the steps detailed on http://slacksite.com/apache/certificate.php, as well as about 4 other guides. They are all about the same, but all give the same result. So I must be doing something wrong.
Briefly, here's what I did:
Generate the server key:
openssl genrsa -des3 -out server.key 1024
Generate CSR:
openssl req -new -key server.key -out server.csr
[while generating the request, I was careful to enter my actual hostname as the "Common Name (eg, your name or your server's hostname)"]
remove password from key:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
Self-sign the certificate:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Configured apache to point at those files, and use those certificates.
Any ideas?
UPDATE: Here's my virtual host configuration:
LoadModule ssl_module modules/mod_ssl.so
Listen 443
# Some MIME-types for downloading Certificates and CRLs
#
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout 300
SSLMutex default
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
## Virtual host to redirect to HTTPS
<VirtualHost *:80>
ServerName mail.craimer.org
Redirect permanent / https://mail.craimer.org:443
</VirtualHost>
##
## SSL Virtual Host Context
##
<VirtualHost mail.craimer.org:443>
ServerName mail.craimer.org
DocumentRoot "/usr/share/roundcubemail/trunk/roundcubemail/"
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/httpd/conf/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key
<Files ~ "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
# Deal with broken MSIE
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
The issue is more likely to lie with your vhost configuration.
The
ssl_error_rx_record_too_long
error can be produced by initiating an HTTPS session against an HTTP resource. Such as -https://host.name:80
.The approach I've used in the past is slightly different to the one you detailed. The instructions below were originally detailed in this post I found whilst looking how to set up ssl: Step by Step Installation Of Subversion Over Apache/SSL Authenticating through Active Directory (SSPI)
To summarise:
Under apache\bin create openssl.conf and set its contents as follows:
Open a command prompt up, navigate to apache\bin and run the following command:
openssl req -config openssl.conf -new -out server.csr
When prompted enter a pass phrase and then a second time to verify.
You will then be prompted to enter a Common Name [My Server Name]. Enter the name of the machine
Next remove the passphrase from the private key with the following command (note this may give a warning about not being able to find openssl.conf - this can be ignored):
openssl rsa -in server.key -out server.key
Enter the previously used passphrase when prompted
Next create the self signed certificate with the following command
`openssl x509 -in server.csr -out server.cert -req -signkey server.key -days 365
Delete the server.csr file from the apache\bin folder.
Copy the server.key and server.cert files from the apache\bin folder to the apache\conf folder.
Open apache\conf\httpd.conf in a text editor.
Change the listen port directive (which will probably either be Listen 80 or Listen 8080) to port 443:
Listen 443
Change the ServerName directive to include port 443 (note this may be commented out so remove the # at the start of the line if it is and replace server with your server name):
ServerName server:443
Uncomment or add the load module directive for mod_ssl (this should be present and commented so remove the # at the start of the line):
LoadModule ssl_module modules/mod_ssl.so
Add an IfModule section for mod_ssl (this shouldn't already be there, but if it is overwrite it):
Restart the Apache service. Test configuration by attempting (and failing) to connect via http, and attempting (and succeeding) to connect via https.
Well, since the user Jure1873 hasn't written up an answer, I cannot give him the credit deserved. Here is his solution:
And that was the solution. It turns out that (as of this writing)
httpd
cannot support multiple virtual hosts for HTTPS, so any connections to 443 must be directed to a single host. So I guesshttpd
was just silently rejecting the configuration that attempting to run a virtual host for HTTPS.Oh, and don't rail against apache for this "missing feature". It's not their fault! The HTTPS protocol doesn't support virtual hosts.
Boring Explaination:
You see, when you connect to port 443, and start an HTTPS session, all that's happening is security negotiation. HTTPS is all about setting up a secure tunnel between two points, and has nothing to do with HTTP. Only once the tunnel is set up, will data flow through. That data is the HTTP stream.
This means that the
Host:
directive (which is part of HTTP, not HTTPS) will only get sent after the secure tunnel has been constructed. It is theHost:
header which tells HTTP server which virtual host is being accessed. But in HTTPS, we get this information far too late: it arrives after we had to choose encryption keys.Bottom line: HTTPS cannot choose encryption keys based on the HTTP hostname.
Remove the tag from the VirtualHost configuration. EG.
<IfModule mod_ssl.c > </IfModule>
- remove those linesHere is one more situation in which this error occurs:
Define
VirtualHost *:80
insites-enabled/000-default.conf
. Then defineVirtualHost *:443
in
httpd.conf
If you move the configuration completely to either
httpd.conf
or to000-default.conf
it works. Else you get this error on FireFox:and this error on chrome:
Scraimer, the accepted answer is wrong, otherwise why do you think SSLCertificateFile directive can be in virtual host scope? Proof: http://httpd.apache.org/docs/current/mod/mod_ssl.html#sslcertificatefile
With virtual hosts, you still can use different cert files with name based virtual hosts.
I had the same trouble and the solution was to put real IP instead of * in VirtualHost directive, like this:
P.S. Hovewer I do not know why it worked. I just took this configuration as an example from real live server and reused it to my setup and it worked.