Tomcat 服务器学习和使用(二)

原文:JavaWeb 学习总结(三)——Tomcat 服务器学习和使用(二)

一、打包 JavaWeb 应用

在 Java 中,使用“jar”命令来对将 JavaWeb 应用打包成一个 war 包,jar 命令的用法如下:

img

范例:将 JavaWebDemoProject 这个 JavaWeb 应用打包成 war 包

img

执行完之后,就可以得到一个img文件,平时开发完 JavaWeb 应用后,一般都会将 JavaWeb 应用打包成一个 war 包,然后将这个 war 包放到 Tomcat 服务器的 webapps 目录下,当 Tomcat 服务器启动时,就会自动将 webapps 目录下的 war 包解压。

比如现在将img放到 Tomcat 服务器的 webapps 目录下:

img

Tomcat 服务器启动后会自动“Deploying web application”,将img这个 war 文件解压缩,如下图所示:

img

img

二、Tomcat 的体系结构

img

Tomcat 服务器的启动是基于一个 server.xml 文件的,Tomcat 启动的时候首先会启动一个 Server,Server 里面就会启动 Service,Service 里面就会启动多个“Connector(连接器)”,每一个连接器都在等待客户机的连接,当有用户使用浏览器去访问服务器上面的 web 资源时,首先是连接到 Connector(连接器),Connector(连接器) 是不处理用户的请求的,而是将用户的请求交给一个 Engine(引擎)去处理,Engine(引擎)接收到请求后就会解析用户想要访问的 Host,然后将请求交给相应的 Host,Host 收到请求后就会解析出用户想要访问这个 Host 下面的哪一个 Web 应用,一个 web 应用对应一个 Context。

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="conf/.keystore" keystorePass="123456"/>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
      <Host name="www.gacl.cn" appBase="F:\JavaWebApps">
        <Context path="" docBase="F:\JavaWebApps\JavaWebDemo1"/>
      </Host>

    </Engine>
  </Service>
</Server>

三、互联网上的加密原理

Tomcat 服务器启动时候会启动多个 Connector(连接器),而 Tomcat 服务器的连接器又分为加密连接器和非加密连机器,比如:

img

这里访问的就是使用 8080 端口的那个连接器

<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" />

这个 Connector 是一个没有加密的连接器,使用http://localhost:8080/JavaWebDemoProject/Web/1.jsp去请求服务器上的 web 资源的这个过程中,我们的请求是不加密的,要是想以一种加密的方式来访问 Tomcat 服务器,那么就要在 Tomcat 里面配置一个加密的 Connector。要配置一个加密连接器,首先应该把互联网上的加密原理弄清楚。

3.1、对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。

所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。

加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题

常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES 算法等

3.2、非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。

非对称加密工作原理

1.A 要向 B 发送信息,A 和 B 都要产生一对用于加密和解密的公钥和私钥。

2.A 的私钥保密,A 的公钥告诉 B;B 的私钥保密,B 的公钥告诉 A。

3.A 要给 B 发送信息时,A 用 B 的公钥加密信息,因为 A 知道 B 的公钥。

4.A 将这个消息发给 B(已经用 B 的公钥加密消息)。

5.B 收到这个消息后,B 用自己的私钥解密 A 的消息。其他所有收到这个报文的人都无法解密,因为只有 B 才有 B 的私钥

发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。

非对称性加密依然没有解决数据传输的安全性问题,比如 A 想向 B 发数据,B 首先生成一对密钥(公钥和私钥),然后将公钥发给 A,A 拿到 B 发给他的公钥有就可以使用公钥加密数据后发给 B,然而在 B 公钥发送给 A 的这个过程中,很有可能会被第三方 C 截获,C 截获到 B 的公钥后,也使用 B 的公钥加密数据,然后发给 B,B 接收到数据后就晕了,因为搞不清楚接收到的数据到底是 A 发的还是 C 发的,这是其中一个问题,另一个问题就是,C 截获到 B 发的公钥后,C 可以自己生成一对密钥(公钥和私钥),然后发给 A,A 拿到公钥后就以为是 B 发给他的,然后就使用公钥加密数据发给 B,发送给 B 的过程中被 C 截获下来,由于 A 是用 C 发给他的公钥加密数据的,而 C 有私钥,因此就可以解密 A 加密过后的内容了,而 B 接收到 A 发给他的数据后反而解不开了,因为数据是用 C 的公钥加密的,B 没有 C 的私钥,所以就无法解密。所以,非对称性加密存在一个问题:A 想向 B 发数据,A 如何确定拿到的公钥一定是 B 发的呢?那么如何解决这个问题呢?只能靠一个第三方机构(CA 机构,即证书授权中心(Certificate Authority),或称证书授权机构)来担保。A 想向 B 发数据,B 首先将公钥发给 CA 机构,CA 机构拿到 B 的公钥后跑到 B 的家里问:这是你发的公钥吗?B 确认过后说是:没错,是我发的!那么此时 CA 机构就会为 B 的公钥做担保,生成一份数字证书给 B,数字证书包含了 CA 的担保认证签名和 B 的公钥,B 拿到 CA 的这份数字证书后,就发给 A,A 拿到数字证书后,看到上面有 CA 的签名,就可以确定当前拿到的公钥是 B 发的,那么就可以放心大胆地使用公钥加密数据,然后发给 B 了。

四、https 连接器

明白了互联网上的加密原理之后,下面来看看浏览器与服务器交互时,浏览器想将数据加密后再发送给服务器,那么该怎么做呢?服务器首先要向浏览器出示一份数字证书,浏览器看到数字证书后,就可以使用数字证书里面的公钥加密数据,所以要想做浏览器和服务器的加密数据传输,那么首先得针对服务器生成一份数字证书。然后再配置一下服务器,让服务器收到浏览器的请求之后,会向浏览器出示它的数字证书。

4.1、生成 Tomcat 服务器的数字证书

SUN 公司提供了制作证书的工具 keytool, 在 JDK 1.4 以后的版本中都包含了这一工具,它的位置为 <JAVA_HOME>\bin\keytool.exe。

keytool -genkey -alias tomcat -keyalg RSA

使用 keytool 生成一个名字为 Tomcat 的证书,存放在 .keystore 这个密钥库中

img

命令执行完之后,操作系统的用户文件夹下面就会生成一个 .keystore 文件,如下图所示:

img

使用命令:keytool -list -keystore .keystore 查看 .keystore 密钥库里面的所有证书

img

4.2、配置 https 连接器

将生成的 .keystore 密钥库文件拷贝到 Tomcat 服务器的 conf 目录下,如下图所示:

img

修改 server.xml 文件,配置 https 连接器,代码如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
            maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
            clientAuth="false" sslProtocol="TLS" 
            keystoreFile="conf/.keystore" keystorePass="123456"/>

在 server.xml 文件中配置了一个端口是 8443 的加密连接器,浏览器访问 8443 端口的连接器时,将会以加密的方式来访问 web 服务器,这个连接器收到浏览器的请求后,将会向浏览器出示一份数字证书,浏览器再用数字证书里面的公钥来加密数据,keystoreFile="conf/.keystore"用来指明密钥库文件的所在路径,服务器从密钥库中提取证书时需要密码,keystorePass="123456"指明密钥库的访问密码。

使用https://localhost:8443/访问 8443 的加密连接器

img

由于密钥库里面的证书是我们手工生成的,没有经过 CA 的认证,所以使用https://localhost:8443/访问 8443 的加密连接器,浏览器会出现证书错误,导航已阻止,浏览器认为当前要访问的这个主机是不安全的,不推荐继续访问,点击img就可以继续访问了,如下图所示:

img

4.3、安装数字证书

为了让浏览器信任我们生成的数字证书,需要将数字证书安装到浏览器中,以 IE8 浏览器为例进行证书安装说明,安装步骤如下:

imgimg

imgimg

img

imgimg

imgimg

证书安装成功后,重启 IE 浏览器,使用https://localhost:8443/访问 8443 的加密连接器,此时浏览器就不再提示证书错误了,如下图所示:

img

4.4、删除数字证书

以 IE8 为例进行说明,操作步骤如下:工具 ----->Internet 选项

imgimg

imgimg

删除之后重启浏览器即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章