Error during SSL Handshake with remote server

asked11 years ago
last updated11 years ago
viewed226.4k times
Up Vote152Down Vote

I have Apache2 (listening on 443) and a web app running on Tomcat7 (listening on 8443) on Ubuntu.

I set apache2 as reverse proxy so that I access the web app through port 443 instead of 8443. Besides, I need to have SSL communication not only between browser and apache2 but also between apache2 and tomcat7, thus I set SSL on both apache2 and tomcat7. If I try to access the web app by directly contacting tomcat7, everything is fine. The problem is that when I try to access the tomcat's web app through apache2 (reverse proxy), on the browser appears the error:

Proxy Error
The proxy server could not handle the request GET /web_app.
Reason: Error during SSL Handshake with remote server

11 Answers

Up Vote8Down Vote
Grade: B
  • Make sure that the SSL certificates used by Apache and Tomcat are compatible. They should have the same root certificate authority (CA) and the same intermediate certificates.
  • Check that the SSL ports on both Apache and Tomcat are correctly configured.
  • Ensure that the SSL certificates are valid and not expired.
  • Verify that the SSL protocols and ciphers supported by Apache and Tomcat are compatible.
  • Check the firewall settings on both servers to make sure that the SSL ports are open.
  • Examine the Apache and Tomcat logs for any error messages related to the SSL handshake.
  • Restart Apache and Tomcat after making any changes.
  • If you are using self-signed certificates, make sure that the browser trusts them.
  • Consider using a trusted CA to issue certificates for both Apache and Tomcat.
  • If you are still facing problems, you can try disabling SSL on Apache and see if the issue persists. This will help you determine if the problem is with Apache or Tomcat.
Up Vote8Down Vote
Grade: B

I understand that you're experiencing an issue with SSL handshake between Apache2 and Tomcat7 when using Apache2 as a reverse proxy. Here are some suggestions to help you troubleshoot this problem:

  1. Verify the SSL certificates on both Apache2 and Tomcat7: Make sure that the SSL certificates on both Apache2 and Tomcat7 are valid, correctly installed, and not self-signed. You can check them using tools like OpenSSL or by visiting each site in your browser.

  2. Configure Apache2 to trust the Tomcat's SSL certificate: Ensure that Apache2 has the Tomcat's SSL certificate added to its trust store (or CA bundle). This will help Apache2 trust the certificate when making the SSL connection with Tomcat7. You can do this by adding the certificate to the /etc/ssl/certs/ directory and updating the ssl_certificate_file and ssl_trust_ca_files directives in your Apache2 configuration file.

  3. Check for SSL protocol compatibility: Ensure that both Apache2 and Tomcat7 support the same SSL protocol versions and ciphers. You can check these settings in your SSL configurations (e.g., OpenSSL or ssl_protocols, ssl_ciphers in Apache).

  4. Allow forwarding of X-Forwarded-Proto header: Since you're using SSL communication between the browser and Apache2 as a reverse proxy, ensure that Apache2 forwards the X-Forwarded-Proto header to Tomcat7. This will allow Tomcat7 to properly respond with the HTTPS protocol. Update your Apache configuration file to set ProxyPreserveHost On and include this line: SetEnvIf X-Forwarded-Proto "HTTPS" ssl_protocols="TLSv1 TLSv1.1 TLSv1.2 SSLv231"

  5. Enable SSL vhosts on Apache2 and Tomcat7: Make sure that both the Apache2 virtual host for your web app and the Tomcat7 context root have SSL configurations enabled. In the case of Apache2, ensure that you have a <VirtualHost> block for your site with the correct SSL certificate, keys, and protocol settings. For Tomcat7, check if there's an existing SSL configuration (in the server.xml file under $CATALINA_HOME/conf) or create a new one using tools like OpenSSL.

After making these changes, restart both Apache2 and Tomcat7 to apply any modifications made. Test your web app again by accessing it through the reverse proxy on port 443. If you continue to experience issues, you may need to investigate further by examining error logs or checking network traffic with Wireshark or other packet sniffing tools.

Up Vote7Down Vote
Grade: B

This error typically occurs when the SSL/TLS handshake between the client and server fails. There could be several reasons for this issue, and the specific reason would depend on the details of your setup. Here are some possible causes:

  1. Apache and Tomcat might not share the same truststore.
  2. Incorrect SSL/TLS settings in either configuration file.
  3. Unmatched or outdated certificate versions in either server.
  4. Mismatching key sizes for both servers.
  5. Problems with certificate issuers, intermediate CA certificates, or CRL files.
  6. Error in Apache's virtual host configuration file that references Tomcat.
  7. Unauthorized access to the Tomcat server, such as due to incorrect username/password authentication or firewall issues. 8. Lack of resources like insufficient memory or CPU, which can hinder the SSL/TLS handshake process. To resolve this issue, you must identify the specific problem and address it in order to enable SSL communication between Apache and Tomcat. You can try the following troubleshooting steps:
  8. Check your Apache server log file to find out what happened when the SSL/TLS connection was established.
  9. Test Tomcat's SSL certificate validity by using an SSL tool like openssl s_client to establish a TLS 1.2 connection and print its version, cipher suite, and peer certificate information.
  10. Confirm if your Apache server and Tomcat share the same truststore. To do this, ensure that both servers' truststores include each other's certificates.
  11. Ensure you use correct SSL/TLS settings for your Tomcat server, including ciphers, key stores, and certificate chains.
  12. Check Apache and Tomcat for any incompatible configuration changes or errors.
  13. If all else fails, try restarting both servers and testing again. It is essential to examine these issues one by one and address each problem as it occurs before seeking additional help from a networking specialist or IT professional.
Up Vote7Down Vote
Grade: B

This error indicates Apache cannot negotiate an SSL handshake properly between itself and Tomcat7 which may be due to incorrect configuration settings for both servers.

Here are few things you could do in order to resolve the problem:

  1. Enable SSL on Apache (if it's not already enabled). In your apache2 site config, make sure the following lines exist or uncomment them if they were commented out:
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/mycert.pem
    SSLCertificateKeyFile /etc/apache2/ssl/mykey.pem
    
2. Also, verify that your Apache configuration for `ProxyPass` and `ProxyPassReverse` are set up correctly like: 

ProxyRequests Off ProxyPreserveHost On

<VirtualHost *:443> ServerName www.yourwebsite.com SSLEngine on SSLCertificateFile /etc/apache2/ssl/mycert.pem SSLCertificateKeyFile /etc/apache2/ssl/mykey.pem ProxyPass / http://localhost:8080/ # assuming tomcat runs on port 8080 ProxyPassReverse / http://localhost:8080/

3. Check if `mod_proxy` is enabled in Apache by typing `apachectl -M | grep proxy` which should output something like: 
`proxy`, `proxy_http`.
4. The server that you're trying to communicate with on port 8080 (Tomcat) should also have SSL set up correctly for the same certificate and key as used by Apache. Make sure Tomcat is running with this keystore using the JVM option like: `-Djavax.net.ssl.keyStore=/path_to/mykeystore -Djavax.net.ssl.keyStorePassword=mypassword`
5. Finally, try to access your website via https://yourwebsite.com and check the browser's console for SSL errors. This would likely provide more details about what went wrong in the SSL Handshake. 

If you have already ensured all of these settings are correctly configured, but still receiving the same error, there could be other factors at play. These might involve deeper server configuration or even a bug somewhere on either your Apache or Tomcat servers which would need additional debugging and troubleshooting. If none of these solutions work for you, you should consider contacting the server administrators of both Apache and Tomcat for further support.
Up Vote7Down Vote
Grade: B

Possible Causes of SSL Handshake Error:

  • Certificate Validation Failure: The SSL certificate for the remote server might be invalid or missing.
  • Domain Name Resolution Issue: The host name used in the SSL certificate and the domain name being accessed might not match.
  • Cipher Suite Mismatch: The SSL protocol (TLS or SSL) used by the client and server might not match.
  • Proxy Settings: The Apache reverse proxy may be blocking necessary communication ports or protocols.

Solutions:

  • Verify SSL Certificate and Domain Name: Ensure that the SSL certificate is valid for the domain name and that the certificate is installed on the Apache server.
  • Check SSL Protocol and Cipher Suite: Ensure that both the client and server support the same SSL protocol (TLS or SSL) and cipher suite. For instance, using TLS_1.2 and AES 256-bit encryption is recommended.
  • Review Apache Reverse Proxy Settings: Check that the reverse proxy allows the necessary ports (443 for Apache and 8443 for Tomcat) and protocols (TLS or SSL).
  • Use a Chrome Extension for SSL Inspection: Some browser extensions can inspect the SSL handshake and provide insights into potential issues.
  • Contact Your Hosting Provider: If you have control over the server, contact the hosting provider and request an SSL certificate for your domain.

Additional Tips:

  • Use a tool like openssl to analyze the SSL certificate and check its validity and configuration.
  • Enable debugging on your Apache and Tomcat servers to see if any errors are logged.
  • Use a SSL inspection tool, such as SSLLabs or Chrome's developer tools, to identify and fix any certificate or cipher issues.
  • Ensure that your Ubuntu system and Apache and Tomcat are running the latest versions.
Up Vote7Down Vote
Grade: B

Possible Causes:

  • Invalid SSL certificate: Ensure that the SSL certificate for Apache2 and Tomcat7 is valid and matches the domain name.
  • Misconfigured SSL proxy: Check the Apache2 configuration for SSL proxy settings and make sure they are correct.
  • Incorrect SSL protocols: Verify that the SSL protocols used by Apache2 and Tomcat7 are compatible with each other.
  • Firewall blocking traffic: Inspect any firewall rules that may be blocking traffic to the tomcat port (8443) through Apache2.

Troubleshooting Steps:

  1. Verify SSL certificate: Check the validity of the SSL certificates for Apache2 and Tomcat7, ensuring they match the domain name.
  2. Review Apache2 configuration: Examine the Apache2 SSL proxy settings and make sure they are configured correctly. Refer to the official documentation for Apache2 SSL proxy setup.
  3. Compare SSL protocols: Compare the SSL protocols used by Apache2 and Tomcat7 and ensure they are compatible.
  4. Check firewall rules: Inspect firewall rules to see if they are blocking traffic to the tomcat port through Apache2.
  5. Test direct access to Tomcat: Try accessing the web app directly through Tomcat7 to determine if the issue is related to Apache2 or Tomcat7.

Additional Tips:

  • Use openssl command to verify the SSL certificate and its validity.
  • Enable SSL debugging on Apache2 to see more detailed error messages.
  • Review the Apache2 and Tomcat7 logs for any SSL-related errors.
  • If the above steps don't resolve the issue, consider seeking further assistance from the community or a professional.

Note:

It's important to use valid SSL certificates and configure the proxy settings correctly to ensure secure communication between Apache2, Tomcat7, and the browser. If the certificates are invalid or the proxy settings are incorrect, you may encounter SSL handshake errors.

Up Vote7Down Vote
Grade: B

I'm sorry to hear that you're having trouble with SSL handshake while using Apache2 as a reverse proxy for your Tomcat7 web app. This issue usually occurs due to misconfiguration of SSL settings or certificate issues. Here are some steps you can follow to troubleshoot this problem:

  1. Check SSL certificate and key configuration: Make sure that the SSL certificate and key files are correctly configured in both Apache2 and Tomcat7. Ensure that the paths in the configuration files are correct.

  2. Enable debug logs: Enable debug logs for Apache2 and Tomcat7 to get more details about the SSL handshake issue. In Apache2, you can enable debug logs by adding the following line in your VirtualHost configuration:

    LogLevel debug
    

    In Tomcat7, you can enable debug logs by adding the following system property in the catalina.sh script (or catalina.bat for Windows):

    -Djava.util.logging.config.file=logging.properties -Djava.util.logging.Manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.class=org.apache.juli.ClassLoaderLogManager
    

    And then, add the following lines in the logging.properties file:

    handlers= java.util.logging.ConsoleHandler
    .level= FINEST
    java.util.logging.ConsoleHandler.level = FINEST
    java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
    
  3. Verify Tomcat7 AJP connector configuration: If you are using the AJP protocol for communication between Apache2 and Tomcat7, make sure that the AJP connector is configured correctly in Tomcat7's server.xml file. Here's an example of a properly configured AJP connector:

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    
  4. Check for mismatched protocols and ciphers: Ensure that the SSL protocols and ciphers are compatible between Apache2 and Tomcat7. If you are using different protocols or ciphers, this may result in SSL handshake issues. Make sure that both servers use the same protocols and ciphers.

  5. Verify proxy configuration: Verify that the Apache2 proxy configuration is correct. Make sure that the proxy settings are enabled, and the ProxyPass and ProxyPassReverse directives are pointing to the correct Tomcat7 URL. Here's an example of a properly configured proxy setting:

    ProxyPass /web_app https://localhost:8443/web_app
    ProxyPassReverse /web_app https://localhost:8443/web_app
    

    Also, ensure that the SSLProxyEngine directive is set to 'On' for the virtual host configuration:

    SSLEngine on
    SSLProxyEngine on
    

Try these steps, and carefully examine the debug logs for any SSL-related errors or warnings. With this information, you should be able to identify the root cause of the SSL handshake issue and resolve it.

Up Vote7Down Vote
Grade: B

The comment by MK pointed me in the right direction.

In the case of Apache 2.4 and up, there are different defaults and a new directive.

I am running Apache 2.4.6, and I had to add the following directives to get it working:

SSLProxyEngine on
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
Up Vote6Down Vote
Grade: B

1. Check SSL Certificates:

  • Ensure that both Apache2 and Tomcat7 have valid SSL certificates installed.
  • Verify that the certificate chains are complete and trusted by the browser.

2. Configure Apache2 Reverse Proxy:

  • In the Apache2 configuration file (/etc/apache2/sites-available/your-site.conf), ensure that the following settings are correct:
ProxyPass / https://localhost:8443/
ProxyPassReverse / https://localhost:8443/
  • Replace localhost with the actual hostname or IP address of your Tomcat7 server.

3. Configure Tomcat7 SSL Connector:

  • In the Tomcat7 configuration file (/etc/tomcat7/server.xml), ensure that the SSL connector is configured properly:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" keystoreFile="path/to/keystore.jks" keystorePass="password" />
  • Replace path/to/keystore.jks and password with the actual path and password of your Tomcat7 keystore.

4. Check Firewall Settings:

  • Ensure that port 8443 (for Tomcat7 SSL) is open in your firewall.

5. Verify Apache2 and Tomcat7 Logs:

  • Check the Apache2 error log (/var/log/apache2/error.log) and Tomcat7 access log (/var/log/tomcat7/access.log) for any errors related to the SSL handshake.

6. Additional Troubleshooting:

  • Try disabling SSL temporarily on Tomcat7 to see if the issue persists.
  • Use a tool like openssl s_client to test the SSL handshake between Apache2 and Tomcat7:
openssl s_client -connect localhost:8443 -servername your-domain.com
  • If the handshake fails, check the output for any errors.
Up Vote5Down Vote
Grade: C

There could be multiple causes for this error, here are some steps to identify the issue:

  1. First, ensure that Apache2 and Tomcat7 are up and running properly and listening on the expected ports (443 for apache2 and 8443 for tomcat7). You can use command "tls --list" for this purpose.
  2. Check if the server's certificate is valid. Try to access a secure resource through both SSL connection and see if there are any errors. If it works, then your certificate might be expired or invalid.
  3. Check that apache2 is properly configured for TLS connections (e.g., "--ssl-ca" and "--tls" should be used). You can use the command "tls --list" to list all available SSL certificates. If you see any certificate with an incorrect issuer or location, it might cause issues with the TLS handshake.
  4. Check if apache2 is listening on the right port (i.e., 8443 instead of 443). If not, update the Apache's http.conf.
  5. Finally, check if Tomcat7 has a certificate installed in its /etc/ssl directory that matches the server's CA certificates and verify it with "openssl verify" command.

I hope this helps you identify and solve the issue! Let me know if there is anything else I can assist you with.

Up Vote4Down Vote
Grade: C

The error message "Proxy Error - The proxy server could not handle the request GET /web_app" indicates that there was a problem with proxying.

To troubleshoot further, you should check the log files of your Apache2 reverse proxy and Tomcat7 web app to see if any errors were logged in either server logs.