作者归档:admin

如果可以瞬移

生活充满了忙碌和奔波
一天:7点出发上班,1点吃饭了开会,2点会学校说事,4点会公司上班,6点回去吃饭
另一天:8点出发上班,12点吃饭,1点出发回学校弄视频的事,5点回公司上班,6点半回去吃饭
又一天:7点半出发去学校录视频,9点到公司上班,12点老板请客吃饭,3点回公司上班,6点回去吃饭

如果可以瞬移就好了。
今天是上班第十一天,lion发布了,变形金刚上映了。找了很多方法,发现木有信用卡,也买不了,只能买了个兑换码兑换lion,好像下载bt也不是什么好事,还是自动更新吧。
周末就要去看变形金刚啦,然后dt协会还会一起吃饭。挺有意思的。

学习php?

发现技术用来用去虽然说只有那几种,但是不一定每次你都能用到想用的技术。
以前最熟悉的是java,但是实验室开发就偏要用c++ mfc
做过的网站都是jsp和ssh框架的,但是来了百度之后就要学习php,还好数据库一般都是mysql,但是实验室就偏要用mssql。哈哈。至今还没有用过oracle,估计以后工作了就会用到的。

————以上废话—————–
1. php + zend框架、就是类似ssh的一个mvc框架,有自己的controller,view和model,挺好用的
2. 用zend studio写php还是比较顺手,本身就是基于eclipse开发的,而且不用编译,省去了jsp页面总是要重新发布的麻烦事
3. extjs和jquery都算是接触了,还是挺好用的。 extjs风格有点诡异,不过还是基于dom操作和定义的一些框架而已。
4. php script也还是不错的,写了一个识别验证码的。不知道用python会不会更好用,可惜一直想用python没有机会通过实践来学习。

百度实习第十天,期待lion的发布~

Liferay、Zimbra和Processmaker与CAS的单点登陆集成

一.搭建CAS服务器

1.1 CAS下载 http://downloads.jasig.org/

推荐搭建在独立的服务器上

启用Tomcat SSL

编辑 $LIFERAY_HOME/conf/server.xml,反注释SSL配置段,如下:

1.2 使用JDK工具keytool生成SSL证书

在任何目录(我在HOME)下使用命令:

keytool -genkey -alias tomcat -keypass changeit -keyalg RSA

将生成.keystore在$HOME下。
注意:在输入What is your first and last name? 时请使用你的hostname(参考/etc/hosts文件),不要用IP。或者使用hostname命令查看
整个过程如下:

daniel@daniel-desktop:~$ keytool -genkey -alias tomcat -keypass changeit -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: daniel-desktop
What is the name of your organizational unit?
[Unknown]: SEE
What is the name of your organization?
[Unknown]: Jinfonet
What is the name of your City or Locality?
[Unknown]: Kunming
What is the name of your State or Province?
[Unknown]: Yunnan
What is the two-letter country code for this unit?
[Unknown]: CN
Is CN=daniel-desktop, OU=SEE, O=Jinfonet, L=Kunming, ST=Yunnan, C=CN correct?
[no]: yes

从keystore中导出证书并将此证书导入到JRE中:

daniel@daniel-desktop:~$ keytool -export -alias tomcat -keypass changeit -file server.cert

这个server.cert以后还会用到,下面的这个导入方法适用于使用的是系统的jre的情况下,下面会介绍其他的情况
daniel@daniel-desktop:~$ keytool -import -alias tomcat -file server.cert -keypass changeit -keystore $JAVA_HOME/jre/lib/security/cacerts

测试SSL连接

访问https://daniel-desktop:8443/cas 成功

1.3 CAS登录验证

在CAS的验证页面,使用test作为帐号,test作为密码(只要帐号==密码就可以了),测试一下能不能通过CAS的验证。结果应该是可以通过,但是跳转也没无任何显示。因为我们并没有真正通过我们的帐号验证。其实CAS也是可以和ldap或者mysql集成的,请参考其他资料 =)

二. Liferay与CAS的单点登陆集成

Liferay的设置相对比较简单,只需要使用之前的server.cert,并导入到自己的jre中的cacerts文件即可,注意网上下载的liferay都是自带jre的。

之后需要往lib中加入cas-client-3.2.0-release包。

然后打开web页面,已管理员账户登陆liferay,选择顶部:管理-控制面板-门户-设置-认证-开启CAS,填写相关的CAS服务器地址,注意不能使用localhost或ip,必须要主机名或者域名

之后可以测试点击主页面的登陆和登出,都会跳转到CAS的认证页面。

三. Zimbra与CAS的单点登陆集成

CAS( Central Authentication Service)是由JA-SIG开发的一套开源的单点登录系统,在教育行业有着非常广泛的应用,有不少企业也在使用它。CAS的特点是安全性非常高,可维护性高。下面详细描述一下如何实现ZCS与CAS的集成。

1.配置ZCS的CACert keystore

在zimbra用户下执行以下脚本,将CAS的服务器证书(证书或证书链)导入到ZCS的CACert keystore中:

/opt/zimbra/java/bin/keytool -import -file casserver.cert -alias cascert -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit
/opt/zimbra/java/bin/keytool -import -file casserver.chain -alias caschain -trustcacerts -keystore /opt/zimbra/java/jre/lib/security/cacerts -storepass changeit

复制代码

2.部署CAS客户端

[li]从http://www.ja-sig.org/downloads/cas-clients/下载客户端软件包。3.1.x版本的客户端可以与ZCS 6.0.x、CAS服务器. 3.3.x一起工作。[/li][li]复制cas-client-core-3.1.x.jar文件到/opt/zimbra/jetty/common/lib目录。
[/li]

3.修改ZCS的配置文件

3.1 zimbra应用

将下列代码加入到/opt/zimbra/jetty/etc/zimbra.web.xml文件中,插入位置应在前(约230行),然后替换cas.url.com:port和 zimbra.url.com:port。
默认的端口:CAS为8443,ZCS为443或80。


CasSingleSignOutFilter
org.jasig.cas.client.session.SingleSignOutFilter


CasSingleSignOutFilter
/*

org.jasig.cas.client.session.SingleSignOutHttpSessionListener


CasAuthenticationFilter
org.jasig.cas.client.authentication.AuthenticationFilter
casServerLoginUrl https://cas.url.com:port/cas/login
serverName https://zimbra.url.com:port


CasAuthenticationFilter
/public/preauth.jsp


CasValidationFilter
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
casServerUrlPrefix https://cas.url.com:port/cas
serverName https://zimbra.url.com:port
redirectAfterValidation true


CasValidationFilter
/*


CasHttpServletRequestWrapperFilter
org.jasig.cas.client.util.HttpServletRequestWrapperFilter


CasHttpServletRequestWrapperFilter
/*

复制代码

3.2 zimbraAdmin应用

针对/opt/zimbra/jetty/etc/zimbraAdmin.web.xml文件进行同上一步的操作(插入内容、替换关键字)。
ZCS管理控制台的默认端口是7071。

4.建立PreAuth键

在zimbra用户身份下执行以下脚本:
[pre]

zmprov gdpak yourdomain.com

复制代码

[/pre]将会得到这样的PreAuth键值: “359d722926fc3daebd0fee5d8b9dad9bbe1646e68041afa8ab662c6a9152e6b9″。

5.建立preauth.jsp文件

5.1 zimbra应用

[li]将附件(附件为ZIP压缩文件,请将扩展名由GIF改为ZIP后打开)中的preauth.jsp-zimbra复制为: /opt/zimbra/jetty/webapps/zimbra/public/preauth.jsp[/li][li]用上一步提到的PreAuth键值替换其中的DOMAIN_KEY[/li][li]替换第90处的domainname.com[/li]

5.2 zimbraAdmin应用

[li]将 preauth.jsp-zimbraadmin复制为: /opt/zimbra/jetty/webapps/zimbraAdmin/public/preauth.jsp[/li][li]用上一步提到的PreAuth键值替换其中的DOMAIN_KEY[/li][li]替换第92处的domainname.com[/li]

6.替换登录和注销URL

以zimbra用户身份执行以下脚本,替换ZCS默认的登录和注销URL:
[pre]

zmprov md yourdomain.com zimbraWebClientLoginURL https://zimbra.url.com:port/zimbra/public/preauth.jsp
zmprov md yourdomain.com zimbraWebClientLogoutURL https://cas.url.com:port/cas/logout
zmprov md yourdomain.com zimbraAdminConsoleLoginURL https://zimbra.url.com:port/zimbraAdmin/public/preauth.jsp
zmprov md yourdomain.com zimbraAdminConsoleLogoutURL https://cas.url.com:port/cas/logout

复制代码

实践证明,使用zmprov mcf zimbraWebClientLogoutURL http://www.monSiteAuth.com 更好

默认端口同前。
7.重启ZCS

以zimbra身份运行zmcontrol restart命令重启ZCS服务。

四. Processmaker与CAS的单点登陆集成

1. upload the CAS Client library to the /opt/processmaker/gulliver/thirdparty

2. modify /opt/processmaker/workflow/engine/methods/login/authentication.php code as below

add CAS method

At #26 to #40.

Code: Select all
require_once ‘CAS-1.0.1/CAS.php’; //这里要写自己的版本号
// initialize phpCAS
phpCAS::client(CAS_VERSION_2_0,’oa.cybercloud.com’,8443,); //这里要写自己的CAS服务器地址和端口

// no SSL validation for the CAS server
phpCAS::setNoCasServerValidation();

// force CAS authentication
phpCAS::forceAuthentication();

if( phpCAS::isAuthenticated() == true )$casAuth = CASAuthIsTrue;

$_POST[‘form’][‘USR_USERNAME’] = phpCAS::getUser();
$_POST[‘form’][‘USR_PASSWORD’] = $casAuth;

3. modify /opt/processmaker/rbac/engine/classes/model/RbacUsers.php

change password check to CAS auth check. This is a tricky method. I use “password” as check CAS Authenticated or not. But I think this is not a good way. 😛

At line #71 & #72.
// if ( $aFields[‘USR_PASSWORD’] == md5 ($sPassword ) || ‘md5:’.$aFields[‘USR_PASSWORD’] === $sPassword) {
if ( $sPassword == CASAuthIsTrue) {

4. add javascript to submit form

/opt/processmaker/workflow/engine/xmlform/login/login.xml

在最后几行加入
document.login.submit();

五.Q&A

基本完成了CAS的单点集成登陆。

其他的一些问题:

1.出现如下异常:

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

这是缺少安全证书时出现的异常,解决方案就是将你要访问的webservice的安全认证证书导入到客户端即可。以下是获取安全证书的一种方法

1,写一个程序专门获取安全证书,参考InstallCert.java

2.执行 java InstallCert hostname 比如

java InstallCert 192.168.1.137:8443

会看到如下信息:

java InstallCert ecc.fedora.redhat.com Loading KeyStore /usr/jdk/instances/jdk1.5.0/jre/lib/security/cacerts… Opening connection to ecc.fedora.redhat.com:443… Starting SSL handshake…

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:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1476) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:846) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:815) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1038) at InstallCert.main(InstallCert.java:63) Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:221) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:145) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:172) at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:158) at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:839) … 7 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216) … 13 more

Server sent 2 certificate(s):

1 Subject CN=ecc.fedora.redhat.com, O=example.com, C=US

Issuer CN=Certificate Shack, O=example.com, C=US
sha1 2e 7f 76 9b 52 91 09 2e 5d 8f 6b 61 39 2d 5e 06 e4 d8 e9 c7
md5 dd d1 a8 03 d7 6c 4b 11 a7 3d 74 28 89 d0 67 54

2 Subject CN=Certificate Shack, O=example.com, C=US

Issuer CN=Certificate Shack, O=example.com, C=US
sha1 fb 58 a7 03 c4 4e 3b 0e e3 2c 40 2f 87 64 13 4d df e1 a1 a6
md5 72 a0 95 43 7e 41 88 18 ae 2f 6d 98 01 2c 89 68

Enter certificate to add to trusted keystore or ‘q’ to quit: [1] 3.输入1,然后直接回车,会在相应的目录下产生一个名为‘jssecacerts’的证书。将证书copy到$JAVA_HOME/jre/lib/security目录下,或者通过以下方式

System.setProperty(“javax.net.ssl.trustStore”, “D:\UTA\DOC_E_Health_XML\Keystore\jssecacerts

Zimbra cacerts证书坏了之后,可以暂停了服务之后重新签发证书

用root执行

/opt/zimbra/bin/zmcertmgr createca -new

/opt/zimbra/bin/zmcertmgr deployca

/opt/zimbra/bin/zmcertmgr createcrt -new -days 7300

/opt/zimbra/bin/zmcertmgr deploycrt self

/opt/zimbra/bin/zmcertmgr viewdeployedcrt

六. 参考资料

InstallCert.java

Preauth.jsp-zimbra

Preauth.jsp-zimbraAdmin

Liferay 5.1.1 安装与整合CAS
http://blog.csdn.net/DL88250/archive/2008/08/20/2802525.aspx

ZCS与CAS(Central Authentication Service)单点登录系统的集成
http://opengeek.cn/thread-151-1-1.html

ProcessMaker与CAS集成 http://forum.processmaker.com/viewtopic.php?f=9&t=930

使用 CAS 在 Tomcat 中实现单点登录 http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/
【原创】CAS调研总结 http://www.iteye.com/topic/544899

ZCS证书的重新签发 http://opengeek.cn/thread-492-1-1.html

iPhone: There is no SDK with the name or path iphoneos XXX

今天开始继续学习iOS开发~

环境: MAC OS 10.6

编译《iPhone 应用程序开发名家解析》的源码报错

(源码下载:www.deitel.com/books/iphonefp

先注册,点 Register,填写相关信息,到邮箱里确认注册

登录,到www.deitel.com/books/iphonefp

下载页面左侧的Download Code Examples

iPhone: There is no SDK with the name or path iphoneos XXX

老的iPhone 项目,使用最新的 XCode 3.2进行编译,报错:

iPhone: There is no SDK with the name or path iphoneos XXX

解决办法:

在XCode的工具条里面选择 Project- Edit Project Setting –

在 General 里面 Project Format 选择 XCode 3.2,

在Build里面 Base SDK选择 iPhone Simulator 3.0

然后再重新编译即可。

常见编码转换

写JSP的时候经常会遇到各种编码问题,真的是程序员一大头疼问题。

最近又解决了一个编码问题,编码问题从Eclipse的编码,tomcat的编码,到jsp页面的编码都需要调整。

常见的编码解决办法有几种:设置tomcat的编码,设置jsp页面的编码和在servlet中强制转换编码。

由于有时候出现的问题,不知道到底是何种编码,需要转换成什么编码才能正确显示,于是写了下面一个小工具,可以用来进行几种编码的转换。

通过使用这个工具,可以将“测试”从UTF-8编码转换成GBK编码的“娴嬭瘯”,然后再转换回UFT-8的“测试”二字。

检测出Eclipse默认的GBK编码出现的问题~ 修改就好了~

 

附代码:

package util;
import java.io.UnsupportedEncodingException;
public class CharsetConvertor {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String oldStr = "测试";
        String tmp;
        String[] code = { "utf8", "gb2312", "ISO8859_1", "unicode", "gbk" };
        for (int i = 0; i < code.length; i++) {
            for (int j = code.length – 1; j >= 0; j–) {
                tmp = new String(oldStr.getBytes(code[i]), code[j]);
                System.out.println((oldStr + " : " + code[i] + " to " + code[j] + " : " + tmp);
                System.out.println(tmp + " : " + code[j] + " to " + code[i]
                        + " : " + new String(tmp.getBytes(code[j]), code[i]));
                System.out.println("========================================");
            }
        }
    }
}

我的朋友们-阿民、Ajmal和中东的朋友们

从来没有想过会去日本,也从来没有想过会认识这样几个中东世界的朋友。直到完成了日本筑波大学的交换留学一年后,又想起了他们。

今天看见Ajmal上线了,和他聊了一会。他还是那么搞笑,喜欢问大家的女朋友好不好,会不会去酒吧找漂亮女孩子之类的问题。还记得在日本的时候,有一天他突然跑到我的屋里来,找我诉苦,说他的女朋友跟人跑了云云,然后还说很喜欢中国的文化,对爱情的态度。我说其实大多数中国人的心中还是怀揣着美好的希望的。最后我问了问他关于阿民的情况,他说:He is always busy but do nothing,让我脑海中浮现中了阿民那个喜欢问问题的伊朗大叔的形象。

阿民是一个伊朗人,刚认识他是在日语课上,一天到晚都是各种问题,还要求日语老师把所有的东西都翻译成英文解释,好像任何老师教过的东西对他都是浮云。我不知道他有多大了,只知道他一脸的大胡子,典型的阿拉伯世界的人物形象。有一次我和韩彪车学吉同学找他喝酒聊天,结果他直接把一瓶二两五的白酒干下肚,就晕倒在我屋里,害我还和他挤着睡了一晚。听Ajaml说他之前去了韩国,结果Returned Unsuccessful,希望他们一切都好。

还有几个中东的朋友们,一个很爱学习的图吉克斯坦的女生,喜欢跟我们讨论学习中文;一个在日语课上给我们看他新生的儿子的大哥;还有很喜欢韩彪同学的某斯坦的女生……

不知道大家现在都在忙些什么,都在为各自的梦想而奋斗着,一学期英语课的缘分让我们相互认识,共同学习。不会忘记一起每天上课早起说早安,讨论作业,考试的时候问东问西,演讲展示时候的吞吞吐吐。

哈哈哈哈……

手机写博客

终于回家了,每天可以让自己闲下来,思考一些平时忙得没时间想的问题。给博客续了费,还是会继续下去的。现在躺在床上,单手打字还是比较惬意的。先休息了…晚安。
喜欢在家里可以无所事事的感觉,可以什么都不用管,也不会有人找我办事,可以闲着,就那么闲着。打打游戏,听听歌…然后充满热情地迎接下一个学期的到来。

主任的苹果

又吃到了主任的苹果,那是一种久违的味道 记得当时主任的老爸第一次来我们寝室的时候,带了两箱苹果,还有几个散装的。他老爸说:“谁从最远的地方来的?这个最大的给他。”然后那个直径应该有15cm的苹果就归了我。然后我们寝室几个人一起给旁边的寝室送苹果,343对面的344,旁边的342和345⋯⋯ 从那以后的很长一段时间,每天回寝室都可以吃到主任家自己的苹果,每人举一个,一边吃一边聊天。

终于,过年了又回学校了,世龙从老家带来了德州扒鸡,那是一种很酥很香的食物,世龙一边给我们描述着扒鸡的做法,一边我们几个人全部分着吃完了。和后面我要讲到的湖南酱板鸭不同,这个德州扒鸡可以连骨头都全部吃完,只不过每次说到世龙的德州,都会想起“德州电锯什么的”,哈哈。

接下来就是我总喜欢带来吃的酱板鸭和麻辣肉了,主任和怪兽还挺能吃辣的,可怜了世龙和狼每次都因为吃不了太多辣,而不能品尝这些美味啊,嘿嘿。还记得几个人坐在一起边吃酱板鸭和麻辣肉,边看生化危机的日子,现在4也出来了,不知到你们都看了没?

后来狼也开始带家乡的好东西来吃,叫哈尔滨宾馆红肠。和一般的火腿肠和烤肠绝对不是一个档次的,那时真真正正的肉和真正的薰香的味道,而且一根非常多,所以要分着吃才行。当时343和344串来串去,也竟然把那么多都吃完了。

和KanKan说得差不多,应该记忆就是由很多味道组成的吧,是吧?

好久不见和说了再见

最近比较忙,事也挺多的,好久没有更新了。今天再来写一写。最近还是发生了一些事情的,有某成都小吃的不爽快经历,老板娘竟然因为外国人催赶客人。前两天 有点可怕的预感,今天就发生了,好在也不是什么大不了的事情。换手机了,换了3G号,在整理电话簿的时候看见了很多人的名字,很多从生命中匆匆相遇的人 们。真的是好久不见,说了再见就再也不见了。很多时候想去联系,但是随着时间渐渐久远,就淡淡地了。

不过有一点还是可以肯定的,就是朋友还是朋友,可能在相隔远方的时候联系不多,人人上,QQ上寒暄几句,但是真的再次遇到了,有什么困难需要帮助的时候,还是会义不容辞的。

想到了一些事情,一些人,希望你们过得很好~ 我很好~

归途

在一个地方久了,也就习惯了,当你要回家的时候,你就会想,何处是家?

半年的时间,在人的整个生命中来说,也就是那么一瞬的事情。在这个短暂的时间里,我都不敢去回忆太多,因为这样会让一个人变得矫情。曾经我也是一个很多愁善感的人,由一些事情,一些人,让我长大了,变得内心更加强大起来。

不是我对这里没有感情,也不是我没有留恋,而是在另一头不太遥远的地方,有我的家人,也有我的朋友,更重要的是有我的她。

朋友啊,人这一辈子,来来去去,新朋友,老朋友,离开前认识的朋友,一节课的朋友,太多太多的相聚和别离。说:天下没有不散的宴席,又说:离别是为了下次的相聚。

所以,就只轻轻道一声:朋友,珍重,有缘定会再见。