1.获取证书和配置tomcat
java-jdk提供一个简单的制作证书的工具,你可以用它来产生一个证书做测试用:
1.先来到你的jdk/bin下2.执行
keytool -genkey -alias tomcat -keyalg RSA -keystore F:\tomcat.keystore -validity 36500
其中F:\tomcat.keystore表示保存到你的F盘下文件名为tomcat.keystore,365表示1年,36500表示100年
如下:
A、输入keystore密码:此处需要输入大于6个字符的字符串
B、“您的名字与姓氏是什么?”这是必填项,并且必须是TOMCAT部署主机的域名或者IP[如:gbcom.com 或者 10.1.25.251],就是你将来要在浏览器中输入的访问地址
C、“你的组织单位名称是什么?”、“您的组织名称是什么?”、“您所在城市或区域名称是什么?”、“您所在的州或者省份名称是什么?”、“该单位的两字母国家代码是什么?”可以按照需要填写也可以不填写直接回车,在系统询问“正确吗?”时,对照输入信息,如果符合要求则使用键盘输入字母“y”,否则输入“n”重新填写上面的信息
D、输入<tomcat>的主密码,这项较为重要,会在tomcat配置文件中使用,建议输入与keystore的密码一致,设置其它密码也可以
3.完成后在对应的地址产生证书文件
4.配置你的Tomcat
找到你的tomcat/conf/server.xml,打开修改如下:
1.端口:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
修改如下:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
注意端口按照你的实际情况修改。2.查找原有connector注释项,去掉注释:
<span style="white-space:pre"> </span><Connector port="443"
protocol="HTTP/1.1"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
ciphers="TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLS_ECDHE_RSA_WITH_RC4_128_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_RSA_WITH_RC4_128_SHA,
TLS_RSA_WITH_RC4_128_MD5"
keystoreFile="/etc/tomcat.keystore"
keystorePass="www.gbcom.com.cn"/>
keystoreFile是你的证书文件地址
keystorePass是你生成证书时设置的密码
这里看一下,java1.6和之前的版本只支持TLSv1,所以就不要配置什么sslEnabledProtocols=“...”了,配了只会出错。
java1.7开始支持TLS1.2了但是需要修改配置,你才能正常开启TLS1.2,这里tomcat好像必须是tomcat7了,具体我没有测试
如下:
第一步:
<span style="white-space:pre"> </span><Connector port="443"
protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150"
SSLEnabled="true"
scheme="https"
secure="true"
keystoreFile="ssl/.keystore"
keystorePass="changeit"
clientAuth="false"
sslProtocol="SSL"
ciphers="TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
TLS_ECDHE_RSA_WITH_RC4_128_SHA,
TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_AES_128_GCM_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_CBC_SHA,
TLS_RSA_WITH_3DES_EDE_CBC_SHA,
TLS_RSA_WITH_RC4_128_SHA,
TLS_RSA_WITH_RC4_128_MD5"
sslEnabledProtocols="TLSv1.2" />
第二步:
修改tomcat/bin下的classpath.bat添加:
<span style="white-space:pre"> </span>set JAVA_HOME=C:\Java64\jdk1.8.0_60
set PATH=%PATH%;C:\Java64\jdk1.8.0_60\bin
set CATALINA_HOME=C:\apache-tomcat-7.0.64-64bit
set JAVA_OPTS=-Djdk.tls.client.protocols="TLSv1.2" -Dsun.security.ssl.allowUnsafeRenegotiation=false -Dhttps.protocols="TLSv1.2"
主要是最后一句要加。
3.修改APR:
找到对应的注释,去掉注释,修改为:
<span style="white-space:pre"> </span><Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="443" />
5.最后一步,强制访问为https。
修改你的项目下的web.xml
添加:
<web-app>
<span style="white-space:pre"> </span>......
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
</web-app>
6.为客户端生成证书
下一步是为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:
keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore c:\my.p12
对应的证书库存放在“C:\my.p12”,客户端的CN可以是任意值。稍候,我们将把这个“my.p12”证书库导入到IE和Firefox中。
让服务器信任客户端证书
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:
keytool -export -alias mykey -keystore my.p12 -store PKCS12 -storepass password -rfc -file c:\my.cer
通过以上命令,客户端证书就被我们导出到“C:\my.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:
keytool -import -v -file my.cer -keystore tomcat.keystore
通过list命令查看服务器的证书库,我们可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书:
keytool -list -keystore tomcat.keystore
配置Tomcat服务器
打开Tomcat根目录下的/conf/server.xml,找到如下配置段,修改如下:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="C:/tomcat.keystore" keystorePass="password"
truststoreFile="C:/tomcat.keystore" truststorePass="password"
/>
导入客户端证书
如果设置了clientAuth="true",则需要强制验证客户端证书。双击“C:\my.p12”即可将证书导入至IE:
p12 证书直接双击然后按提示下一步就可导入。
调试阶段问题汇总:
1.tomcat配置ssl后启动成功点击tomcat下logs文件夹中的catalina.yyyy-MM-dd.log文件提示如下错误
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
Tomcat提供了两个SSL实现,一个是JSSE实现,另一个是APR实现。Tomcat将自动选择使用哪个实现,即如果安装了APR则自动选择APR,否则选择JSSE。如果不希望让Tomcat自动选择,而是我们自己指定一个实现则可通过protocol定义
1.查看bin文件夹下是否从在tcnative-1.dll,如果没有则只支持JSSE实现,
2.如果报错可以修改server.xml
<
Connector port="8443"
protocol="org.apache.coyote.http11.Http11Protocol"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="${user.home}/.keystore"
keystorePass="pass"
/>
2.对称与非对称加密;SSL;HTTPS;AJP
1.对称加密就是加密与解密的时候都是用一个密码
2.非对称加密,有一对密码A,B;用A加密就得用B解密,相对的用B加密就得用A解密
3.公钥与私钥,这一对密码,随便拿一个公布出去,那个就是公钥,剩下一个是私钥。
4.应用1:我想给一个人发信息,我就去拿他公布出来的公钥加密,加密后就只能用私钥来解密,由于私钥在他手中,就能很好在传输中保密。
5.应用2:我收到一个信息,说是银行发来的账单,银行为了不被别人冒牌货发假信息给客户,事先给客户说好,我给你发信息是我的私钥加密了的,所以客户到了信息就要去拿公钥来解密,如果能解开说明的确是银行发的。
6.非对称加密最常用的算法是RSA算法,基本理论是两个大素数相乘容易,再要想把乘积分解开就很难。
7.SSL协议利用了公钥和私钥的原理,位于TCP/IP协议与各种应用层协议之间,有一些安全握手的过程,为数据通讯提供安全支持。
8.HTTPS就应用了SSL层,http层,tcp/ip层之间又加入了ssl层。默认端口是443
9.今天在配置tomcat的server.xml的时候看见了8009这个connector的配置,用的AJP协议。查了一些,大致是用来和其他http服务器联合使用的一个入口。有的服务器静态资源的响应要比tomcat效率好,比如apache。就可以访问静态资源的走apache。但他不支持j2ee,没有jsp。如果用户像apache发起一个jsp请求,就可以用tomcat提供的一个工具做一个关联映射,由apache再向tomcat发请求来访问jsp。走的就是8009这个端口。AJP用的长连接,使性能更高。
3.<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
tomcat下server.xml打印引用和OS信息
4.java1.6只支持TLSv1,所以,你的设置为SSLProtocol=“TLS”就好了,从1.7开始可以实用sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2" 所以你在配置tomcat/conf/server.xml可以配置这一项。