SSL简单介绍
SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改。
1.怎样保障数据传输安全?
客户端和服务器端在进行握手(客户端和服务器建立连接和交换参数的过程称之为握手)时会产生一个“对话密钥”(session key),用来加密接下来的数据传输,解密时也是用的这个“对话密钥”,而这个“对话密钥”只有客户端和服务器端知道。也就是说只要这个“对话密钥”不被破解,就能保证安全。
2. 客户端证书和服务器端证书
客户端证书和服务器端证书用于证明自己的身份,就好比每个人都有一张身份证,这种身份证是唯一的。一般来说,只要有服务器端的证书就可以了,但是有时需要客户端提供自己的证书,已证明其身份。
Keytool
Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)-密钥(secret key)或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)-只包含公钥。下面就来看看利用keytools为tomcat 7配置ssl双向认证的详细过程吧。
第一、证书库、证书等生成
1、生成服务器证书库
1
|
keytool -validity 36500 -genkey -v -alias tomcat_server -keyalg RSA -keystore tomcat_server.keystore -dname "CN=127.0.0.1,OU=,O=,L=,ST=,c=" -storepass 123456 -keypass 123456
|
- -validity 36500 有效期,以天为单位
- CN 这项一定是服务器的域名或者IP地址
- OU 组织单位
- O 组织
- L 区域
- ST 州/省份
- C 国家
2、客户端证书
1
|
keytool -validity 36500 -genkeypair -v -alias testclient -keyalg RSA -storetype PKCS12 -keystore testclient.p12 -dname "CN=testclient,OU=,O=,L=,ST=,c=" -storepass 123456
|
-storetype PKCS12 主要是为了将证书导入IE/firefox 中。
将生成的证书导入IE中。
3、将客户端证书导入服务器端证书库
服务器端证书不识别 p12格式的证书,需要从客户端证书导出 CER格式证书,然后将CER格式证书导入到服务器端证书中。
1
|
keytool -export -alias testclient -keystore testclient.p12 -storetype PKCS12 -storepass 123456 -rfc -file testclient.cer
|
然后将client.cer 导入到服务器证书库(使用下面任意一个命令)
1
2
|
keytool - import -v -file testclient.cer -keystore tomcat_server.keystore -storepass 123456
keytool - import -alias testclient -v -file testclient.cer -keystore tomcat_server.keystore -storepass 123456
|
注意:这里的别名,如果不加别名,则默认别名则是 mykey,所以见到mykey 请不要吃惊。
4、从服务器证书库导出服务器证书
1
|
keytool -export -alias tomcat_server -keystore tomcat_server.keystore -storepass 123456 -rfc -file tomcat_server.cer
|
该证书可以导入浏览器中,让客户端信任服务器证书。不导入也不影响使用,但浏览器会不信任服务器证书,会提示错误信息。
5、查看证书库中的所有证书
1
|
keytool -list -keystore tomcat_server.keystore -storepass 123456
|
第二、Tomcat 配置
配置 server.xml
1
2
3
4
5
6
7
|
< Connector port = "8443" protocol = "HTTP/1.1" SSLEnabled = "true"
maxThreads = "150" scheme = "https" secure = "true"
keystoreFile = "D:\\dev\\tomcat-https\\note\\tomcat_server.keystore"
keystorePass = "123456"
truststoreFile = "D:\\dev\\tomcat-https\\note\\tomcat_server.keystore"
truststorePass = "123456"
clientAuth = "true" sslProtocol = "TLS" />
|
启动tomcat 就可以了。
问题
如果启动时报如下错误:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-apr-8443"]
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:507)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:981)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102)
at org.apache.catalina.startup.Catalina.load(Catalina.java:640)
at org.apache.catalina.startup.Catalina.load(Catalina.java:665)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
|
则是由于Tomcat中的SSL采用了 APR来实现的,关于SSL的实现,Tomcat提供了两种:JSSE和APR,如果安装了 APR,则优先选择APR作为实现。
APR的ssh配置需要通OpenSSH来进行配置。这在 server.xml 中有说明:
1
2
|
Define a SSL HTTP/1.1 Connector on port 8443
This connector uses the JSSE configuration, when using APR, the connector should be using the OpenSSL style configuration described in the APR documentation
|
那么避免采用 APR呢? 有两种方法,
1,将 protocol=”HTTP/1.1” 修改为 protocol=”org.apache.coyote.http11.Http11Protocol”
2,在windows 下,可以将 bin 目录下的 tcnative-1.dll 删掉。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。