安全套接字层(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请求中提取主机名之前发生。
Tomcat 能够使用两种 SSL 实现:
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配置文件,如下:
<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 目前只能操作 JKS
、PKCS11
、PKCS12
格式的密钥存储库。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
https://www.leftso.com/article/228.html