利用keytools为tomcat 7配置ssl双向认证的方法
SSL简单介绍
SSL(SecureSocketsLayer安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改。
1.怎样保障数据传输安全?
客户端和服务器端在进行握手(客户端和服务器建立连接和交换参数的过程称之为握手)时会产生一个“对话密钥”(sessionkey),用来加密接下来的数据传输,解密时也是用的这个“对话密钥”,而这个“对话密钥”只有客户端和服务器端知道。也就是说只要这个“对话密钥”不被破解,就能保证安全。
2.客户端证书和服务器端证书
客户端证书和服务器端证书用于证明自己的身份,就好比每个人都有一张身份证,这种身份证是唯一的。一般来说,只要有服务器端的证书就可以了,但是有时需要客户端提供自己的证书,已证明其身份。
Keytool
Keytool是一个Java数据证书的管理工具,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Keyentity)-密钥(secretkey)或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trustedcertificateentries)-只包含公钥。下面就来看看利用keytools为tomcat7配置ssl双向认证的详细过程吧。
第一、证书库、证书等生成
1、生成服务器证书库
keytool-validity36500-genkey-v-aliastomcat_server-keyalgRSA-keystoretomcat_server.keystore-dname"CN=127.0.0.1,OU=,O=,L=,ST=,c="-storepass123456-keypass123456
- -validity36500有效期,以天为单位
- CN这项一定是服务器的域名或者IP地址
- OU组织单位
- O组织
- L区域
- ST州/省份
- C国家
2、客户端证书
keytool-validity36500-genkeypair-v-aliastestclient-keyalgRSA-storetypePKCS12-keystoretestclient.p12-dname"CN=testclient,OU=,O=,L=,ST=,c="-storepass123456
-storetypePKCS12主要是为了将证书导入IE/firefox中。
将生成的证书导入IE中。
3、将客户端证书导入服务器端证书库
服务器端证书不识别p12格式的证书,需要从客户端证书导出CER格式证书,然后将CER格式证书导入到服务器端证书中。
keytool-export-aliastestclient-keystoretestclient.p12-storetypePKCS12-storepass123456-rfc-filetestclient.cer
然后将client.cer导入到服务器证书库(使用下面任意一个命令)
keytool-import-v-filetestclient.cer-keystoretomcat_server.keystore-storepass123456 keytool-import-aliastestclient-v-filetestclient.cer-keystoretomcat_server.keystore-storepass123456
注意:这里的别名,如果不加别名,则默认别名则是mykey,所以见到mykey请不要吃惊。
4、从服务器证书库导出服务器证书
keytool-export-aliastomcat_server-keystoretomcat_server.keystore-storepass123456-rfc-filetomcat_server.cer
该证书可以导入浏览器中,让客户端信任服务器证书。不导入也不影响使用,但浏览器会不信任服务器证书,会提示错误信息。
5、查看证书库中的所有证书
keytool-list-keystoretomcat_server.keystore-storepass123456
第二、Tomcat配置
配置server.xml
<Connectorport="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就可以了。
问题
如果启动时报如下错误:
SEVERE:FailedtoinitializeendpointassociatedwithProtocolHandler["http-apr-8443"] java.lang.Exception:ConnectorattributeSSLCertificateFilemustbedefinedwhenusingSSLwithAPR atorg.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:507) atorg.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:610) atorg.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:429) atorg.apache.catalina.connector.Connector.initInternal(Connector.java:981) atorg.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) atorg.apache.catalina.core.StandardService.initInternal(StandardService.java:559) atorg.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) atorg.apache.catalina.core.StandardServer.initInternal(StandardServer.java:814) atorg.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:102) atorg.apache.catalina.startup.Catalina.load(Catalina.java:640) atorg.apache.catalina.startup.Catalina.load(Catalina.java:665) atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) atjava.lang.reflect.Method.invoke(Method.java:601) atorg.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281) atorg.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
则是由于Tomcat中的SSL采用了APR来实现的,关于SSL的实现,Tomcat提供了两种:JSSE和APR,如果安装了APR,则优先选择APR作为实现。
APR的ssh配置需要通OpenSSH来进行配置。这在server.xml中有说明:
DefineaSSLHTTP/1.1Connectoronport8443 ThisconnectorusestheJSSEconfiguration,whenusingAPR,theconnectorshouldbeusingtheOpenSSLstyleconfigurationdescribedintheAPRdocumentation
那么避免采用APR呢?有两种方法,
1,将protocol=”HTTP/1.1”修改为protocol=”org.apache.coyote.http11.Http11Protocol”
2,在windows下,可以将bin目录下的tcnative-1.dll删掉。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。