在另一篇https介绍与应用中主要介绍的是https的基本概念以及要素。这篇介绍的是如何在apache或tomcat中配置https。

首先,要明白以下几点:

  • https需要证书,不管是哪一类容器解析这个协议都需要证书
  • apache和tomcat协同工作时,只需要配置apache的就可以了
  • 这里介绍的是在线安装apache2,系统环境是ubuntu 15.10,apache的在线版本是2.4.2(通过apache2 -v查询得到)
  • 这篇还会介绍,如何配置eclipse的wtp,使之协同apache(https/http协议)进行即时开发和debug

在tomcat中配置https

证书那些事

用java工具生成服务器证书
keytool -genkey -v -alias tomcat -keyalg RSA -keystore tomcat.keystore -validity 36500
需要设置一个keystore密码和在tomcat中使用的密码

可以查看证书列表:
keytool -list -keystore tomcat.keystore (tomcat为你设置服务器端的证书名)。

双向认证还需要以下步骤:
(1)让客户端信任
keytool -keystore tomcat.keystore -export -alias tomcat -file tomcat.cer
这个可以在客户机上安装
(2)生成客户端证书
keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore mykey.p12
(3)让服务器信任
keytool -export -alias mykey -keystore mykey.p12 -storetype PKCS12 -storepass 87654321 -rfc -file mykey.cer
下一步,是将该文件导入到服务器的证书库,添加为一个信任证书使用命令如下:
keytool -import -v -file mykey.cer -keystore tomcat.keystore

在tomcat中使用证书

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="150" scheme="https"
secure="true" clientAuth="false" sslProtocol="TLS"
keystoreFile="${user.home}/p/apache-tomcat-7.0.68/tomcat.keystore" keystorePass="123456"
truststoreFile="${user.home}/p/apache-tomcat-7.0.68/tomcat.keystore" truststorePass="123456" />

这样就可以通过https访问:
https://192.168.16.71:8443/locator/v3/tikimo

另外,在web.xml可以配置为强制用https访问,这样访问会自动跳转

<security-constraintg> 
        <web-resource-collection > 
                <web-resource-name >SSL</web-resource-name> 
                <url-pattern>/*</url-pattern> 
        </web-resource-collection>

        <user-data-constraint> 
                <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
        </user-data-constraint> 
</security-constraint>

附,权威签名方法:使用certbot证书实现对HTTPS的支持

在apache中配置https

(1)在线安装apache2
sudo apt-get install apache2

(2)启动apache2
不能直接输入apache2,它是一个服务,正确的方法是service apache2 start。如果启动失败,可以通过跟踪模式了解到问题出在哪里:systemctl status apache2.service -l

需要介绍的是在线安装版的apache的几个主要目录:

  • /usr/lib/apache2/modules 库文件放在这里
  • /etc/apache2/mods-enabled/ 组件配置与加载放在这里,不过都是快捷方式,真正可以被采用的都放在/etc/apache2/mods-available/目录下
  • /etc/apache2/sites-enabled/000-default.conf 虚拟目录及网站在这里配置

(3)配置JK
mod_jk是apache与tomcat的connector,当然可以下载相应版本的库存放本地:/usr/lib/apache2/modules/mod_jk.so

配置文件和加载文件也要,可以放在前文所述的/etc/apache2/mods-available/下,然后用在/etc/apache2/mods-enabled/下创建快捷方式:ln -s source_file target_dir

jk.load的内容是

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so

jk.conf的内容是:

JkWorkersFile /etc/apache2/mods-enabled/jk_workers.properties 
JkLogFile /var/www/iwit/mod_jk.log 
JkLogLevel info 
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]" 
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories 
JkRequestLogFormat "%w %V %T" 

jk_workers.properties的内容是:

worker.list=worker1

worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

(4)配置host
vim /etc/apache2/sites-enabled/的内容是:

<VirtualHost *:80>
        ServerName 192.168.16.71
        ServerAlias tl
        #DocumentRoot /var/www/iwit/locator_3.0 
        JkMount /* worker1
        ErrorLog /var/www/iwit/err.log
        CustomLog /var/www/iwit/access.log combined
</VirtualHost>

(5)配置HTTPS

  • 需要签名文件及签名所用的密码,用的是128位rsa非对称加密算法 openssl genrsa 1024 > server.key
  • 生成证书请求文件,后续需要填写相当多的证书相关的资料 openssl req -new -key server.key > server.csr
  • 由前面两者生成证书 openssl req -x509 -days 365 -key server.key -in server.csr > server.crt
  • 查看证书是否有效,打开验证即可
    openssl x509 -in server.crt -text -noout
  • 将证书和密钥复制到相应的位置 sudo cp server.crt /etc/ssl/certs以及sudo cp server.key /etc/ssl/private
  • 添加host,要像第(4)一样添加host,注意端口443,这样http/https都支持了,注意这个host的相关属性都要打开
<VirtualHost *:443>
        ServerName 192.168.16.71
        ServerAlias tl
        #DocumentRoot /var/www/iwit/locator_3.0 
        SSLEngine On
        SSLOptions +StrictRequire
        SSLCertificateFile /etc/ssl/certs/server.crt
        SSLCertificateKeyFile /etc/ssl/private/server.key
        JkMount /* worker1
        ErrorLog /var/www/iwit/err.log
        CustomLog /var/www/iwit/access.log combined
</VirtualHost>               

(6)看效果,在WTP配置好的情况下,输入http(s)://tl/xx或http(s)://192.168.16.71/xxx,都能正常访问了。

如何与WTP连接

WTP指的是eclipse的web tools platform工程,将在发布到server容器,可以在eclipse工具平台上运行web应用,主要特点是在开发的同时能自动发布。因此,当软件过程正处理开发和debug阶段好用,通常在局域网内用,公网的方法可同受此方法启示。

正常的WTP发布很简单,添加一个server(通常tomcat),将WTP工程添加到server上,即可。

现在这里要讲的是:

  • apache+tomcat+wtp联合,能通过域名(其实就是计算机名)或局域网IP访问WTP程序。
  • 同时支持HTTP/HTTPS访问。
  • WTP的工作目录自定义

在eclipse中server.xml需要配置的内容不多,主要有以下几点注意:

  • 自定义WTP工作目录,点击server,打开配置标签页,配置Server Locations项目就可以了,注意server path下会保存其它配置信息,就像tomcat的一个根目录下的其它文件一样,deploy path才是各个项目发布的父文件夹,相当于通常的webapps,项目文件夹无法自定义。
  • 在server.xml(eclipse中的,相当于tomcat本身的一个拷贝)的host节点下添加以下子项:
<Alias>192.168.16.71</Alias>

因为默认的localhost不能被更改,更改启动失败了。这指两个域名(或IP)指向同一个HOST节点。HOST节点下的path,可配成""

  • server.xml中的<connector ... redirectPort="8443">中的redirectPort指,当https请求到达这个端口时,跳转到相应的8443端口