`
ximencf
  • 浏览: 5202 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

数字认证的迷惑

阅读更多

最近新接手做一个数字认证,且自己充当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里面本有此插件,只需要服务器配置就可以的了。

 

image1

image2

分享到:
评论
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&gt;openssl genrsa -out root/root-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps&gt;openssl req -new -out root/root-req.csr -key root/root-key.pem <br>3.自签署证书 :C:\OpenSSL\apps&gt;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&gt;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&gt;openssl genrsa -out server/server-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps&gt;openssl req -new -out server/server-req.csr -key server/server-key.pem <br>3.自签署证书 :C:\OpenSSL\apps&gt;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&gt;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&gt;openssl genrsa -out client/client-key.pem 1024 <br>2.创建证书请求 :C:\OpenSSL\apps&gt;openssl req -new -out client/client-req.csr -key client/client-key.pem <br>3.自签署证书 :C:\OpenSSL\apps&gt;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&gt;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>&lt;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"/&gt; <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="">&lt;filter&gt; <br>&lt;filter-name&gt;CAS Filter&lt;/filter-name&gt; <br>&lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt; <br>&lt;init-param&gt; <br>  &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt; <br>  &lt;param-value&gt;https://localhost:8443/cas/login&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;init-param&gt; <br>  &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt; <br>  &lt;param-value&gt;https://localhost:8443/cas/serviceValidate&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;init-param&gt; <br>  &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt; <br>  &lt;param-value&gt;localhost:8443&lt;/param-value&gt; <br>&lt;/init-param&gt; <br>&lt;/filter&gt;</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;">&lt;filter-mapping&gt; <br>&lt;filter-name&gt;CAS Filter&lt;/filter-name&gt; <br>&lt;url-pattern&gt;/servlet/HelloWorldExample&lt;/url-pattern&gt; <br>&lt;/filter-mapping&gt; </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自带的
30 楼 lucky16 2009-08-27  
grandboy 写道
你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true".
2. 为你的connector设置truststore, 如果不设置这个,就必须要把证书导入到jre的cacerts里。

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

双向认证和单向认证有什么区别呢?
29 楼 问题儿童 2009-08-24  
问题在这里
		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,这是一个完整的过程。
希望成功,共同学习。
27 楼 问题儿童 2009-08-22  
问题儿童 写道
期待lz的总结
我也遇到了问题,如下:
我的配置:
.......
请参考一下: 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的总结
我也遇到了问题,如下:
我的配置:
<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的总结
我也遇到了问题,如下:
我的配置:
<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当然还是靠服务器本身提供。
22 楼 grandboy 2009-08-18  
daquan198163 写道
我觉得这个方案虽然能跑,但是基本无法满足实际需要:
首先,客户证书不应该存储在证书库文件,而应该是数据库,以便管理和使用。
第二,现在这种方案是完全依赖应用服务器的能力来做客户认证,这样不仅绑定服务器,而且无法满足应用程序对认证的需求。我猜测这个机制只是保证了合法的用户可以建立https连接,至于https请求进来以后,应用系统还是无法获得用户身份,也就无法做登录认证。
所以我觉得好用的证书认证方案必须要定制,不过也不一定是从零开始,Acegi也就是现在的SpringSecurity提供了一种X509证书登陆的机制,应该就是做这个的。


如果是真正的CA的话,一定是要有数据库或者LDAP来做支撑的。因为有SSL标准,大家都按照这个标准来的,其实这就是证书认证的方式。服务器可能实现各有差别的,但是和浏览器通讯都是按照标准来做的,所以不存在绑定服务器的问题。至于用户身份的问题,就是你怎么把客户证书映射到系统用户的问题。服务器能取到证书了,这个应该就不难了。Acegi没用过。
21 楼 daquan198163 2009-08-18  
我觉得这个方案虽然能跑,但是基本无法满足实际需要:
首先,客户证书不应该存储在证书库文件,而应该是数据库,以便管理和使用。
第二,现在这种方案是完全依赖应用服务器的能力来做客户认证,这样不仅绑定服务器,而且无法满足应用程序对认证的需求。我猜测这个机制只是保证了合法的用户可以建立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
这条命令只是把服务器证书导入了。
那么后来你是怎么把私钥导进去的呢?


对,你说对了。我是通过我们的系统直接把这个东西导进去的,应该也有其他工具。我懒得找工具了。要不然,你来试找一下,如果能找到好用的工具,请在这里和大家分享一下。如果实在找不到合适的工具的话,我把我们系统里的代码整理一下,形成一个小工具也行。
17 楼 daquan198163 2009-08-17  
to 楼上:是说他的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。出现了
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吗?
印象中不支持

相关推荐

    电子商务安全技术理论讲义.pptx

    安全机制包括加密机制、数字签名机制、访问控制机制、数据完整性机制、认证交换机制、流量填充机制、路由控制机制和公证机制。加密机制是信息安全的基础,包括对称和非对称加密,以及序列和分组密码算法。数字签名...

    新型基础设施建设发展中的内生安全技术研究.docx

    - **拟态防御**:是一种模仿自然界生物拟态机制的安全防御策略,通过改变自身的表象或行为来迷惑攻击者,从而增强系统的安全性。 #### 新型基础设施建设的内涵与特点 - **内涵和外延**: - **信息基础设施**:...

    CISSP官方教材最完备精华笔记-V1.01

    流量填充,用于迷惑潜在攻击者,使他们难以确定真实数据量;访问控制,确保只有授权用户能访问敏感信息;身份认证,验证用户身份以防止未授权访问;数据分类,根据信息的重要性进行标记和管理;以及人员培训,教育...

    AI的欺骗艺术-人工智能图像攻击.pdf

    因此,建立健全的法律法规,采用数字签名认证等手段来防止潜在风险变得至关重要。 对抗性攻击是AI领域的一个重要研究方向,它涉及对机器学习模型的有目的性干扰,使其产生误判。例如,Inception-v3模型遭受定向或非...

    一个老程序员写给青鸟学生的建议

    他曾经在青鸟担任过兼职,并且在不同规模的公司,包括华为、雅虎等知名企业工作过,拥有多个专业认证。他指出,青鸟学生的就业能力较强,主要学习的.NET和J2EE技术是目前市场上的主流开发工具,因此就业并不困难。但...

    银行从业资格考试解题技巧.doc

    根据理解判断正误,特别关注敏感词汇和数字,因为这些都是命题者常设的迷惑点。 在备考策略上,不应死记硬背,而是要理论联系实际,理解性记忆。掌握教材的结构和逻辑,这样有助于全面理解和掌握知识点,形成系统的...

    老山羊斗老虎作文.doc

    在IT安全领域,验证信息的真实性至关重要,比如数字签名用于验证数据完整性,身份认证确保只有授权用户可以访问系统。 5. **风险管理和决策**:狮子面临风险时做出了逃跑的决策,而狐狸在信息不完全的情况下选择...

    华为交换机安全基线.pdf

    - **安全基线说明**:口令应该具备一定的复杂度,例如包含大小写字母、数字和特殊字符的组合,以提高安全性。 - **授权** - **用IP协议进行远程维护的设备使用SSH等加密协议** - **安全基线说明**:对于需要通过...

    web安全总结文档.doc

    - **身份验证**:使用多种身份验证方式,如基本认证、摘要式认证等。 - **日志记录**:开启IIS日志记录,监控异常请求。 #### 三、网站设计程序代码安全 **3.1 输入验证** - **用户输入过滤**:对所有用户提交的...

    慎用ext.zip

    2. **检查签名和认证**:如果可能,验证文件的数字签名以确认其来源和完整性。 3. **了解内容**:在解压和使用之前,先了解zip文件内的内容,特别是“ext”文件的作用和需求。 4. **安全解压**:在沙箱环境中解压...

    渗透测试行业 网络安全 黑客术语

    后门**:指在系统中预留的秘密入口,攻击者可以通过这些入口绕过常规的认证机制进入系统。 **14. 拖库**:是指攻击者从数据库中导出大量的敏感数据,通常用于进一步分析和利用这些数据进行攻击。 **15. 社工库**...

    PRONOTE-CLONE-PHISHING-WEBSITE:网站仿冒网站:books:Pronote:books:,Céédans le cadre d'un projet scolaire cola。 (注意:stop_sign:

    在当今的数字化时代,网络安全问题日益凸显,其中网络钓鱼攻击是一种常见的欺诈手段。本文将深入探讨“PRONOTE-CLONE-PHISHING-WEBSITE”项目,这是一个基于Node.js、JavaScript、CSS和CSS3构建的网站仿冒案例,其...

    保护掌纹模板的混合方法

    在当今数字化时代,生物识别技术在身份验证领域中变得越来越重要,因为它相较于传统的密码或令牌认证系统来说更加便捷和可靠。然而,生物识别技术的广泛应用同样伴随着一个重大挑战:个人隐私泄露和身份盗窃的风险。...

    winrar3.7 Beta8

    此文档包括 WinRAR 多功能综合压缩文件管理器 &lt;br&gt; WinRAR 功能: * WinRAR 引入了一个原创的压缩算法。它提供了比其它 PC 压缩工具更高 的压缩率,特别适用于处理可执行文件,对象库,大的文本文件...

Global site tag (gtag.js) - Google Analytics