基于SSO开源产品Shibboleth的安装
????????????????????????? Shibboleth Installation(Shibboleth安装)
?
?
??? Shibboleth包含几个单独的组件: the identity provider(IdP), service provider(SP), and discovery service(DS)。你可以根据自
己的需要选择部署一个或更多的组件。在开始之前需要理解以下几步:
1.在安装之前必须阅读并理解Shibboleth的文档以及工作流程的介绍。
2.如果在安装的过程中遇到了问题,请按照以下几点进行检查。
?? 1)? 参阅安装和配置文件。
?? 2)? 检查故障排除指南。
?? 3)? 检查用户的邮件列表归档,看看其他人有没有遇到同样的问题,解决办法是什么。
?? 4)? 从用户的邮件列表中寻求帮助。
3. 安装完毕后,你应该也可以订阅Shibboleth的公告,这是关于新版本的公告,更新旧版本至最新,与安全漏洞发布。
一、??? 准备安装环境
??? 准备安装环境所需要的域名:
???? 1.sp.machine为SP的域名,eg:? exm1.sea.sp.com
???? 2.idp.machine 为IDP的域名,eg: exm2.sea.idp.com
??? 我本地准备的SP和IDP的域名分别为exm1.sea.sp.com,exm2.sea.idp.com。在使用之前首先要在windows的C:\WINDOWS\system32\drivers\etc路径下的Hosts文件中配置以上域名的映射,配置如下:
??? 127.0.0.1?????? localhost
??? 127.0.0.1?????? exm1.sea.sp.com
??? 127.0.0.1?????? exm2.sea.idp.com
??? 准备安装所需的硬件设备(SP和IDP可以分别安装在不同的电脑或者安装在不同的虚拟机上,也可以安装在同一台计算机上!)。
???? 1)端口80和443需要被开放(保证没有其他程序在占用),注意防火墙对端口访问权限的问题。
???? 2)用RedHat环境是最简单的,这里我用的是windows,在安装的过程中基本是一样的。
???? 3)确保硬件环境的时钟设置是正确的。
二、??? IDP的安装
????? 1.下载安装JDK1.5+,Tomcat6.0.17+,Apache2.2+,并确保JAVA_HOME环境变量的正确设置,这里我用的是JDK1.6,Tomcat6.0.29, Apache 2.2。
???? 注:必须从http://httpd.apache.org/网站上下载包含SSL支持的Apache安装程序并安装。
????? 2.下载IDP组件,下载之后解压并将解压之后的目录移动到你所要安装的目标目录。
(IDP下载地址为:http://shibboleth.internet2.edu/downloads/shibboleth/idp/latest/,我下载的是shibboleth-identityprovider-2.2.0-bin.zip)
????? 3.运行install.sh (linux环境) 或者 install.bat (Windows环境),进行安装。
注意:在安装过程中需要输入的idp.home为IDP的安装目录,eg: D:\opt\shibboleth-idp,需要输入的idp.hostname为IDP的域名(最好不要用IP地址,要不然后续过程会有错误出现),eg:exm2.sea.idp.com。
????? 4.所需的配置
??? 将IDP_HOME/lib/endorsed下的所有包复制到TOMCAT_HOME/endorsed下,IDP_HOME和TOMCAT_HOME分别指IDP和TOMCAT的安装目录(如果TOMCAT根目录下没有endorsed文件夹则新建一个即可)。
????? 5. 支持SOAP端点
???????? 1)??? 下载tomcat6-dta-ssl-1.0.0.jar (asc)放到TOMCAT_HOME/lib/目录下。
???????? 2)??? 在TOMCAT_HOME/conf/server.xml中增加如下的配置:
<Connector port="8443"
?????????? protocol="org.apache.coyote.http11.Http11Protocol"
?????? SSLImplementation="edu.internet2.middleware.security.tomcat6.DelegateToApplicationJSSEImplementation"
?????????? scheme="https"
?????????? SSLEnabled="true"
?????????? clientAuth="true"
?????????? keystoreFile="IDP_HOME/credentials/idp.jks"
?????????? keystorePass="PASSWORD" />
????? 6.??? 用IDP的安装路径取代IDP_HOME。
????? 7.??? 在安装IDP过程中用到的密码替换掉PASSWORD。
????? 8.??? 部署IDP:
?????????? 1)创建TOMCAT_HOME/conf/Catalina/localhost/idp.xml文件并用以下代码替换其内容。
<Context docBase="IDP_HOME/war/idp.war"
???????? privileged="true"
???????? antiResourceLocking="false"
???????? antiJARLocking="false"
???????? unpackWAR="false"
???????? swallowOutput="true" />
?????????? 2)用IDP的安装路径取代IDP_HOME。
????? 9. 加入以下行至Apache的配置文件httpd.conf中:
???????? ProxyPass /idp/ ajp://localhost:8009/idp/
???? 10. 更改Tomcat的TOMCAT_HOME/conf/server.xml中的端口8009 AJP13连接器,我们将要增加???????? request.tomcatAuthentication="false"和Address="127.0.0.1"让Apache允许发送用户名信息到IDP。
??? <Connector port="8009"
??? enableLookups="false" redirectPort="8443" protocol="AJP/1.3"
??? request.tomcatAuthentication="false" address="127.0.0.1" />
???? 11. 在Apache的httpd.conf或ssl.conf配置文件中定义以下程序,强制身份验证的时候访问RemoteUser处理程序。
??? <Location /idp/Authn/RemoteUser>
?? ??? ??? AuthType Basic
??? ??? ??? AuthName "My Identity Provider"
??? ??? ??? AuthUserFile D:/opt/shibboleth-idp/credentials/user.db
??? ??? ??? require valid-user
??? </Location>
???? 12. 用htpasswd命令创建一个或两个测试用户
??? htpasswd -c D:/opt/shibboleth-idp/credentials/user.db myself
??? htpasswd命令为Apache工具命令必须在命令行下进入到Apache安装目录的bin目录下才可以执行,myself为用户名。
???? 13. 测试IDP是否安装成功:
???? 用https://localhost/idp/profile/Status访问,如果页面出现’ok’则说明安装正确。这并不意味着你将能够登录到任何东西,因为目前还尚未配置的IDP使用的组织的基础设施。
三、安装SP
Windows下安装
SP目前支持的windows操作系统有以下几个版本:
???? 1)Windows XP SP2 and Later
???? 2)Windows 2003 Server SP1 and Later
???? 3)Windows 2008 Server
1.安装Shibboleth
?? 1)下载后缀名为.msi的SP安装程序,下载网址为:
http://shibboleth.internet2.edu/downloads/shibboleth/cppsp/latest/
??? 2) 运行安装程序。安装程序将提示输入安装路径,更改默认的配置文件与Windows适当,并为您设置各种环境变量。默认的shibd服务也被安装。
2.基本配置
编辑Apache安装目录下的conf文件夹下的httpd.conf文件:
?? 1) 用Include指令将Shibboleth对应apache版本的配置文件包含至httpd.conf文件中(eg:在httpd.conf中添加
Include? D:/opt/shibboleth-sp/etc/shibboleth/apache22.config)。
?? 2) UseCanonicalName指令设置为on.(eg:UseCanonicalName On)。
?? 3) 确保ServerName指令设置正确(eg:ServerName exm1.sea.sp.com:80)。
配置Apache使其支持SSL协议,创建过程如下所示:
?创建SSL证书
??1) 打开cmd, cd到apache安装目录的bin目录
??2) 运行openssl
????openssl req -config ..\conf\openssl.cnf -new -out my-server.csr
(? 注意, my-server是自己起的名字, 以下步骤中提到my-server的也是自己起的名字) 这一步需要设置一系列的问题, 包括密码(这个密码要记住, 以后要用) 和其他的问题. 全部完成之后会生成一个my-server.csr和 privkey.pem 文件在bin文件夹中.)
??3) 运行
openssl rsa -in privkey.pem -out my-server.key
(此时要输入密码, 就是步骤2中设定的密码)
??4) 运行
openssl x509 -in my-server.csr -out my-server.cert -req -signkey my-server.key -days 4000
这将创建一个4000天后才过期的证书
??5)??? 运行
openssl x509 -in my-server.cert -out my-server.der.crt -outform DER
??6)??? 全部运行过后这些命令会在bin文件夹中生成6个文件:
???????.cnt
???????privkey.pem
???????my-server.der.crt
???????my-server.scr
???????my-server.key
???????my-server.cert
(将这些文件移到conf/ssl目录中(如果不存在这个目录就创建一个, 这个步骤中放到其他的目录也可以 关键是记住文件的位置, 在接下来的设置中会用到)
设置Apache支持SSL
??注意: 本设置步骤针对针对Apache 2.2.x版本, 如果正在使用的是Apache 2.0.x版本, 请摸索相似的设置.
在Apache的conf目录中用文本编辑器打开httpd.conf
??1)??? 去掉下面设置行前面的#
?????????LoadModule ssl_module modules/mod_ssl.so
??2)??? 去掉下面设置行前面的# (在2.0.x版本中没有这一项)
?????????Include conf/extra/httpd-ssl.conf
??3)??? 在Apache的conf/extra目录中打开httpd-ssl.conf, 更改如下设置.
??[apache安装目录]是指Apache的安装目录, 比如c:/Apache; my-server的两个文件就是前一个步骤制作的文件, 文件的位置就是这些文件在磁盘中的位置 (在2.0.x版本中这些设置仍然在 httpd.conf文件中进行)
???SSLMutex? default
??? SSLCertificateFile "[Apache安装目录]/conf/ssl/my-server.der.crt"
???SSLCertificateKeyFile "[Apache安装目录]/conf/ssl/my-server.key"
??? 测试
??? ??? ??? 1) 保存设置文件。
?? ??? ???? 2) 在开始菜单中运行Apache的Test Configuration工具, 检查设置文件是否正确。
??? ??? ??? 3) 重新启动Apache 2.2.x。
?? ??? ???? 4) 顺利启动之后, 在浏览器中输入 https://localhost? 看看是否可以访问, 如果可以访问, 则设置成功。
??? ???
????3. SP安装测试
??????用https://localhost/Shibboleth.sso/Status访问测试,如果测试成功,那么该软件为进一步的配置做好了基本的准备。
四、??? IDP and SP本地测试的基本配置
??? 我们需要配置IDP和SP相互间的交互,注意配置:
??? SP的配置文件在 /etc/shibboleth/ 目录下:
??? SP:shibboleth2.xml:
???1)? 改变<ApplicationDefaults>节点元素的entityID为
https://sp.machine/shibboleth,sp.machine为SP的域名。(Eg:https://exm1.sea.sp.com/shibboleth)
???2)? 改变<SessionInitiator Location="Login">节点元素的entityID为
https://idp.machine/idp/shibboleth,idp.machine为IDP的域名。(eg: https://exm2.sea.idp.com/idp/shibboleth)
???3)?? 取消对远程元数据例子<MetadataProvider>节点的注释,这里将要描述你的IDP到SP,改变这个uri指向http://idp.machine/idp/profile/Metadata/SAML,idp.machine为IDP的域名。
Eg: http://exm2.sea.idp.com/idp/profile/Metadata/SAML
???4)? 注解或删除掉类型为Signature的<MetadataFilter>节点,因为这个元数据没有被签名。
Eg:
????<MetadataProvider type="XML" uri="http://exm2.sea.idp.com/idp/profile/Metadata/SAML"
???????????????? backingFilePath="federation-metadata.xml" reloadInterval="7200">
???? <MetadataFilter??? ?type="RequireValidUntil" maxValidityInterval="2419200"/>(这个没有注解或删除的情况下会报:Unable to locate metadata for identity provider,不知道为什么,有待解决!)
</MetadataProvider>
??? IDP的配置文件在 IDP_HOME/conf 目录下:
??? IdP: relying-party.xml:
?????1) 取消掉从一个URL读取元数据MetadataProvider节点元素的注释,将该节点元素的metadataURL属性改为
http://sp.machine/Shibboleth.sso/Metadata。更高级的部署,你需要手工编辑元数据进行匹配。
?????2) 注释掉包含在MetadataProvider元素中的MetadataFilter节点元素,这个元数据是未签名的,所以这个过滤器可能会引起元数据加载失败!
Eg:改变之后的为:
???????<metadata:MetadataProvider? id="URLMD" xsi:type="metadata:FileBackedHTTPMetadataProvider"
????????????????????????? metadataURL="http://exm1.sea.sp.com/Shibboleth.sso/Metadata"
????????????????????????? backingFile="D:/opt/shibboleth-idp/metadata/some-metadata.xml">
??????? </metadata:MetadataProvider>
??? 登陆测试:
用浏览器访问https://sp-machine/secure进行测试. 注意:别忘了https