keytool+tomcat配置HTTPS双向证书认证

来源:互联网 发布:凯洛伦的十字光剑淘宝 编辑:程序博客网 时间:2024/05/07 19:50

本文参照了网上的一些资料,并根据自己的实际配置情况总结如下:


测试环境:


JDK 1.8.0_60
Tomcat 8.0.30
Firefox 43.0.1
Windows 10.0.10586


第零步:确保JDK环境变量配置正确,Tomcat可用后,打开cmd,定位到你要生成keystore的路径(以d盘根目录为例)


第一步:为服务器生成证书


使用keytool为Tomcat生成证书,以“localhost”为例,即keystore文件存放在“D:\server.keystore”,口令为“PASSWORD”,有两种方式可以实现:


方法一:

keytool -genkey -v -alias Server -keyalg RSA -keystore server.keystore


控制台全屏复制如下:
D:\>keytool -genkey -v -alias Server -keyalg RSA -keystore server.keystore
输入密钥库口令:PASSWORD(实际控制台是不可见的)
再次输入新口令:PASSWORD(实际控制台是不可见的)
您的名字与姓氏是什么?
  [Unknown]:  localhost
您的组织单位名称是什么?
  [Unknown]:  ryan
您的组织名称是什么?
  [Unknown]:  ryan
您所在的城市或区域名称是什么?
  [Unknown]:  cq
您所在的省/市/自治区名称是什么?
  [Unknown]:  cq
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=localhost, OU=ryan, O=ryan, L=cq, ST=cq, C=cn是否正确?
  [否]:  y


正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 90 天):
         CN=localhost, OU=ryan, O=ryan, L=cq, ST=cq, C=cn
输入 <Server> 的密钥口令
        (如果和密钥库口令相同, 按回车):(直接回车)
[正在存储server.keystore]


方法二:

keytool -genkey -keystore server.keystore -alias Server -storepass PASSWORD -keyalg RSA

如果Tomcat所在服务器的域名不是“localhost”,应改为对应的域名,如“www.sina.com.cn”,否则浏览器会弹出警告窗口,提示用户证书与所在域不匹配。

在本地做开发测试时,应填入“localhost”


控制台全屏复制如下:

D:\>keytool -genkey -keystore server.keystore -alias Server -storepass PASSWORD -keyalg RSA
您的名字与姓氏是什么?
  [Unknown]:  localhost ---- 这里必须与与域名相同(如果Tomcat所在服务器的域名不是“localhost”,应改为对应的域名,如“www.sina.com.cn”)
您的组织单位名称是什么?
  [Unknown]:  ryan
您的组织名称是什么?
  [Unknown]:  ryan
您所在的城市或区域名称是什么?
  [Unknown]:  cq
您所在的省/市/自治区名称是什么?
  [Unknown]:  cq
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=localhost, OU=ryan, O=ryan, L=cq, ST=cq, C=cn是否正确?
  [否]:  y


输入 <Server> 的密钥口令
        (如果和密钥库口令相同, 按回车):(直接回车)


第二步:为客户端生成证书


下一步是为浏览器生成证书,以便让服务器来验证它。为了能将证书顺利导入至IE和Firefox,证书格式应该是PKCS12,因此,使用如下命令生成:

keytool -genkey -keystore cert.p12 -alias iekey -storepass PASSWORD -keyalg RSA -storetype PKCS12


控制台全屏复制如下:

D:\>keytool -genkey -keystore cert.p12 -alias iekey -storepass PASSWORD -keyalg RSA -storetype PKCS12
您的名字与姓氏是什么?
  [Unknown]:  myCert
您的组织单位名称是什么?
  [Unknown]:  ryan
您的组织名称是什么?
  [Unknown]:  ryan
您所在的城市或区域名称是什么?
  [Unknown]:  cq
您所在的省/市/自治区名称是什么?
  [Unknown]:  cq
该单位的双字母国家/地区代码是什么?
  [Unknown]:  cn
CN=myCert, OU=ryan, O=ryan, L=cq, ST=cq, C=cn是否正确?
  [否]:  y

 
对应的证书库存放在“D:/cert.p12”,客户端的CN可以是任意值。稍候,我们将把这个“my.p12”证书库导入到IE和Firefox中。


第三步:让服务器信任客户端证书


由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:


keytool -export -file cert.cer -keystore cert.p12 -alias iekey -storepass PASSWORD  -storetype PKCS12 -rfc


通过以上命令,客户端证书就被我们导出到“D:/cert.cer”文件了。下一步,是将该文件导入到服务器的证书库,添加为一个信任证书:

keytool -import -v -file cert.cer -keystore server.keystore

通过list命令查看服务器的证书库,我们可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书:

keytool -list -keystore server.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="D:/Tomcat 6.0/SSLkey/server.keystore" keystorePass="PASSWORD"
    truststoreFile="D:/Tomcat 6.0/SSLkey/server.keystore" truststorePass="PASSWORD"
/>


第五步:导入客户端证书


如果设置了clientAuth="true",则需要强制验证客户端证书。双击“C:/iecert.p12”即可将证书导入至IE:
p12 证书直接双击然后按提示下一步就可导入。

配置中我遇到的问题:
按常规配置方式 在 server.xml里添加如下 配置 :
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
                maxThreads="150" scheme="https" secure="true"
                keystoreFile="conf/cnzz.freeca.cn.jks" keystorePass="123"

                clientAuth="false" sslProtocol="TLS" />


启动 Tomcat ,会发现443端口无法正式启动下面是启动日志:


2011-12-29 10:10:49 Commons Daemon procrun stderr initialized
2011-12-29 10:10:50 org.apache.catalina.core.AprLifecycleListener init
信息: Loaded APR based Apache Tomcat Native library 1.1.20.
2011-12-29 10:10:50 org.apache.catalina.core.AprLifecycleListener init
信息: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2011-12-29 10:10:52 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-apr-80"]
2011-12-29 10:10:52 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["ajp-apr-8009"]
2011-12-29 10:10:52 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-apr-443"]
2011-12-29 10:10:52 org.apache.coyote.AbstractProtocol init
严重: Failed to initialize end point associated with ProtocolHandler ["http-apr-443"]
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:469)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:490)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:364)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:910)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:781)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
at org.apache.catalina.startup.Catalina.load(Catalina.java:572)
at org.apache.catalina.startup.Catalina.load(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:262)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:430)
2011-12-29 10:10:52 org.apache.catalina.core.StandardService initInternal
严重: Failed to initialize connector [Connector[HTTP/1.1-443]]
org.apache.catalina.LifecycleException: Protocol handler initialization failed
at org.apache.catalina.connector.Connector.initInternal(Connector.java:912)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
at org.apache.catalina.core.StandardService.initInternal(StandardService.java:559)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:781)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:101)
at org.apache.catalina.startup.Catalina.load(Catalina.java:572)
at org.apache.catalina.startup.Catalina.load(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:262)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:430)
Caused by: java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:469)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:490)
at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:364)
at org.apache.catalina.connector.Connector.initInternal(Connector.java:910)
... 13 more
2011-12-29 10:10:52 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 2268 ms
2011-12-29 10:10:52 org.apache.catalina.core.StandardService startInternal
信息: Starting service Catalina
 

分析:
 
方法:
在 Tomcat 中注释掉 下面的配置:

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 


重新启动 Tomcat ,443已经能正常启动,再看下日志:
2011-12-29 10:30:14 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-bio-80"]
2011-12-29 10:30:14 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["ajp-bio-8009"]
2011-12-29 10:30:14 org.apache.coyote.AbstractProtocol init
信息: Initializing ProtocolHandler ["http-bio-443"]
2011-12-29 10:30:14 org.apache.catalina.startup.Catalina load
信息: Initialization processed in 1300 ms
2011-12-29 10:30:14 org.apache.catalina.core.StandardService startInternal
信息: Starting service Catalina
2011-12-29 10:30:14 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.16
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾驶证忘了年检怎么办 驾照快要到期了怎么办 驾照过期90天怎么办 异地驾迁回本地怎么办 驾照外地转本地怎么办 车转回老家保险怎么办 考驾照一直不过怎么办 驾照2年没考出来怎么办 驾考体检色盲怎么办 杭州居住告知单怎么办 郑州有房怎么办暂住证 郑州买车怎么办暂住证 在青岛办暂住证怎么办 异地买车暂住证怎么办 广州暂住证过期了怎么办 杭州暂住证过期了怎么办 居住卡到期了怎么办 居住卡过期了怎么办 在合肥办暂住证怎么办 在西安办暂住证怎么办 杭州没办暂住证怎么办 暂住证超过2月怎么办 机动车大本丢了怎么办 北京老年卡2018怎么办 暂住卡过期了怎么办 我暂住证过期了怎么办 我没租房怎么办暂住证 孩子异地入学籍怎么办 孩子入不了学籍怎么办 常州没有暂住证怎么办牌照 东莞居住证过期了怎么办 杭州告知单过期怎么办 杭州暂住证到期了怎么办 在杭州租房怎么办暂住证 杭州暂住证丢了怎么办 在宾馆住怎么办暂住证 上海学车暂住证怎么办 环保车贴丢了怎么办 交通事故交警不处理怎么办 哈尔滨冰雪大世界夏天怎么办 下围棋没天赋怎么办