﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-紫蝶∏飛揚↗-文章分类-Spring Security</title><link>http://www.blogjava.net/algz/category/47753.html</link><description>Purple Butterfly Flying
QQ群:7101519
Flex,Ext,Spring,Hibernate,EOS,SpringSecurity,Struts</description><language>zh-cn</language><lastBuildDate>Thu, 03 Mar 2011 11:09:44 GMT</lastBuildDate><pubDate>Thu, 03 Mar 2011 11:09:44 GMT</pubDate><ttl>60</ttl><item><title>X.509 学习笔记详解</title><link>http://www.blogjava.net/algz/articles/345601.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 03 Mar 2011 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/345601.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/345601.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/345601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/345601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/345601.html</trackback:ping><description><![CDATA[<p>X.509完结</p>
<p>参考文档:&nbsp; 终极武器—数字证书 http://book.51cto.com/art/201004/192437.htm</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用SSL进行双向身份验证意思就是在客户机连接服务器时，链接双方都要对彼此的数字证书进行验证，保证这<br />
是经过授权的才能够连接（我们链接一般的SSL时采用的是单向验证，客户机只验证服务器的证书，服务器不验证客户<br />
机的证书。而连接网上银行时使用的U盾就是用来存储进行双向验证所需要的客户端证书的）。</p>
<p>注: 证书更改操作(导入,删除等),都必需重启WEB应用.否则证书库的缓存无法清除.一般客户端的证书不需吊销,也没意义,直接让其无法登陆就行.<br />
spring security3 的X.509配置在双向认证中,可直接登录,即网银中使用U盾就可以不用输入用户名和密码直接登录系统.<br />
&lt;http&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" requires-channel="https"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;intercept-url pattern="/**" access="ROLE_USER"&nbsp; requires-channel="https"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;x509 subject-principal-regex="CN=(.*?)," user-service-ref="userService"/&gt;<br />
&lt;/http&gt;</p>
<p>&lt;user-service id="userService"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;user name="user" password="user" authorities="ROLE_USER" /&gt;<br />
&lt;/user-service&gt;</p>
<p>&nbsp;</p>
<p>获得安全证书有两种方式：<br />
(1)一种方式是到权威机构CA购买<br />
要获得数字证书，我们需要使用数字证书管理工具（如KeyTool和OpenSSL）构建CSR（Certificate Signing Request，数字证书签发申请），交由CA机构签发，</p>
<p>形成最终的数字证书。<br />
(2)还有一种方式是创建自我签名的证书</p>
<p>keystore:keystore扩展名的文件(即JKS类型)中一般保存的是我们的私钥，用来加解密或者为别人做签名<br />
truestore:保存的是一些可信任的证书，主要是访问某个https的时候对访问者进行认证，以确保其可信任。<br />
truststore:双向认证中是必须的，如果没有显式的指定，默认指定为$JAVA_HOME/lib/security/cacerts 这个文件。<br />
双向SSL认证，服务器必须要信任客户端证书，因此，必须把客户端证书添加为服务器的信任认证中心,即$JAVA_HOME/lib/security/cacerts 这个文件<br />
1）KeyStore: 其中保存服务端的私钥<br />
2）Trust KeyStore:其中保存客户端的授权证书</p>
<p>&nbsp;</p>
<p>一.Keytool是一个Java数据证书的管理工具。 <br />
1.keystore 文件<br />
Keytool是一个证书库文件,可将N个密钥（key）和证书（certificates）存在一个称为keystore的文件中,也即N个条目的意思.<br />
&nbsp;在keystore里，包含两种对应的数据： <br />
(1)密钥实体（Key entity）: 密钥（secret key）又或者是私钥和配对公钥（采用非对称加密） <br />
(2)可信任的证书实体（trusted certificate entries）: 也可称为公钥.</p>
<p>2.参数说明<br />
参数说明： <br />
-genkey&nbsp; 创建证书库.<br />
-import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将已签名数字证书导入密钥库&nbsp; keytool -import -alias sage -keystore sagely -file sagely.crt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度，并且把整个CA链全部打印出来。<br />
-delete 删除指定别名的条目(密钥及证书)<br />
-trustcacerts 表示将数字证书导入信任库。<br />
-alias 密钥别名(任意不重复).证书实体关联着密钥实体,可通过别名删除整个条目(证书).<br />
-dname 表示密钥的Distinguished Names， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CN=commonName&nbsp; 即对于服端证书时为网站域名,客户端则任意.通常使用域名或带有通配符&#8220;*&#8221;的泛域名，如&#8220;*.zlex.org&#8221;标识用户身份。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OU=organizationUnit <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O=organizationName <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L=localityName <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S=stateName <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C=country <br />
Distinguished Names表明了密钥的发行者身份 <br />
-keyalg&nbsp;&nbsp; 指定密钥的加密算法，支持RSA(通常)和DSA共2种算法，默认算法为DSA。<br />
-keypass 密钥的密码</p>
<p>-keystore 指定keystore文件及路径(产生的信息存在.keystore文件中)<br />
如果不设置,则默认在操作系统的当前用户(如ALGZ)目录下生成名为&#8220;.keystore&#8221;的文件,还会产生一个mykey的密钥别名,mykey中包含用户的公钥、私钥和证书。<br />
在Wnidows下，文件的位置为：C:\Documents and Settings\ALGZ\.keystore<br />
在Linux下，该文件的位置为：home\ALGZ\.keystore</p>
<p>-storepass 访问keystore(密钥库)的密码，这个密码提供系统从mykeystore文件中将信息取出 <br />
-validity 该密钥的有效期,以天为单位</p>
<p>-keysize&nbsp;&nbsp;&nbsp;&nbsp; 指定密钥长度,以位为单位.<br />
-file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数指定导出证书的文件名.<br />
-sigalg 指定数字签名算法，这里指定为SHA1withRSA算法,通常不用设置。<br />
-rfc 指定以Base64编码格式输出,通常不设置。</p>
<p><br />
3.使用步骤:<br />
(1)生成证书库<br />
生成密钥，并以证书库文件方式保存<br />
&nbsp;keytool -genkey -alias bogus -keysize 512 -validity 3650 -keyalg RSA -dname "CN=bogus.com, OU=XXX CA, O=Bogus Inc, L=Stockholm, S=Stockholm, </p>
<p>C=SE" -keypass boguspw -storepass boguspw -keystore sean.cert</p>
<p>2.导出证书<br />
从证书库中(-keystore)将指定别名的证书导出为证书文件(-file)<br />
例如：keytool -export -keystore monitor.keystore -alias monitor -file monitor.cer<br />
将把证书库 monitor.keystore 中的别名为 monitor 的证书导出到 monitor.cer 证书文件中.它包含证书主体的信息及证书的公钥，不包括私钥，可以公开。<br />
keytool -export -keystore d2aApplet.keystore -alias RapaServer -file Rapa.cert -storetype IAIKKeystore</p>
<p>3.导入证书<br />
将指定别名的证书(-file)中导入到keystore证书库(-keystore)中<br />
这里向Java默认的证书 cacerts导入Rapa.cert<br />
keytool -import -alias RapaServer -keystore cacerts -file Rapa.cert <br />
通常该命令用以导入来自CA中心的证书（Importing a Certificate for the CA） </p>
<p>4.删除证书库中的条目(即密钥实体与证书实体)<br />
keytool -delete -alias RapaServer -keystore d2aApplet.keystore ，这条命令将 d2aApplet.keystore 中的 RapaServer 这一条证书删除了。</p>
<p>5.证书条目口令的修改<br />
使用 -keypasswd 参数，如：keytool -keypasswd -alias RapaServer -keystore d2aApplet.keystore，可以以交互的方式修改 d2aApplet.keystore证书库中的条目</p>
<p>为 RapaServer 的证书。<br />
Keytool -keypasswd -alias RapaServer -keypass 654321 -new 123456 -storepass 888888 -keystore d2aApplet.keystore这一行命令以非交互式的方式修改库</p>
<p>中别名为 RapaServer 的证书的密码为新密码 654321，行中的 123456 是指该条证书的原密码， 888888 是指证书库的密码。</p>
<p>6. 导出证书到新的TrustStore(信任的证书库)<br />
&nbsp;keytool -import -alias 别名 -file 文件名 -keystore truststore</p>
<p>7.&nbsp;&nbsp;&nbsp; 查看Keystore文件内容 <br />
进入JDK安装目录下的bin目录，运行keytool命令。 <br />
keytool -list -keystore C:\keystore.jks -storepass password</p>
<p>&nbsp;-v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示密钥库中的证书详细信息</p>
<p>***********************************************</p>
<p>cacerts证书文件(The cacerts Certificates File) <br />
证书文件存在于java.home\lib\security目录下，是Java系统的CA证书仓库 </p>
<p>CA证书的导入（Importing Certificates） <br />
命令：<br />
引用<br />
keytool -import -alias joe -file jcertfile.cer</p>
<p>这个命令将证书文件jcertfile.cer中别名为joe的证书导入系统的受信任证书列表中 <br />
通常该命令用以导入来自CA中心的证书（Importing a Certificate for the CA） </p>
<p>导入被CA中心授权的证书（Importing the Certificate Reply from the CA） <br />
命令：<br />
引用<br />
keytool -import -trustcacerts -file VSMarkJ.cer</p>
<p>&nbsp;</p>
<p>证书的导出（Exporting Certificates） <br />
命令：<br />
引用<br />
keytool -export -alias jane -file janecertfile.cer</p>
<p>这个命令将别名为jane的证书导出到证书文件jcertfile.cer中 <br />
生成的证书可以交付客户端用户使用，用以进行SSL通讯，或者伴随电子签名的jar包进行发布者的身份认证。</p>
<p><br />
*************************************</p>
<p><br />
网上有许多教程，但没有说明443与8443,http与https的区别，让人试来试去总有不爽的地方。没有说明怎样测试，呵呵，我说明一下：</p>
<p><br />
Tomcat6配置HTTPS</p>
<p>我使用的JDK版本为JDK6，使用的的Tomcat版本为6；配置Tomcat下的HTTPS其实很简单，只需要完成两步工作就可以 了；SSL认证分双向认证和单向认证，如</p>
<p>果为双向认证则客户端也需要安装已生成好的文件。</p>
<p><br />
我把生成的&#8220;服务器证书文件&#8221;取名为server.jks。简单起见，我把server.jks放在D盘根目录下面,配置环境为windows.<br />
首先使用JDK自带的工具keytool生成一个&#8220;服务器证书&#8221;，取名为server.jks。</p>
<p>一.tomcat6配置双向认证</p>
<p>1、生成服务器端证书<br />
x:\&gt;keytool -genkey -keyalg RSA -dname "cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn"<br />
-alias server -keypass password -keystore d:\server.jks -storepass password -validity 3650 <br />
服务端的CN值必须为域名,不然客户端认证时为非法.</p>
<p>2、生成客户端证书<br />
X:\&gt;keytool -genkey -keyalg RSA -dname &#8220;cn=sango,ou=sango,o=none,l=china,st=beijing,c=cn&#8221;<br />
-alias custom -storetype PKCS12 -keypass password -keystore d:\custom.p12<br />
-storepass password -validity 3650&nbsp;&nbsp; <br />
客户端的CN可以是任意值。</p>
<p>3、由于是双向SSL认证，服务器必须要信任客户端证书，因此，必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入，我们</p>
<p>(1)必须先把客户端证书导出为一个单独的CER文件，使用如下命令，先把客户端证书导出为一个单独的cer文件：<br />
X:\&gt;keytool -export -alias custom -file d:\custom.cer -keystore&nbsp; d:\custom.p12 -storepass password -storetype PKCS12 -rfc&nbsp;&nbsp; <br />
(2)然后，添加客户端证书到服务器中（将已签名数字证书导入密钥库）<br />
X:\&gt;keytool -import -v -alias custom -file d:\custom.cer -keystore&nbsp; d:\server.jks -storepass password&nbsp;&nbsp; </p>
<p>4、查看证书详细(-v)内容<br />
keytool -list -v -keystore d:\server.jks -storepass password&nbsp;&nbsp; </p>
<p>5、配置tomcat service.xml文件<br />
&lt;Connector port=&#8220;8443&#8243; protocol=&#8220;HTTP/1.1&#8243; SSLEnabled=&#8220;true&#8221;&nbsp; maxThreads=&#8220;150&#8243; scheme=&#8220;https&#8221; secure=&#8220;true&#8221;&nbsp; <br />
clientAuth=&#8220;true&#8221; sslProtocol=&#8220;TLS&#8221;&nbsp; <br />
keystoreFile="D:/server.jks" keystorePass="password"<br />
truststoreFile="D:/server.jks" truststorePass="password"&nbsp; /&gt;&nbsp; </p>
<p>不设置truststoreFile,truststorePass属性,即默认指向"%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS"文件(JKS类型),则在双向认证中,需把客户端认证导入到此</p>
<p>文件中.<br />
clientAuth=&#8221;true&#8221;表示双向认证</p>
<p>6、导入客户端证书到浏览器<br />
双向认证需要强制验证客户端证书。双击&#8220;custom.p12&#8221;即可将证书导入至IE</p>
<p>二.tomcat6配置单向认证 </p>
<p>1、生成服务器端证书<br />
X:\&gt;keytool -genkey -keyalg RSA -dname &#8220;cn=localhost,ou=sango,o=none,l=china,st=beijing,c=cn&#8221;<br />
-alias server -keypass password -keystore d:\server.jks -storepass password -validity 3650&nbsp;&nbsp; </p>
<p>2、由于是单向认证，没有必要生成客户端的证书，直接进入配置tomcat service.xml文件,Xml代码<br />
&lt;Connector port=&#8221;8443&#8243; protocol=&#8221;HTTP/1.1&#8243; SSLEnabled=&#8221;true&#8221; <br />
maxThreads=&#8221;150&#8243; scheme=&#8221;https&#8221; secure=&#8221;true&#8221; <br />
clientAuth=&#8221;false&#8221; sslProtocol=&#8221;TLS&#8221; <br />
keystoreFile=&#8221;D:/server.jks&#8221; keystorePass=&#8221;password&#8221;/&gt;</p>
<p>clientAuth=&#8221;false&#8221;表示单向认证，同时去掉服务端的可信任认证,即:truststoreFile=&#8221;D:/server.jks&#8221; truststorePass=&#8221;password&#8221;这2个属性 .</p>
<p>测试说明：</p>
<p>1.请注意本机测试的网址是：https://localhost:8443</p>
<p>2.如果将tomcat的 server.xml 的8443 更改为 443,注意本机的443是否开启。</p>
<p>3.如果你的tomcat 使用了http://localhost:8080,测试网址也是https://localhost:8443</p>
<p>其它：当使用https访问某一域名时，浏览器默认访问服务器的443端口。内部处理后，再转向80处理。所以ssl 全称Security Socket Layer, 加密套接字协议层 名</p>
<p>字没有改错，只是一个加密层<br />
</p>
<img src ="http://www.blogjava.net/algz/aggbug/345601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-03-03 16:19 <a href="http://www.blogjava.net/algz/articles/345601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RBAC基于角色的访问控制（Role-Based Access Control）</title><link>http://www.blogjava.net/algz/articles/344009.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 10 Feb 2011 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/344009.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/344009.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/344009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/344009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/344009.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于角色的访问控制（Role-Based Access Control）作为传统访问控制（自主访问，强制访问）的有前景的代替受到广泛的关注。在RBAC中，权限与角色相关联，用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中，角色是为了完成各种工作而创造，用户则依据它的责任和资格来被指派相应的角色，用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限，而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。</p>
RBAC认为权限授权实际上是Who、What、How的问题。在RBAC模型中，who、what、how构成了访问权限三元组,也就是&#8220;Who对What(Which)进行How的操作&#8221;。 　　<br />
Who：权限的拥用者或主体（如Principal、User、Group、Role、Actor等等） 　　<br />
What：权限针对的对象或资源（Resource、Class）。 　　<br />
How：具体的权限（Privilege,正向授权与负向授权）。 　　Operator：操作。表明对What的How操作。也就是Privilege+Resource 　　<br />
Role：角色，一定数量的权限的集合。权限分配的单位与载体,目的是隔离User与Privilege的逻辑关系. 　　<br />
Group：用户组，权限分配的单位与载体。权限不考虑分配给特定的用户而给组。组可以包括组(以实现权限的继承)，也可以包含用户，组内用户继承组的权&nbsp;&nbsp;&nbsp;&nbsp; 限。User与Group是多对多的关系。Group可以层次化，以满足不同层级权限控制的要求。 　　<br />
RBAC的关注点在于Role和User, Permission的关系。称为User assignment(UA)和Permission assignment(PA).关系的左右两边都是Many-to-Many关系。就是user可以有多个role，role可以包括多个user。 　　<br />
凡是用过RDBMS都知道，n:m 的关系需要一个中间表来保存两个表的关系。这UA和PA就相当于中间表。事实上，整个RBAC都是基于关系模型。 　　Session在RBAC中是比较隐晦的一个元素。标准上说：每个Session是一个映射，一个用户到多个role的映射。当一个用户激活他所有角色的一个子集的时候，建立一个session。每个Session和单个的user关联，并且每个User可以关联到一或多个Session. 　　<br />
在RBAC系统中，User实际上是在扮演角色(Role)，可以用Actor来取代User，这个想法来自于Business Modeling With UML一书Actor-Role模式。考虑到多人可以有相同权限，RBAC引入了Group的概念。Group同样也看作是Actor。而User的概念就具象到一个人。 　　<br />
这里的Group和GBAC（Group-Based Access Control）中的Group（组）不同。GBAC多用于操作系统中。其中的Group直接和权限相关联，实际上RBAC也借鉴了一些GBAC的概念。 　　<br />
Group和User都和组织机构有关，但不是组织机构。二者在概念上是不同的。组织机构是物理存在的公司结构的抽象模型，包括部门，人，职位等等，而权限模型是对抽象概念描述。组织结构一般用Martin fowler的Party或责任模式来建模。 　　<br />
Party模式中的Person和User的关系，是每个Person可以对应到一个User，但可能不是所有的User都有对应的Person。Party中的部门Department或组织Organization，都可以对应到Group。反之Group未必对应一个实际的机构。例如，可以有副经理这个Group，这是多人有相同职责。 　　<br />
引入Group这个概念，除了用来解决多人相同角色问题外，还用以解决组织机构的另一种授权问题：例如，A部门的新闻我希望所有的A部门的人都能看。有了这样一个A部门对应的Group，就可直接授权给这个Group。
 <img src ="http://www.blogjava.net/algz/aggbug/344009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-02-10 10:29 <a href="http://www.blogjava.net/algz/articles/344009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>