之前由于工作需要,项目需要从HTTP改成了HTTPS,配置过程也很简单,下面是详细步骤.
1. 生成证书
1.1生成服务端证书 开始在jre的bin目录下启动dos窗口执行下执行命令: keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 18000 按照提示输入密码名称等参数 说明:keytool 是JDK提供的证书生成工具,所有参数的用法参见keytool –help -genkey 创建新证书 -v 详细信息 -alias tomcat 以”tomcat”作为该证书的别名。这里可以根据需要修改 -keyalg RSA 指定算法 -keystore D:/tomcat.keystore 保存路径及文件名 -dname "CN=127.0.0.1,OU=,O=,L=,ST=,C=CN" 证书发行者身份,这里的CN要与发布后的访问域名一致,其他参数都可以忽略。由于是自己发行的证书,在浏览器访问,仍然会有警告提示。 -validity 18000证书有效期,单位为天 -storepass admin123 证书的存取密码 -keypass admin123 证书的私钥 1.2 生成客户端证书 执行命令:keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:/client.p12 -validity 18000 同样根据提示输入密码等参数. 说明:参数说明同上。这里的-dname 证书发行者身份可以和前面不同,到目前为止,这2个证书可以没有任何关系。下面要做的工作才是建立2者之间的信任关系。 1.3 导出客户端证书 执行命令:keytool -export -alias client -keystore D:/client.p12 -storetype PKCS12 -storepass admin123 -rfc -file D:/client.cer 说明:-export 执行导出 -file 导出文件的文件路径 1.4 把客户端证书加入服务端证书信任列表 执行命令:keytool -import -alias client -v -file D:/client.cer -keystore D:/tomcat.keystore -storepass admin123 说明:参数说明同前。这里提供的密码是服务端证书的存取密码。 1.5 导出服务端证书 执行命令:keytool -export -alias tomcat -keystore D:/tomcat.keystore -storepass admin123 -rfc -file D:/tomcat.cer 说明:把服务端证书导出。这里提供的密码也是服务端证书的密码。 1.6 生成客户端信任列表 执行命令:keytool -import -file D:/tomcat.cer -storepass admin123 -keystore D:/client.truststore -alias tomcat -noprompt通过list命令查看服务器的证书库 keytool -list -v -keystore bsm.keystore
2.Tomcat配置
2.1修改conf/server.xml文件,找到对应的段落修改成以下 <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" /> <!-- tomcat7配置 --> <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="D:/tomcat.keystore" keystorePass="admin123" truststoreFile="D:/tomcat.keystore" truststorePass="admin123"/> <!-- tomcat9配置 --> <Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="443" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="./keystore/tomcat.keystore" keystorePass="CloudSino" keyAlias="tomcat" clientAuth="false" sslProtocol="TLS"/> clientAuth="true" 指定了双向证书认证 keyAlias="tomcat" 为证书的别名(生成证书时别名不是tomcat时需要指定)<Connector port="8009" protocol="AJP/1.3" redirectPort="443" />
2.2修改Tomcat 下conf/web.xml文件, 在</welcome-file-list>后面加入下面的节点,让服务器强制使用https(需要强转才加).
<login-config> <!-- Authorization setting for SSL --> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name> </login-config> <security-constraint> <!-- Authorization setting for SSL --> <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> 2.3 改成HTTPS连接后原来服务器上面的接口将无法访问,解决方法是在接口访问之前加入以下几句代码或者修改JVM启动参数(加入以下几个参数)双向认证:
System.setProperty("javax.net.ssl.trustStore", "D:/client.truststore"); System.setProperty("javax.net.ssl.trustStorePassword","admin123"); System.setProperty("javax.net.ssl.keyStoreType","PKCS12"); System.setProperty("javax.net.ssl.keyStore","D:/client.p12"); System.setProperty("javax.net.ssl.keyStorePassword","admin123"); 单向认证: System.setProperty("javax.net.ssl.trustStore", "D:/client.truststore");