tomcat8配置HTTPS,简单webservice客户端调用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Tomat8配置HTTPS 一.环境:
Jdk1.8
Tomcat8.0.22
二.步骤:
1,创建证书:
首先建立目录,例如:d:/keys
然后利用jdk的keytool工具生成证书
d:\keys>keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey.keystore
具体的输入项图片中都有说明,有一点我要解释一下;在输入完密码后提示输入域名是我输入的是,其实这个域名是不存在的,但是我为了演示所以虚拟了这个域名,技巧在于修改
C:\Windows\System32\drivers\etc\hosts
添加内容如下:
127.0.0.1
这样在访问的时候其实是访问的127.0.0.1也就是本机
严重提醒:提示输入域名的时候不能输入IP地址
2,导出证书:
d:\keys>keytool -export -file d:/keys/wsria.crt -alias wsria -keystore
d:/keys/wsriakey.keystore
3,为客户端的JVM导入证书(目前没觉得这步有什么用)d:\keys>keytool -import -alias kk -keystore "D:\Program
Files\Java\jdk1.8.0_45\jre\lib\security\cacerts" -file D:/keys/wsria.crt
此处输入的口令是:changeit
4、应用证书到Web服务器-Tomcat
打开tomcat目录的conf/server.xml文件,开启83和87行的注释代码,并设置keystoreFile、keystorePass修改结果如下:注意大小写
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true"
scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:/keys/wsriakey.keystore"
keystorePass="123456"/>
到此Tomcat的SSL启用完成,现在你可以启动tomcat试一下了
http://192.168.5.16:8443/
---------------------------------------------------------------------------------------------------------------------- 以下是另一个方法,由于配置过程中出错,没有详细研究,不过觉得这个方法讲的比较详细,暂且在这里列出来,留作以后研究(webservice部分还是挺有用的)
环境
Jdk1.6 Tomcat6 jax-ws webservice
1生成证书
这里用到的文件,我们存放在D:/SSL/文件夹内,其中D:/SSL/server/内的文件是要交给服务器用的,D:/SSL/client/内的文件是要交给客户端用的。
1.1生成服务端证书
开始-运行-CMD-在dos窗口执行下执行命令:
keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:/SSL/server/tomcat.keystore
-dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" -validity 3650
-storepass zljzlj -keypass zljzlj
说明:
keytool 是JDK提供的证书生成工具,所有参数的用法参见keytool –help
-genkey 创建新证书
-v 详细信息
-alias tomcat 以”tomcat”作为该证书的别名。
这里可以根据需要修改
-keyalg RSA 指定算法
-keystore D:/SSL/server/tomcat.keystore 保存路径及文件名
-dname "CN=127.0.0.1,OU=zlj,O=zlj,L=Peking,ST=Peking,C=CN" 证书发行者身份,这里的CN要与发布后的访问域名一致。
但由于我们是自己发行的证书,如果在浏览器访问,仍然会有警告提示。
-validity 3650证书有效期,单位为天
-storepass zljzlj 证书的存取密码
-keypass zljzlj 证书的私钥
注意:上面标红的部分“CN=127.0.0.1”,参照前面文档
本人输入ip地址生成证书后,再用webservice 客户端调用的时候确实会报错,而且纠结了我一天
1.2 生成客户端证书
执行命令:
keytool ‐genkey ‐v ‐alias client ‐keyalg RSA ‐storetype PKCS12 ‐keystore
D:/SSL/client/client.p12 ‐dname "CN=client,OU=zlj,O=zlj,L=bj,ST=bj,C=CN" ‐validity 3650 ‐storepass client ‐keypass client
说明:
参数说明同上。
这里的-dname 证书发行者身份可以和前面不同,到目前为止,这2个证书可以没有任何关系。
下面要做的工作才是建立2者之间的信任关系。
1.3 导出客户端证书
执行命令:
keytool ‐export ‐alias client ‐keystore D:/SSL/client/client.p12 ‐storetype PKCS12 ‐storepass client ‐rfc ‐file D:/SSL/client/client.cer
说明:
-export 执行导出
-file 导出文件的文件路径
1.4 把客户端证书加入服务端证书信任列表
执行命令:
keytool ‐import ‐alias client ‐v ‐file D:/SSL/client/client.cer ‐keystore
D:/SSL/server/tomcat.keystore ‐storepass zljzl
说明:
参数说明同前。
这里提供的密码是服务端证书的存取密码。
1.5 导出服务端证书
执行命令:
keytool -export -alias tomcat -keystore D:/SSL/server/tomcat.keystore -storepass zljzlj -rfc -file D:/SSL/server/tomcat.cer
说明:
把服务端证书导出。
这里提供的密码也是服务端证书的密码。
1.6 生成客户端信任列表
执行命令:
keytool -import -file D:/SSL/server/tomcat.cer -storepass zljzlj -keystore
D:/SSL/client/client.truststore -alias tomcat –noprompt
说明:
让客户端信任服务端证书
2. 配置服务端为只允许HTTPS连接
2.1 配置Tomcat 目录下的/conf/server.xml
Xml代码收藏代码
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true" clientAuth="true"
sslProtocol="TLS" keystoreFile="D:/SSL/server/tomcat.keystore"
keystorePass="zljzlj" truststoreFile="D:/SSL/server/tomcat.keystore"
truststorePass="zljzlj" />
说明:
在server.xml里面这段内容本来是被注释掉的,如果想使用https的默认端口443,请修改这里的port参数。
其中的clientAuth="true" 指定了双向证书认证。
2.2 配置服务端项目web.xml
在<welcome-file-list>之后增加:
Xml代码收藏代码
<!-- 强制SSL配置,即普通的请求也会重定向为SSL请求-->
<security-constraint>
<web-resource-collection>
<web-resource-name>SSL</web-resource-name>
<url-pattern>/service/*</url-pattern><!-- 全站使用SSL
<url-pattern>/*</url-pattern>-->
</web-resource-collection>
<user-data-constraint>
<description>SSL required</description>
<!-- CONFIDENTIAL: 要保证服务器和客户端之间传输的数据不能够被修改,且不能被第三方查看到-->
<!-- INTEGRAL: 要保证服务器和client之间传输的数据不能够被修改-->
<!-- NONE: 指示容器必须能够在任一的连接上提供数据。
(即用HTTP 或HTTPS,由客户端来决定)-->
<transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint>
</security-constraint>
说明:
这里限制了WEB service服务地址的访问必须为https连接。
<url-pattern>要根据你的web service服务地址配置。
3. 修改客户端代码
在执行访问之前,增加:
Java代码收藏代码
System.setProperty(".ssl.trustStore", "D:/SSL/client/client.truststore");
System.setProperty(".ssl.trustStorePassword","zljzlj");
System.setProperty(".ssl.keyStoreType","PKCS12") ;
System.setProperty(".ssl.keyStore","D:/SSL/client/client.p12") ;
System.setProperty(".ssl.keyStorePassword","client") ;
String endPoint="https://127.0.0.1:8443/easbCut/services/ApplyFormService";
...
通过设置参数来指定客户端连接时所使用的客户端证书,这里还可以采用修改JVM启动参数的的方式来执行,但出于不影响其他功能的考虑,这里采用System.setProperty的方式来设置这些参数,在使用结束后,可以还原这些参数配置。
做为客户端的开发者,可以把拿到的证书文件后,只执行步骤3。