锁定老帖子 主题:数字认证的迷惑
精华帖 (0) :: 良好帖 (7) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-15
最后修改:2009-08-16
最近新接手做一个数字认证,且自己充当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里面本有此插件,只需要服务器配置就可以的了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-15
最后修改:2009-08-15
web.xml <login-config> <!-- Authorization setting for SSL --> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name> </login-config> <security-constraint> <!-- Authorization setting for SSL --> <web-resource-collection> <web-resource-name>SSL</web-resource-name> <url-pattern>/SSL/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> tomcat <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="N:\myca\server\server_keystore" keystorePass="changeit" /> |
|
返回顶楼 | |
发表时间:2009-08-15
一般不做双向验证,即只是客户端验证服务器,而服务器不去验证客户端
|
|
返回顶楼 | |
发表时间:2009-08-15
daquan198163 写道 一般不做双向验证,即只是客户端验证服务器,而服务器不去验证客户端 要clientAuth="false"为true的时候才是启动双向认证 ,这个不是重点,关键是图里面的效果是如何得到的啊? |
|
返回顶楼 | |
发表时间:2009-08-15
clientAuth="true"试试看什么效果,看那个图的样子应该是ie的功能吧。
|
|
返回顶楼 | |
发表时间:2009-08-15
最后修改:2009-08-17
你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true". 2. 为你的connector设置truststore, 如果不设置这个,就必须要把证书导入到jre的cacerts里。 因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里的ca来验证你的客户端证书的有效性(当然这个浏览器就可以做了),如此证书有效,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。 |
|
返回顶楼 | |
发表时间:2009-08-15
最后修改:2009-08-15
grandboy 写道 你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true". 2. 为你的connector设置truststore. 因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里查找你的证书,如果有此证书,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。 我现在自己做了个root证书,作为自己信任的根证书,然后 root自签名,同时制作出server端和客户端的数字证书,用root的私钥给他们分别签名。将root证书和客户端数字证书的分别导入浏览器,最后,服务器的keystore为server端的证书生成的一个keystore,您所说的truststore应该为什么呢?客户端的CA证书文件? Xml代码 1. <Connector port="8443" 2. maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 3. enableLookups="false" disableUploadTimeout="true" 4. acceptCount="100" debug="0" scheme="https" secure="true" 5. clientAuth="true" sslProtocol="TLS" 6. keystoreFile="root.p12" keystorePass="222222" keystoreType="PKCS12" 7. truststoreFile="client.jks" truststorePass="222222" truststoreType="JKS" /> 很多地方这么写,但是keystore好像就要求是jks的文件能行的,不是p12类型的。 |
|
返回顶楼 | |
发表时间:2009-08-16
ximencf 写道 grandboy 写道 你这个没有启动双向认证,自然不会有选择客户端证书那个对话框弹出来。真正的双向认证,你要再做两步:
1. clientAuth="true". 2. 为你的connector设置truststore. 因为服务器要求发送客户端证书是为了做身份确认。怎么做身份确认呢?一、在服务器的truststore里查找你的证书,如果有此证书,这一步就算通过了。二、通常还有程序逻辑来判断,例如,从证书里取出一个字段(cn, email等随便一个, 这里可以叫作证书身份mapping)来作为你的系统的身份,赋予权限等。这样只要用户发送自己的证书,系统就能得知是谁来访问系统了,也就是起到了输入用户名和口令的作用。 我现在自己做了个root证书,作为自己信任的根证书,然后 root自签名,同时制作出server端和客户端的数字证书,用root的私钥给他们分别签名。将root证书和客户端数字证书的分别导入浏览器,最后,服务器的keystore为server端的证书生成的一个keystore,您所说的truststore应该为什么呢?客户端的CA证书文件? Xml代码 1. <Connector port="8443" 2. maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 3. enableLookups="false" disableUploadTimeout="true" 4. acceptCount="100" debug="0" scheme="https" secure="true" 5. clientAuth="true" sslProtocol="TLS" 6. keystoreFile="root.p12" keystorePass="222222" keystoreType="PKCS12" 7. truststoreFile="client.jks" truststorePass="222222" truststoreType="JKS" /> 很多地方这么写,但是keystore好像就要求是jks的文件能行的,不是p12类型的。 看样子你对证书格式还是有点糊涂。 pck12是可以起到(仅仅是起到, 并不是jks, 服务器一般都是默认接受jks证书库的)jks的作用的,只不过在配置的时候需要告诉一下server你用的是p12格式的证书库,只不过这个证书库只有一个证书,同时需要提供口令,就是你如上的配置一样。也就是说直接用客户端p12文件充当trustStore是可以的,测试的时候完全可以这样做。但是在实际应用中会有些问题。如果你的服务器只发出一个p12客户端证书的时候情况就完全可以这样用,这样就是所有使用你系统的用户都用这一个pk12证书,只能证明他是合法用户,但是无法证明他是"谁"。如果你同样需要证明用户是"谁"的话(也就是你给每个用户颁发一个p12证书),那么你就还得用jks文件充当truststore. 只不过你要把pk12的信息导入到这个truststore,这样服务器就可以首先确认这个用户是合法用户,然后你就可以用程序处理证书身份mapping了。具体怎么导,看你上面的说明的你应该知道怎么做了吧,我就不说了。 |
|
返回顶楼 | |
发表时间:2009-08-16
ls的人好厉害 为什么牛人都跑北京去了
不过查了下 就应该是p12 |
|
返回顶楼 | |
发表时间:2009-08-16
最后修改:2009-08-16
去年的时候做过一个,不过没在web.xml里配置,另外看你8443配的也没什么问题,有几个关键代码需要注意
static final String DEFAULT_CERT_KEY = "javax.servlet.request.X509Certificate"; // 通过调用此方法,就会弹出让你选择证书的那个界面 // 注意这个request是使用https的,否则获取不到的证书 X509Certificate certs[] = (X509Certificate[]) request.getAttribute(DEFAULT_CERT_KEY); |
|
返回顶楼 | |