- 浏览: 5251 次
- 性别:
- 来自: 南京
最近访客 更多访客>>
最新评论
-
daquan198163:
cas validateUrl要配置为域名,并且这个域名要跟c ...
数字认证的迷惑 -
lwhlwh:
<div class="quote_t ...
数字认证的迷惑 -
tobackfurture:
期待LZ早日总结文章,谢谢!
数字认证的迷惑 -
xingzhaozhong:
1.客户端的IE是否导入了身份证书?否则怎么提示没有可选证书
...
数字认证的迷惑 -
lucky16:
<div class="quote_title ...
数字认证的迷惑
最近新接手做一个数字认证,且自己充当CA中心。在制作出CA,server端证书和client端证书后,在TOMCAT的配置如下: 应用系统中web.xml中如下设置: <!-- Authorization setting for SSL --> CLIENT-CERT Client Cert Users-only Area <!-- Authorization setting for SSL --> SSL /SSL/* CONFIDENTIAL 最后启动服务器,当进入ssl文件的时候,的确有询问数字证书弹出,参见附件1图片。但是这种询问只能说你建立了SSL通道,并没有选择用户的证书,所以 后台在验证用户提交的证书的时候,得到的是空。理论情况下应该是如附件2的样子,弹出对话框,用户可以选择已经安装的证书,提交,然后后台验证用户提交来 的证书。但是就比较困惑这个读取客户端所有证书的插件是如何做出来的?还是说IE里面本有此插件,只需要服务器配置就可以的了。
评论
34 楼
daquan198163
2009-09-29
cas validateUrl要配置为域名,并且这个域名要跟cas的证书的机构标识一致。
33 楼
lwhlwh
2009-09-29
<div class="quote_title">grandboy 写道</div>
<div class="quote_div">
<div class="quote_title">ximencf 写道</div>
<div class="quote_div">我说下我的整个过程,看看在哪里还是有错。 <br><br>1.生成CA证书。目前不使用第三方权威机构的CA来认证,自己充当CA的角色。 <br>1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem <br>3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650 <br>4.将证书导出成浏览器支持的.p12格式(导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12 <br>2.生成server证书。 <br>1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem <br>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 <br>4.将证书导出成浏览器支持的.p12格式 (导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12 <br>3.生成client证书。 <br>1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem <br>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 <br>4.将证书导出成浏览器支持的.p12格式(导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12 <br>4.根据root证书生成jks文件 <br>C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks <br><br><connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443" <br>sslenabled="true" maxhttpheadersize="8192" maxthreads="150" <br>minsparethreads="25" maxsparethreads="75" enablelookups="false" <br>disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS" <br>clientauth="true" keystorefile="server.p12" <br>keystoretype="PKCS12" keystorepass="123456" truststorefile="root.jks" <br>truststoretype="JKS" truststorepass="123456"/> <br><br>root.p12,client.p12分别导入到IE中 <br><br>这样子,在启动tomcat的时候就会报invlidate keystore format错误,即认为keystore的类型是不正确,我已经指定了其为PKCS12类型的啊,同时,我也希望实现双向认证。</div>
<br><br>你的过程基本上没有问题,虽然有些地方不是必要的。但是本来应该成功的。你之所以没有成功,应该有以下几点你需要注意的: <br><br>1. 第一个问题,
<div class="quote_title">引用</div>
<div class="quote_div">4.根据root证书生成jks文件 <br>C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks </div>
你这里生成jks时用的storepass口令是ximencf, 而且配置tomcat的时候,你用的是什么?是123456。 <br><br>2. xml文件是区分大小写的,你写在server.xml里的内容有些是通过MBean赋值到tomcat的javabean里的,如果你大小写搞错了,他也无法认识。举例:如keystoreFile如果你写成keystorefile, tomcat就不知道这个文件在哪里,因为你指定的文件路径并没有通过MBean赋值到Tomcat里的javabean。当然,这很有可能是你的拷贝的时候或者javaeye的editor的问题,我只是说一下,防止以后还有人犯这样的错误。 <br><br>3. 最后一点就是文件的路径,如果像你那样没有指定路径的话,tomcat会到根目录下去找文件,如果文件不是放在根目录下,也是找不到的。 <br><br>希望你这次成功。<img src="/images/smiles/icon_biggrin.gif" alt=""><br>
</div>
<p> </p>
<p>我照着这个方式设置后可以访问<a href="https://localhost:8443">https://localhost:8443</a>,然后配置cas,方式如下:</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="">编辑<span lang="EN-US">tomcat5.0.28\webapps\servlets-examples\WEB-INF</span>下的<span lang="EN-US">web.xml</span>文件,添加如下信息:<span lang="EN-US"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="">引用<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span style=""><filter> <br><filter-name>CAS Filter</filter-name> <br><filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> <br><init-param> <br> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> <br> <param-value>https://localhost:8443/cas/login</param-value> <br></init-param> <br><init-param> <br> <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> <br> <param-value>https://localhost:8443/cas/serviceValidate</param-value> <br></init-param> <br><init-param> <br> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> <br> <param-value>localhost:8443</param-value> <br></init-param> <br></filter></span><span style=""> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; text-align: left;" align="left"><span style="">引用<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style=""><span style="background: #d9d9d9;"><filter-mapping> <br><filter-name>CAS Filter</filter-name> <br><url-pattern>/servlet/HelloWorldExample</url-pattern> <br></filter-mapping> </span></span></p>
<p><span style=""><font style="">
<p><br></p>
</font></span>
</p>
<p> </p>
<p><span style="">拷贝<span lang="EN-US">casclient.jar</span>文件到目录<span lang="EN-US">webapps\servlets-examples\WEB-INF\lib</span>下。<span lang="EN-US"> <br></span>拷贝<span lang="EN-US">cas.war</span>到<span lang="EN-US">webapps</span>目录下.</span></p>
<p><span style="">重新启动tomcat,能够顺利跳转到cas的登录页面,输入用户名和密码后(默认二者相同),结果出现了如下错误:</span></p>
<pre name="code" class="java">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</pre>
<p> 请问这是哪里出了问题了啊?</p>
<p> </p>
<div class="quote_div">
<div class="quote_title">ximencf 写道</div>
<div class="quote_div">我说下我的整个过程,看看在哪里还是有错。 <br><br>1.生成CA证书。目前不使用第三方权威机构的CA来认证,自己充当CA的角色。 <br>1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem <br>3.自签署证书 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650 <br>4.将证书导出成浏览器支持的.p12格式(导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12 <br>2.生成server证书。 <br>1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem <br>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 <br>4.将证书导出成浏览器支持的.p12格式 (导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12 <br>3.生成client证书。 <br>1.创建私钥 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem <br>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 <br>4.将证书导出成浏览器支持的.p12格式(导出密码123456):C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12 <br>4.根据root证书生成jks文件 <br>C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks <br><br><connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443" <br>sslenabled="true" maxhttpheadersize="8192" maxthreads="150" <br>minsparethreads="25" maxsparethreads="75" enablelookups="false" <br>disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS" <br>clientauth="true" keystorefile="server.p12" <br>keystoretype="PKCS12" keystorepass="123456" truststorefile="root.jks" <br>truststoretype="JKS" truststorepass="123456"/> <br><br>root.p12,client.p12分别导入到IE中 <br><br>这样子,在启动tomcat的时候就会报invlidate keystore format错误,即认为keystore的类型是不正确,我已经指定了其为PKCS12类型的啊,同时,我也希望实现双向认证。</div>
<br><br>你的过程基本上没有问题,虽然有些地方不是必要的。但是本来应该成功的。你之所以没有成功,应该有以下几点你需要注意的: <br><br>1. 第一个问题,
<div class="quote_title">引用</div>
<div class="quote_div">4.根据root证书生成jks文件 <br>C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass ximencf -alias root -file root/root-cert.pem -keystore root.jks </div>
你这里生成jks时用的storepass口令是ximencf, 而且配置tomcat的时候,你用的是什么?是123456。 <br><br>2. xml文件是区分大小写的,你写在server.xml里的内容有些是通过MBean赋值到tomcat的javabean里的,如果你大小写搞错了,他也无法认识。举例:如keystoreFile如果你写成keystorefile, tomcat就不知道这个文件在哪里,因为你指定的文件路径并没有通过MBean赋值到Tomcat里的javabean。当然,这很有可能是你的拷贝的时候或者javaeye的editor的问题,我只是说一下,防止以后还有人犯这样的错误。 <br><br>3. 最后一点就是文件的路径,如果像你那样没有指定路径的话,tomcat会到根目录下去找文件,如果文件不是放在根目录下,也是找不到的。 <br><br>希望你这次成功。<img src="/images/smiles/icon_biggrin.gif" alt=""><br>
</div>
<p> </p>
<p>我照着这个方式设置后可以访问<a href="https://localhost:8443">https://localhost:8443</a>,然后配置cas,方式如下:</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="">编辑<span lang="EN-US">tomcat5.0.28\webapps\servlets-examples\WEB-INF</span>下的<span lang="EN-US">web.xml</span>文件,添加如下信息:<span lang="EN-US"> </span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="">引用<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left"><span style=""><filter> <br><filter-name>CAS Filter</filter-name> <br><filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class> <br><init-param> <br> <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name> <br> <param-value>https://localhost:8443/cas/login</param-value> <br></init-param> <br><init-param> <br> <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name> <br> <param-value>https://localhost:8443/cas/serviceValidate</param-value> <br></init-param> <br><init-param> <br> <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name> <br> <param-value>localhost:8443</param-value> <br></init-param> <br></filter></span><span style=""> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; text-align: left;" align="left"><span style="">引用<span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style=""><span style="background: #d9d9d9;"><filter-mapping> <br><filter-name>CAS Filter</filter-name> <br><url-pattern>/servlet/HelloWorldExample</url-pattern> <br></filter-mapping> </span></span></p>
<p><span style=""><font style="">
<p><br></p>
</font></span>
</p>
<p> </p>
<p><span style="">拷贝<span lang="EN-US">casclient.jar</span>文件到目录<span lang="EN-US">webapps\servlets-examples\WEB-INF\lib</span>下。<span lang="EN-US"> <br></span>拷贝<span lang="EN-US">cas.war</span>到<span lang="EN-US">webapps</span>目录下.</span></p>
<p><span style="">重新启动tomcat,能够顺利跳转到cas的登录页面,输入用户名和密码后(默认二者相同),结果出现了如下错误:</span></p>
<pre name="code" class="java">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</pre>
<p> 请问这是哪里出了问题了啊?</p>
<p> </p>
32 楼
tobackfurture
2009-09-01
期待LZ早日总结文章,谢谢!
31 楼
xingzhaozhong
2009-08-31
1.客户端的IE是否导入了身份证书?否则怎么提示没有可选证书
2.插件应该是IE自带的
2.插件应该是IE自带的
30 楼
lucky16
2009-08-27
grandboy 写道
你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true".
2. 为你的connector设置truststore, 如果不设置这个,就必须要把证书导入到jre的cacerts里。
因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里的ca来验证你的客户端证书的有效性(当然这个浏览器就可以做了),如此证书有效,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。
1. clientAuth="true".
2. 为你的connector设置truststore, 如果不设置这个,就必须要把证书导入到jre的cacerts里。
因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里的ca来验证你的客户端证书的有效性(当然这个浏览器就可以做了),如此证书有效,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。
双向认证和单向认证有什么区别呢?
29 楼
问题儿童
2009-08-24
问题在这里
init的两个参数一定要有
SSLContext.init(KeyManagerFactory.getKeyManagers(), TrustManagerFactory.getTrustManagers(), null);
init的两个参数一定要有
28 楼
ximencf
2009-08-23
keytool -import -v -trustcacerts -storepass 123456 -alias rs -file server-cert.pem -keystore root.jks
同时,我不知道你的server是不是也是root签名的还是怎么的?
请参看http://www.iteye.com/topic/120780,这是一个完整的过程。
希望成功,共同学习。
同时,我不知道你的server是不是也是root签名的还是怎么的?
请参看http://www.iteye.com/topic/120780,这是一个完整的过程。
希望成功,共同学习。
27 楼
问题儿童
2009-08-22
问题儿童 写道
期待lz的总结
我也遇到了问题,如下:
我的配置:
.......
请参考一下: http://grandboy.iteye.com/admin/blogs/451768 里面有些在这个帖子里已经提到了,有些没有提到的。没提到的,你自己按照上面的检查一下。另外,提醒你一定注意哪个是SSL的客户端,哪个服务器。如果搞不清楚这个,通常会出一些错误。
希望对你有帮助。
我也遇到了问题,如下:
我的配置:
.......
请参考一下: http://grandboy.iteye.com/admin/blogs/451768 里面有些在这个帖子里已经提到了,有些没有提到的。没提到的,你自己按照上面的检查一下。另外,提醒你一定注意哪个是SSL的客户端,哪个服务器。如果搞不清楚这个,通常会出一些错误。
希望对你有帮助。
hi,grandboy
补充下,我的应用都是在同一个tomcat下
我做了尝试,
openssl x509 -in root-cert.pem -outform DER -out server-cert.cer
keytool -import -keystore root.jks -alias rs -file server-cert.cer -storepass 123456
显然报 了一个路径错误,但我tomcat启动初始化时并无错误,只是在ssl握手的时候错了
难道不是
keystoreFile="cert/server.p12" keystoreType="PKCS12" keystorePass="123456"
truststoreFile="cert/root.jks" truststoreType="JKS" truststorePass="123456"/>
我在server。xml里面指定的吗?
<javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target>
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
26 楼
grandboy
2009-08-20
问题儿童 写道
期待lz的总结
我也遇到了问题,如下:
我的配置:
在in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
这里的时候报错
还望指教
我也遇到了问题,如下:
我的配置:
<Connector protocol="org.apache.coyote.http11.Http11Protocol" secure="true" scheme="https" port="9443" SSLEnabled="true" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" sslProtocol="TLS" clientAuth="true" keystoreFile="cert/server.p12" keystoreType="PKCS12" keystorePass="123456" truststoreFile="cert/root.jks" truststoreType="JKS" truststorePass="123456"/>
public MyX509TrustManager() { try { keyStore = KeyStore.getInstance("JKS"); keyStore.load(new ClassPathResource("root.jks").getInputStream(),"123456".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); TrustManager tms [] = tmf.getTrustManagers(); for (int i = 0; i < tms.length; i++) { if (tms[i] instanceof X509TrustManager) { jSSEX509TrustManager = (X509TrustManager) tms[i]; return; } } } catch (Exception e) { System.out.println(e); }
static SSLSocketFactory ssf = null; static { try { final TrustManager[] tm = { myX509TrustManager }; final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 ssf = sslContext.getSocketFactory(); } catch (Exception e) { e.printStackTrace(); } }
try { final HttpsURLConnection httpsConn = (HttpsURLConnection) validationUrl.openConnection(); httpsConn.setSSLSocketFactory(ssf); in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
在in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
这里的时候报错
<javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate> javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1682) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:932) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
还望指教
请参考一下: http://grandboy.iteye.com/admin/blogs/451768 里面有些在这个帖子里已经提到了,有些没有提到的。没提到的,你自己按照上面的检查一下。另外,提醒你一定注意哪个是SSL的客户端,哪个服务器。如果搞不清楚这个,通常会出一些错误。
希望对你有帮助。
25 楼
问题儿童
2009-08-20
期待lz的总结
我也遇到了问题,如下:
我的配置:
在in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
这里的时候报错
还望指教
我也遇到了问题,如下:
我的配置:
<Connector protocol="org.apache.coyote.http11.Http11Protocol" secure="true" scheme="https" port="9443" SSLEnabled="true" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" sslProtocol="TLS" clientAuth="true" keystoreFile="cert/server.p12" keystoreType="PKCS12" keystorePass="123456" truststoreFile="cert/root.jks" truststoreType="JKS" truststorePass="123456"/>
public MyX509TrustManager() { try { keyStore = KeyStore.getInstance("JKS"); keyStore.load(new ClassPathResource("root.jks").getInputStream(),"123456".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(keyStore); TrustManager tms [] = tmf.getTrustManagers(); for (int i = 0; i < tms.length; i++) { if (tms[i] instanceof X509TrustManager) { jSSEX509TrustManager = (X509TrustManager) tms[i]; return; } } } catch (Exception e) { System.out.println(e); }
static SSLSocketFactory ssf = null; static { try { final TrustManager[] tm = { myX509TrustManager }; final SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 ssf = sslContext.getSocketFactory(); } catch (Exception e) { e.printStackTrace(); } }
try { final HttpsURLConnection httpsConn = (HttpsURLConnection) validationUrl.openConnection(); httpsConn.setSSLSocketFactory(ssf); in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
在in = new BufferedReader(new InputStreamReader(httpsConn.getInputStream()));
这里的时候报错
<javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate> javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1682) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:932) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
还望指教
24 楼
ximencf
2009-08-18
总结的贴,等我这个小东西做完的时候,一起发出来。最近才接触这个,所以认识不是很深刻。但是就如grandboy 所说,上述的所有做法,满足的是一个基于双向的SSL的有效性的校验,至于提醒用户延长证书有效期,或者用户仅凭证书就能登陆等问题,只要客户端能取得到了安装证书的信息,那么这些逻辑判断就不是难事。
23 楼
daquan198163
2009-08-18
我的意思是SSL双向认证中的客户认证这一块,没有实际意义,所以一般都默认采用单向认证。
SSL当然还是靠服务器本身提供。
SSL当然还是靠服务器本身提供。
22 楼
grandboy
2009-08-18
daquan198163 写道
我觉得这个方案虽然能跑,但是基本无法满足实际需要:
首先,客户证书不应该存储在证书库文件,而应该是数据库,以便管理和使用。
第二,现在这种方案是完全依赖应用服务器的能力来做客户认证,这样不仅绑定服务器,而且无法满足应用程序对认证的需求。我猜测这个机制只是保证了合法的用户可以建立https连接,至于https请求进来以后,应用系统还是无法获得用户身份,也就无法做登录认证。
所以我觉得好用的证书认证方案必须要定制,不过也不一定是从零开始,Acegi也就是现在的SpringSecurity提供了一种X509证书登陆的机制,应该就是做这个的。
首先,客户证书不应该存储在证书库文件,而应该是数据库,以便管理和使用。
第二,现在这种方案是完全依赖应用服务器的能力来做客户认证,这样不仅绑定服务器,而且无法满足应用程序对认证的需求。我猜测这个机制只是保证了合法的用户可以建立https连接,至于https请求进来以后,应用系统还是无法获得用户身份,也就无法做登录认证。
所以我觉得好用的证书认证方案必须要定制,不过也不一定是从零开始,Acegi也就是现在的SpringSecurity提供了一种X509证书登陆的机制,应该就是做这个的。
如果是真正的CA的话,一定是要有数据库或者LDAP来做支撑的。因为有SSL标准,大家都按照这个标准来的,其实这就是证书认证的方式。服务器可能实现各有差别的,但是和浏览器通讯都是按照标准来做的,所以不存在绑定服务器的问题。至于用户身份的问题,就是你怎么把客户证书映射到系统用户的问题。服务器能取到证书了,这个应该就不难了。Acegi没用过。
21 楼
daquan198163
2009-08-18
我觉得这个方案虽然能跑,但是基本无法满足实际需要:
首先,客户证书不应该存储在证书库文件,而应该是数据库,以便管理和使用。
第二,现在这种方案是完全依赖应用服务器的能力来做客户认证,这样不仅绑定服务器,而且无法满足应用程序对认证的需求。我猜测这个机制只是保证了合法的用户可以建立https连接,至于https请求进来以后,应用系统还是无法获得用户身份,也就无法做登录认证。
所以我觉得好用的证书认证方案必须要定制,不过也不一定是从零开始,Acegi也就是现在的SpringSecurity提供了一种X509证书登陆的机制,应该就是做这个的。
首先,客户证书不应该存储在证书库文件,而应该是数据库,以便管理和使用。
第二,现在这种方案是完全依赖应用服务器的能力来做客户认证,这样不仅绑定服务器,而且无法满足应用程序对认证的需求。我猜测这个机制只是保证了合法的用户可以建立https连接,至于https请求进来以后,应用系统还是无法获得用户身份,也就无法做登录认证。
所以我觉得好用的证书认证方案必须要定制,不过也不一定是从零开始,Acegi也就是现在的SpringSecurity提供了一种X509证书登陆的机制,应该就是做这个的。
20 楼
daquan198163
2009-08-17
ximencf 写道
呵呵,多谢grandboy和daquan198163。问题基本搞定@
发个总结的贴吧。
19 楼
ximencf
2009-08-17
呵呵,多谢grandboy和daquan198163。问题基本搞定@
18 楼
grandboy
2009-08-17
daquan198163 写道
to 楼上:是说他的server.jks里没有服务器私钥吗?
keytool -import -v -trustcacerts -storepass password -alias server1 -file server/server-cert.pem -keystore server.jks
这条命令只是把服务器证书导入了。
那么后来你是怎么把私钥导进去的呢?
keytool -import -v -trustcacerts -storepass password -alias server1 -file server/server-cert.pem -keystore server.jks
这条命令只是把服务器证书导入了。
那么后来你是怎么把私钥导进去的呢?
对,你说对了。我是通过我们的系统直接把这个东西导进去的,应该也有其他工具。我懒得找工具了。要不然,你来试找一下,如果能找到好用的工具,请在这里和大家分享一下。如果实在找不到合适的工具的话,我把我们系统里的代码整理一下,形成一个小工具也行。
17 楼
daquan198163
2009-08-17
to 楼上:是说他的server.jks里没有服务器私钥吗?
keytool -import -v -trustcacerts -storepass password -alias server1 -file server/server-cert.pem -keystore server.jks
这条命令只是把服务器证书导入了。
那么后来你是怎么把私钥导进去的呢?
keytool -import -v -trustcacerts -storepass password -alias server1 -file server/server-cert.pem -keystore server.jks
这条命令只是把服务器证书导入了。
那么后来你是怎么把私钥导进去的呢?
16 楼
grandboy
2009-08-17
ximencf 写道
昨天的没有弹出来是因为客户端没有安装多个授权的证书,所以默认的就一个,但是假如客户端安装多个的话,server端的p12格式就不行了,就用jks, 但是jks的话,keystore就为server.jks,然后将客户端生成的所有证书导入到server.jks。出现了
错误,且一直闪动,不得己关闭服务器。整个过程如下:
第一步::生成信任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格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12
第二步.生成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文件) 将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12
5, 多个客户端证书,要将server端做成jks文件,便于下面客户端导入。keytool -import -v -trustcacerts -storepass password -alias server1 -file server/server-cert.pem -keystore server.jks
第三步.生成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格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12
5.将生成的客户端文件导入server.jks文件中。keytool -import -v -trustcacerts -storepass password -alias client1 -file client/client-cert.pem -keystore server.jks
第四步.根据root证书生成jks文件
C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass password -alias root -file root/root-cert.pem -keystore root.jks
keytool -list -keystore server.jks 可以看到有2个文件,server1 和client1
第五步:将root.p12,client.p12分别导入到IE中去(打开IE->;Internet选项->内容->证书)。
root.p12导入至受信任的根证书颁发机构,client.p12导入至个人
单个server证书和client证书,去掉上面第二步里面的5和第三步里面的5,配置如下
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" SSLEnabled="true"
keystoreFile="C:\CA\server\server.p12"
keystorePass="password" keystoreType="PKCS12"
truststoreFile="C:\CA\root.jks"
truststorePass="password" truststoreType="jks"/>
就正确,且能读出客户端的证书的信息,如果加入多个client证书, 上面配置不变,就会跳出选择框,请选择客户端安装的证书,且也能读出证书的信息。
多个client端,keystore为jks型的时候报错。
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" SSLEnabled="true"
keystoreFile="C:\CA\server\server.jks"
keystorePass="password" keystoreType="jks"
truststoreFile="C:\CA\root.jks"
truststorePass="password" truststoreType="jks"/>
启动tomacat的时候,报严重: Socket accept failed
java.net.SocketException: SSL handshake errorjavax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
at java.lang.Thread.run(Thread.java:595)
且一直跳,看来是连接报什么错误,只能强制关服务器。
JE们还有什么高招啊?
java.net.SocketException: SSL handshake errorjavax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled. at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150) at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310) at java.lang.Thread.run(Thread.java:595)
错误,且一直闪动,不得己关闭服务器。整个过程如下:
第一步::生成信任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格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12
第二步.生成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文件) 将证书导出成浏览器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12
5, 多个客户端证书,要将server端做成jks文件,便于下面客户端导入。keytool -import -v -trustcacerts -storepass password -alias server1 -file server/server-cert.pem -keystore server.jks
第三步.生成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格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12
5.将生成的客户端文件导入server.jks文件中。keytool -import -v -trustcacerts -storepass password -alias client1 -file client/client-cert.pem -keystore server.jks
第四步.根据root证书生成jks文件
C:\OpenSSL\apps\keytool -import -v -trustcacerts -storepass password -alias root -file root/root-cert.pem -keystore root.jks
keytool -list -keystore server.jks 可以看到有2个文件,server1 和client1
第五步:将root.p12,client.p12分别导入到IE中去(打开IE->;Internet选项->内容->证书)。
root.p12导入至受信任的根证书颁发机构,client.p12导入至个人
单个server证书和client证书,去掉上面第二步里面的5和第三步里面的5,配置如下
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" SSLEnabled="true"
keystoreFile="C:\CA\server\server.p12"
keystorePass="password" keystoreType="PKCS12"
truststoreFile="C:\CA\root.jks"
truststorePass="password" truststoreType="jks"/>
就正确,且能读出客户端的证书的信息,如果加入多个client证书, 上面配置不变,就会跳出选择框,请选择客户端安装的证书,且也能读出证书的信息。
多个client端,keystore为jks型的时候报错。
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" SSLEnabled="true"
keystoreFile="C:\CA\server\server.jks"
keystorePass="password" keystoreType="jks"
truststoreFile="C:\CA\root.jks"
truststorePass="password" truststoreType="jks"/>
启动tomacat的时候,报严重: Socket accept failed
java.net.SocketException: SSL handshake errorjavax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:150)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:310)
at java.lang.Thread.run(Thread.java:595)
且一直跳,看来是连接报什么错误,只能强制关服务器。
JE们还有什么高招啊?
虽然已经通过的其他渠道给出了解答,但是这里还是要说明一下。你的keystore里没有私钥信息,因为建立ssl握手必须要有私钥。你可以把p12里的信息证书和私钥导入到jks里,这个可能有点麻烦,因为keytool根本就没有提供操作私钥的办法。你也可以先用keytool生成一个带有证书的jks, 然后把里面的证书导出来。
我发给你的jks就是我把你的p12的信息导到jks里的。所以就可以了。
15 楼
问题儿童
2009-08-17
tomcat支持pk吗?
印象中不支持
印象中不支持
相关推荐
安全机制包括加密机制、数字签名机制、访问控制机制、数据完整性机制、认证交换机制、流量填充机制、路由控制机制和公证机制。加密机制是信息安全的基础,包括对称和非对称加密,以及序列和分组密码算法。数字签名...
- **拟态防御**:是一种模仿自然界生物拟态机制的安全防御策略,通过改变自身的表象或行为来迷惑攻击者,从而增强系统的安全性。 #### 新型基础设施建设的内涵与特点 - **内涵和外延**: - **信息基础设施**:...
流量填充,用于迷惑潜在攻击者,使他们难以确定真实数据量;访问控制,确保只有授权用户能访问敏感信息;身份认证,验证用户身份以防止未授权访问;数据分类,根据信息的重要性进行标记和管理;以及人员培训,教育...
这些早期的加密技术主要是基于替换和置换规则,虽然简单,但在当时却足以迷惑对手,保护信息的机密性。随着历史的演进,密码学逐渐融入数学的理论体系,形成了更为复杂的加密方法,但其核心目的始终不变,那就是确保...
后台管控和业务区域划分能够减少攻击面,而堡垒机和SSO(Single Sign-On,单点登录)结合双因子认证则是加强身份验证的重要手段。代码安全规范和运维安全规范的实施是提高开发和运维安全意识的关键。通过设置蜜罐和...
因此,建立健全的法律法规,采用数字签名认证等手段来防止潜在风险变得至关重要。 对抗性攻击是AI领域的一个重要研究方向,它涉及对机器学习模型的有目的性干扰,使其产生误判。例如,Inception-v3模型遭受定向或非...
在IT安全领域,验证信息的真实性至关重要,比如数字签名用于验证数据完整性,身份认证确保只有授权用户可以访问系统。 5. **风险管理和决策**:狮子面临风险时做出了逃跑的决策,而狐狸在信息不完全的情况下选择...
- **安全基线说明**:口令应该具备一定的复杂度,例如包含大小写字母、数字和特殊字符的组合,以提高安全性。 - **授权** - **用IP协议进行远程维护的设备使用SSH等加密协议** - **安全基线说明**:对于需要通过...
- **身份验证**:使用多种身份验证方式,如基本认证、摘要式认证等。 - **日志记录**:开启IIS日志记录,监控异常请求。 #### 三、网站设计程序代码安全 **3.1 输入验证** - **用户输入过滤**:对所有用户提交的...
2. **检查签名和认证**:如果可能,验证文件的数字签名以确认其来源和完整性。 3. **了解内容**:在解压和使用之前,先了解zip文件内的内容,特别是“ext”文件的作用和需求。 4. **安全解压**:在沙箱环境中解压...
后门**:指在系统中预留的秘密入口,攻击者可以通过这些入口绕过常规的认证机制进入系统。 **14. 拖库**:是指攻击者从数据库中导出大量的敏感数据,通常用于进一步分析和利用这些数据进行攻击。 **15. 社工库**...
在当今的数字化时代,网络安全问题日益凸显,其中网络钓鱼攻击是一种常见的欺诈手段。本文将深入探讨“PRONOTE-CLONE-PHISHING-WEBSITE”项目,这是一个基于Node.js、JavaScript、CSS和CSS3构建的网站仿冒案例,其...
在当今数字化时代,生物识别技术在身份验证领域中变得越来越重要,因为它相较于传统的密码或令牌认证系统来说更加便捷和可靠。然而,生物识别技术的广泛应用同样伴随着一个重大挑战:个人隐私泄露和身份盗窃的风险。...
此文档包括 WinRAR 多功能综合压缩文件管理器 <br> WinRAR 功能: * WinRAR 引入了一个原创的压缩算法。它提供了比其它 PC 压缩工具更高 的压缩率,特别适用于处理可执行文件,对象库,大的文本文件...