论坛首页 Java企业应用论坛

数字认证的迷惑

浏览 32941 次
精华帖 (0) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-27  
grandboy 写道
你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true".
2. 为你的connector设置truststore, 如果不设置这个,就必须要把证书导入到jre的cacerts里。

因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里的ca来验证你的客户端证书的有效性(当然这个浏览器就可以做了),如此证书有效,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。

双向认证和单向认证有什么区别呢?
0 请登录后投票
   发表时间:2009-08-31  
1.客户端的IE是否导入了身份证书?否则怎么提示没有可选证书
2.插件应该是IE自带的
0 请登录后投票
   发表时间:2009-09-01  
期待LZ早日总结文章,谢谢!
0 请登录后投票
   发表时间:2009-09-29  
grandboy 写道
ximencf 写道
我说下我的整个过程,看看在哪里还是有错。

1.生成CA证书。目前不使用第三方权威机构的CA来认证,自己充当CA的角色。
1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650
4.将证书导出成浏览器支持的.p12格式(导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12
2.生成server证书。
1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 (导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12 
3.生成client证书。
1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式(导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12
4.根据root证书生成jks文件
C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks

<connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443"
sslenabled="true" maxhttpheadersize="8192" maxthreads="150"
minsparethreads="25" maxsparethreads="75" enablelookups="false"
disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS"
clientauth="true" keystorefile="server.p12"
keystoretype="PKCS12" keystorepass="123456" truststorefile="root.jks"
truststoretype="JKS" truststorepass="123456"/>

root.p12,client.p12分别导入到IE中

这样子,在启动tomcat的时候就会报invlidate keystore format错误,即认为keystore的类型是不正确,我已经指定了其为PKCS12类型的啊,同时,我也希望实现双向认证。


你的过程基本上没有问题,虽然有些地方不是必要的。但是本来应该成功的。你之所以没有成功,应该有以下几点你需要注意的:

1. 第一个问题,
引用
4.根据root证书生成jks文件
C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks
你这里生成jks时用的storepass口令是ximencf, 而且配置tomcat的时候,你用的是什么?是123456。

2. xml文件是区分大小写的,你写在server.xml里的内容有些是通过MBean赋值到tomcat的javabean里的,如果你大小写搞错了,他也无法认识。举例:如keystoreFile如果你写成keystorefile, tomcat就不知道这个文件在哪里,因为你指定的文件路径并没有通过MBean赋值到Tomcat里的javabean。当然,这很有可能是你的拷贝的时候或者javaeye的editor的问题,我只是说一下,防止以后还有人犯这样的错误。

3. 最后一点就是文件的路径,如果像你那样没有指定路径的话,tomcat会到根目录下去找文件,如果文件不是放在根目录下,也是找不到的。

希望你这次成功。

 

我照着这个方式设置后可以访问https://localhost:8443,然后配置cas,方式如下:

编辑tomcat5.0.28\webapps\servlets-examples\WEB-INF下的web.xml文件,添加如下信息:

引用

<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
<init-param>
  <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
  <param-value>https://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
  <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
  <param-value>https://localhost:8443/cas/serviceValidate</param-value>
</init-param>
<init-param>
  <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
  <param-value>localhost:8443</param-value>
</init-param>
</filter>

引用

<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/servlet/HelloWorldExample</url-pattern>
</filter-mapping>


 

拷贝casclient.jar文件到目录webapps\servlets-examples\WEB-INF\lib下。
拷贝cas.warwebapps目录下.

重新启动tomcat,能够顺利跳转到cas的登录页面,输入用户名和密码后(默认二者相同),结果出现了如下错误:

edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator [[edu.yale.its.tp.cas.client.ProxyTicketValidator proxyList=[null] [edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl=[https://localhost:8080/cas/proxyValidate] ticket=[ST-1-Tu3SjVTV7yIeG9y576a4] service=[https%3A%2F%2Flocalhost%3A8443%2Fservlets-examples%2F] renew=false]]]
	at edu.yale.its.tp.cas.client.CASReceipt.getReceipt(CASReceipt.java:52)
	at edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:455)
	at edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:378)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
	at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
	at java.lang.Thread.run(Thread.java:595)
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:742)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1057)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1041)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:938)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
	at edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:84)
	at edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212)
	at edu.yale.its.tp.cas.client.CASReceipt.getReceipt(CASReceipt.java:50)
	... 28 more
Caused by: java.io.EOFException: SSL peer shut down incorrectly
	at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:333)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:723)
	... 38 more

 请问这是哪里出了问题了啊?

 

0 请登录后投票
   发表时间:2009-09-29  
cas validateUrl要配置为域名,并且这个域名要跟cas的证书的机构标识一致。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics