锁定老帖子 主题:数字认证的迷惑
精华帖 (0) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-27
grandboy 写道 你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true". 2. 为你的connector设置truststore, 如果不设置这个,就必须要把证书导入到jre的cacerts里。 因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里的ca来验证你的客户端证书的有效性(当然这个浏览器就可以做了),如此证书有效,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。 双向认证和单向认证有什么区别呢? |
|
返回顶楼 | |
发表时间:2009-08-31
1.客户端的IE是否导入了身份证书?否则怎么提示没有可选证书
2.插件应该是IE自带的 |
|
返回顶楼 | |
发表时间:2009-09-01
期待LZ早日总结文章,谢谢!
|
|
返回顶楼 | |
发表时间: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文件
你这里生成jks时用的storepass口令是ximencf, 而且配置tomcat的时候,你用的是什么?是123456。 C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks 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-mapping>
拷贝casclient.jar文件到目录webapps\servlets-examples\WEB-INF\lib下。 重新启动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 请问这是哪里出了问题了啊?
|
|
返回顶楼 | |
发表时间:2009-09-29
cas validateUrl要配置为域名,并且这个域名要跟cas的证书的机构标识一致。
|
|
返回顶楼 | |