配置Apache SSL,然后使用mod_jk重定向到Tomcat

pio*_*ojo 5 apache ssl tomcat mod-jk

我正在尝试配置我的家庭服务器以接受端口443上的SSL连接.

我是www.mydomain.com域名,我刚刚使用mod_jk链接了Apache2和Tomcat,现在我也想接受来自网络的https请求.

这是我的配置:

httpd.conf文件

<IfModule mod_jk.c>
    JKWorkersFile /etc/apache2/workers.properties
    JkShmFile /var/log/apache2/mod_jk.shm
    JKLogFile /var/log/apache2/mod_jk.log
    JkLogLevel debug
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
</IfModule>


<VirtualHost *:80>
    DocumentRoot "/Library/ApacheTomcat/apache-tomcat-6.0.33/webapps/MyTomcatAppName"
    ServerName www.mydomain.com
    ErrorLog "/private/var/log/apache2/www.mydomain.com-error_log"
    CustomLog "/private/var/log/apache2/www.mydomain.com-access_log" common
    JkMountCopy On
    JkMount /* ajp13
</VirtualHost>


<VirtualHost *:80>
    DocumentRoot "/Library/ApacheTomcat/apache-tomcat-6.0.33/webapps/MyTomcatAppName"
    ServerName mydomain.com
    ErrorLog "/private/var/log/apache2/mydomain.com-error_log"
    CustomLog "/private/var/log/apache2/mydomaino.com-access_log" common
    JkMountCopy On
    JkMount /* ajp13
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

那么这是我的Worker.properties文件:

worker.list=ajp13

worker.ajp13.type=ajp13
worker.ajp13.host=localhost
worker.ajp13.port=8009
Run Code Online (Sandbox Code Playgroud)

这是我的server.xml:

    <Host name="localhost"  appBase="/Library/ApacheTomcat/apache-tomcat-6.0.33/webapps"
        unpackWARs="true" autoDeploy="true"
        xmlValidation="false" xmlNamespaceAware="false">
      <Context path="" docBase="/Library/ApacheTomcat/apache-tomcat-6.0.33/webapps/MyTomcatAppName" />
Run Code Online (Sandbox Code Playgroud)

使用此配置,当我访问http:// www.mydomain.com或http:// domain.com时,我正确浏览MyTomcatAppName ...我现在的问题是使用https连接访问同一网站,所以https:// www .mydomain.com或https:// domain.com.我的Mac Mini服务器(Lion osx)上也安装了GoDaddy证书,所以如果我输入https:// www.mydomain.com(或https:// domain.com),浏览器会正确通知我存在"mydomain.com"证书,但它也说:

Forbidden

You don't have permission to access / on this server.
Apache/2.2.20 (Unix) mod_ssl/2.2.20 OpenSSL/0.9.8r DAV/2 mod_jk/1.2.30 Server at mydomain.com Port 443
Run Code Online (Sandbox Code Playgroud)

我确定这是因为我错过了虚拟主机标签中的内容....所以我该如何解决?

pio*_*ojo 8

我找到了解决方案,所以我的Apache和Tomcat工作得很好......我将总结解决问题的步骤:

考虑到,你的mydomain证书(由GoDaddy签名)正确安装并存储在我的Mac服务器的Apple KeyChain中.

  1. 打开KeyChain App(带root),展开mydomain证书标签,这样你也可以看到私钥.
  2. 使用p12扩展名保存两者,然后从.p12生成.pem文件
  3. 私钥:

    umask 0077
      openssl pkcs12 -in pkfilename.p12 -nocerts -nodes -out filename-key.pem
    umask 0022
    
    Run Code Online (Sandbox Code Playgroud)
  4. 证书:

    openssl pkcs12 -in certfilename.p12 -clcerts -nokeys -out filename-cert.pem
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在/ etc/apache2 /目录中复制filename-key.pem和filename-cert.pem

  6. 考虑到您具有上面显示的相同httpd.conf配置,您只需要VirtualHost为443(https端口)连接添加2个以上.
  7. 无论如何,为您希望保护的每个ServerName添加1个VirtualHost,例如我只想保护mydomain.com传入连接:

    <VirtualHost _default_:443>
        DocumentRoot "/Library/ApacheTomcat/apache-tomcat-6.0.33/webapps/MyServerAppName"
        ServerName mydomain.com
        ErrorLog "/private/var/log/apache2/https_mydomain.com-error_log"
        CustomLog "/private/var/log/apache2/https_mydomain.com-access_log" common
        SSLEngine On
        SSLCertificateFile /etc/apache2/filename-cert.pem
        SSLCertificateKeyFile /etc/apache2/filename-key.pem
        JkMountCopy On
        JkMount /* ajp13
    </VirtualHost>
    
    Run Code Online (Sandbox Code Playgroud)
  8. 添加Listen 443httpd.conf文件,只需Listen 80在开头找到它下面添加这一行.

您现在可以浏览http:// mydomain.com和https:// mydomain.com.如果出现错误,您可以阅读其中的日志文件/var/log/apache2/.

特别感谢Bruno用户,如何帮助我创建私钥和证书文件(步骤3和4).

我希望本指南可以帮助您在mod_jk上配置Apache和Tomcat以进行安全SSL连接.


Bru*_*uno 2

您已在虚拟主机中为普通 HTTP 请求配置了 mod_jk ( VirtualHost *:80)。您还需要Jk*在 HTTPS 虚拟主机 ( VirtualHost *:443) 中配置这些选项,您已在其中配置了 SSL 设置。

  • 如果,当您访问 `https://www.mydomain.com/` 时,您收到 HTTP 响应(禁止),则 HTTPS 已经在工作,因此您必须以某种方式配置了 [`SSL*`](http:// /httpd.apache.org/docs/2.2/mod/mod_ssl.html)某处的选项。尝试将虚拟主机设置为它们所在的位置(或者使用“VirtualHost *:443”创建一个,如果它尚不存在)并将“Jk*”选项放在那里。 (2认同)
  • 我忘记在 VirtualHost 中添加证书和私钥,您帮助我在其他帖子上创建它们,所以现在我总结了我的答案中的步骤...非常感谢... (2认同)