xqlee 1065 0 2017-08-17 14:12:10

一、SSL是什么?HTTPS是什么?为何需要使用SSL

  安全套接字层(SSL)是一种安全传输协议,用于在Internet上使用加密方法进行通信。SSL协议的主要目的是保证没有人能够篡改浏览器和web应用程序部署的服务器之间的通信。安全通信的另一个目的是根据SSL信息对服务器及其所有者进行身份验证,这样用户就可以确定正在访问的服务器是它正在访问的服务器。在常见的SSL场景中,当用户第一次访问web服务器时,服务器将其SSL证书或公钥发送给客户机。SSL证书包含关于服务器的信息,它的所有者、公司和它的有效期。如果用户不相信证书的真实性,就可以拒绝证书,从而有效地终止连接。如果用户接受该证书,证书本身就存储在浏览器中,并用于启动与发布服务器的安全连接。

   HTTP协议上的SSL协议通信称为HTTPS(安全HTTP)。例如,使用SSL加密连接的web站点在浏览器的地址栏中显示https作为协议名称。称为证书颁发机构(CA)的组织可以对SSL证书的详细信息进行身份验证,因此,如果用户信任CA,他们可以确保安全的web站点得到了认证,并且其详细信息是正确的。有许多ca可以颁发经过认证的SSL证书。现代浏览器自动识别最大和最知名的ca,并允许连接到提供这些组织认证的SSL证书的站点。如果SSL证书不是由CA认证的,或者由CA认证,但是没有被用户的浏览器识别,那么用户将会出现一个警告屏幕,在那里他或她可以决定是否信任该证书。

tomcat配置SSL步骤包含

1)生成密钥存储库

2)在server.xml中更新连接器

3)更新应用程序的web。xml与安全的网址
 

二、生成密钥对

  SSL证书是JKS文件。JKS的格式代表Java密钥库,这是一个特定于Java的密钥存储库格式。JKS密钥库可以使用keytool实用程序创建和操作,从版本1.4发布它作为Java SDK的一部分。我们将使用Keytool创建一个自签名的SSL证书,它位于javahome/bin/目录中。
//GOTO JAVA HOME
c:\ > cd %JAVA_HOME%/bin
 
//TYPE GENKEY COMMAND
C:\BAML\DFCCUI\installs\jdk1.6\bin>keytool -genkey -alias tomcat -keyalg RSA
 
Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  lokesh
What is the name of your organizational unit?
  [Unknown]:  boa
What is the name of your organization?
  [Unknown]:  boa
What is the name of your City or Locality?
  [Unknown]:  delhi
What is the name of your State or Province?
  [Unknown]:  delhi
What is the two-letter country code for this unit?
  [Unknown]:  91
Is CN=lokesh, OU=boa, O=boa, L=delhi, ST=delhi, C=91 correct?
  [no]:  yes
 
Enter key password for <tomcat>
        (RETURN if same as keystore password):
Re-enter new password:
 
C:\installs\jdk1.6\bin>
将会创建一个.keystore 文件在你的用户主目录中. 在windows 7系统中, 存放位置 C:\Users\lokesh.
也可以通过参数-keystore d:/leadsec指定创建的文件存放路径
keytool -genkey -alias tomcat -keyalg RSA -keystore d:/mySSLKeystore

提示:您只能为一个IP地址提供一个SSL证书。如果您在同一个IP上驻留多个域,那么只有一个主机名可以有一个与它的域名匹配的有效的SSL证书。如果您尝试在同一IP上使用SSL,那么浏览器将显示一个警告,即域名与证书不匹配。这是一个已知的SSL限制,因为SSL协议握手必须在从HTTP请求中提取主机名之前发生。

三、更新server.xml配置文件中的Connector


Tomcat 能够使用两种 SSL 实现:
  • JSSE 实现,它是Java 运行时(从 1.4 版本起)的一部分。
  • APR 实现,默认使用 OpenSSL 引擎。
3.1JSSE 实现,它是Java 运行时(从 1.4 版本起)的一部分。

打开你的tomcat安装位置,进入conf目录。在这个目录中你可以找到server.xml配置文件。打开这个配置文件并且找到下面的声明:
 

<!--
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
-->
修改这个信息,取消注释。并且配置刚才生成的密码和秘钥的路径。
<Connector SSLEnabled="true" acceptCount="100" clientAuth="false"
    disableUploadTimeout="true" enableLookups="false" maxThreads="25"
    port="8443" keystoreFile="C:/Users/lokesh/.keystore" keystorePass="password"
    protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"
    secure="true" sslProtocol="TLS" />
完成之后看看应用的变化。
配置ssl后需要将之前的8080注释掉
	<!--
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
			   -->


访问https的地址为:http://ip:8443/projectname
注意:直接输入ip:8443/projectname浏览器会默认http协议,必须手动输入https://

3.2APR 实现,默认使用 OpenSSL 引擎。
指定 APR 连接器(APR 库必须可用),则使用:
<!-- Define a HTTP/1.1 Connector on port 8443, APR implementation -->
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
           port="8443" .../>
如果使用 APR,则会出现一个选项,从而可以配置另一种 OpenSSL 引擎。
<Listener className="org.apache.catalina.core.AprLifecycleListener"
          SSLEngine="someengine" SSLRandomSeed="somedevice" />
默认值为:
<Listener className="org.apache.catalina.core.AprLifecycleListener"
          SSLEngine="on" SSLRandomSeed="builtin" />
所以要想使用 APR 实现,一定要确保 SSLEngine 属性值不能为 off。该属性值默认为 on,如果指定的是其他值,它也会成为一个有效的引擎名称。
最后一步是在 $CATALINA_BASE/conf/server.xml 中配置连接器,$CATALINA_BASE 表示的是 Tomcat 实例的基本目录。Tomcat 安装的默认 server.xml 文件中包含一个用于 SSL 连接器的 <Connector> 元素的范例。APR 连接器会使用很多不同的属性来设置 SSL,特别是密钥和证书。 APR 配置范例如下:
<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector
           protocol="org.apache.coyote.http11.Http11AprProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           SSLCertificateFile="/usr/local/ssl/server.crt"
           SSLCertificateKeyFile="/usr/local/ssl/server.pem"
           SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"/>
 

四、修改应用中的web.xml配置文件使用安全URL

修改你的应用中的web.xml配置文件,如下:
<security-constraint>
    <web-resource-collection>
        <web-resource-name>application-one</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

url模式被设置为/*因此,来自您的应用程序的任何页面/资源都是安全的(只能通过https访问)。传输保证标签被设置为机密,以确保你的应用能在SSL上运行。

现在尝试访问该应用程序使用 https://localhost:8443/application-one/.这将在浏览器中显示证书信息。
证书
只有在您接受证书之后,它才会显示页面。
页面
如果你没有在网络上设置“安全限制”。xml然后你将能够访问您的应用程序直接使用http://localhost:8080/application-one/.
未使用安全
这就是关于在tomcat服务器中实现SSL支持的简单而又重要的概念
 

五.使用场景

  一定要注意的是,通常只有当 Tomcat 是独立运行的 Web 服务器时,才有必要去配置 Tomcat 以便利用加密套接字。具体细节可参看 Security Considerations Document。当 Tomcat 以 Servlet/JSP 容器的形式在其他 Web 服务器(比如 Apache 或 Microsoft IIS)背后运行时,通常需要配置的是主 Web 服务器,用主服务器来处理与用户的 SSL 连接。主服务器一般会利用所有的 SSL 相关功能,将任何只有 Tomcat 才能处理的请求进行解密后再传给 Tomcat。同样,Tomcat 会返回明文形式的响应,这些响应在被传输到用户浏览器之前会被主服务器进行加密处理。在这种情境下,Tomcat 知道主服务器与客户端的所有通信都是通过安全连接进行的(因为应用要求),但 Tomcat 自身无法参与到加密与解密的过程中。

六.证书支持类型

  Tomcat 目前只能操作 JKSPKCS11PKCS12 格式的密钥存储库。JKS 是 Java 标准的“Java 密钥存储库”格式,是通过 keytool 命令行工具创建的。该工具包含在 JDK 中。PKCS12 格式一种互联网标准,可以通过 OpenSSL 和 Microsoft 的 Key-Manager 来。

密钥存储库中的每一项都通过一个别名字符串来标识。尽管许多密码存储库实现都在处理别名时不区分大小写,但区分大小写的实现也是允许的。比如,PKCS11 规范需要别名是区分大小写的。为了避免别名大小写敏感的问题,不建议使用只有大小写不同的别名。

为了将现有的证书导入 JKS 密码存储库,请查阅关于 keytool 的相关文档(位于 JDK 文档包里)。注意,OpenSSL 经常会在密码前加上易于理解的注释,但 keytool 并不支持这一点。所以如果证书里的密码数据前面有注释的话,在利用 keytool 导入证书前,一定要清除它们。

要想把一个已有的由你自己的 CA 所签名的证书导入使用 OpenSSL 的 PKCS12 密码存储库,应该执行如下命令:

openssl pkcs12 -export -in mycert.crt -inkey mykey.key
                       -out mycert.p12 -name tomcat -CAfile myCA.crt
                       -caname root -chain   
编程技术 tomcat https SSL