david.turing(暂时搬到 http://openssl.blogjava.net)

Main | Next page »

http://blog.matrix.org.cn/cas/date/20060111 星期三 2006年01月11日

简述RSA

RSA协议我不再描述,大家可以看http://www.di-mgt.com.au/rsa_alg.html
RSA的密钥对生成时间依赖于两个因素,
第一,密钥的长度
第二,素数的筛选质量

在整个密钥对生成过程中,RSA会随机选择两个大素数,事实上,计算机的聪明
程度还不足以判断某个随机选择的大素数是否真的不可分解,因此,你只能够通过
计算机程序来尽量将这个大随机数不是素数的几率降到某个界限值(如0.0001)以下。

RSA KeyPair分为公钥和私钥,你应该这样使用KeyPair:
1,你使用私钥来签名,别人用你的公钥来验证签名
2,别人用你的公钥加密信息M->M',你用私钥来解密信息M'->M

虽然RSA经受过多年深入的密码分析,但大家在使用RSA的时候还是要注意以下事项,
否则RSA的安全性会大打折扣:

1,合理的密钥长度(setKeyLength)
RSA1024至今是安全的,按照目前密码分析和计算机硬件条件的发展,估计在未来5-10年,
仍以难以破解。

2,素数确定性选择(setCertaintyOfPrime)
实际应用中,选择100就行了。

3,选择合理的padding(setRSAMode)
RSA有三种模式,RAW, PKCS和OAEP,日常应用中,我本人只使用PKCS(PKCS#1 v1.5)
和OAEP(PKCS#1 v2.0)这两种padding模式。
padding跟安全性其实是紧密挂钩的,有兴趣的朋友可以看看PKCS#1标准讨论。


我编写了一个RSAUtils的工具类,下面的该类的测试代码的一部分。

程序如下:
  RSAUtils utils =new RSAUtils();
  utils.setKeyLength(1024);
  utils.setCertaintyOfPrime(100);
  utils.setRSAMode(PKCS_RSA_MODE);   //RAW =1  PKCS=2  OAEP=3
  utils.initRSAKeyPair();
  
  //查看公钥
  RSAKeyParameters mypubkey=utils.getPublicKey();
  BigInteger mypubkey_modulus=mypubkey.getModulus();  
  BigInteger mypubkey_exponent=mypubkey.getExponent();
  System.out.println("##mypubkey的modulus长度="+mypubkey_modulus.bitLength());
  System.out.println("##mypubkey_modulus值="+mypubkey_modulus.toString());
  System.out.println("##mypubkey的exponent长度="+mypubkey.getExponent().bitLength());
  System.out.println("##mypubkey_exponent值="+mypubkey_exponent.toString());

  //查看私钥
  RSAKeyParameters myprivkey=utils.getPrivateKey();
  BigInteger myprivkey_modulus=myprivkey.getModulus();
  System.out.println("##myprivkey的modulus长度="+myprivkey_modulus.bitLength());
  System.out.println("##myprivkey的modulus值="+myprivkey_modulus.toString());
  System.out.println("##myprivkey.getExponent()长度="+myprivkey.getExponent().bitLength());
  System.out.println("##myprivkey.getExponent()值="+myprivkey.getExponent());

以下是输出:
##mypubkey的modulus长度=1024
##mypubkey_modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056378455106547
##mypubkey的exponent长度=2
##mypubkey_exponent值=3

##myprivkey的modulus长度=1024
##myprivkey的modulus值=93806062666699782638132820491933031482836826566660997927543724649365705443512121003172409185855121369631538039111403612211728268332662414248776212969019881724066055080327735965218365399595323200109436472147258110417469825748181131149217613806780318374365617984326523029965066348377550281908277056378455106547
##myprivkey.getExponent()长度=1023
##myprivkey.getExponent()值=62537375111133188425421880327955354321891217711107331951695816432910470295674747335448272790570080913087692026074269074807818845555108276165850808646013241363962278455328383552959397735977285649455021534046301135296075808377308404258909132811288204167107604525033796313576612747649866739561523887875979483707

其中,要记住,公钥的exponent即RSA算法中的e, e通常是3,17和65537
X.509建议使用65537,PEM建议使用3,PKCS#1建议使用3或65537,一般来说,都是选择3。

私钥的Exponent就是私钥中最重要的部分,它就是私钥区别于公钥的地方!

接着,我们看看RSA的加密,解密过程。

通常,不要随便对某一个别人发过来的东西进行签名(有潜在危险),即使有这样的必要,请先将它的文件进行Digest或者HMAC
处理后,再做签名。
为了说明RSA是如何加密信息的,我先让大家脱离MD5/SHA1等辅助算法(没有人会单独使用RSA,RSAwithMD5,RSAwithSHA1才是常用的使用方法),来单独看看RSA本身:

大家习惯了DES/IDEA,再看RSA的加密,可能会有一些不习惯,因为RSA虽然也可以看成是基于Block的加密,但是,RSA的输入和输出的Block的大小是不一样的,Block的大小依赖于你所使用的RSA Key的长度和RSA的padding模式。
在RSAUtils测试用例中,分别对RSA设置三种长度的Key(768,1024,2048)和2种padding模式(PKCS 1.5和OAEP),结果如下:

RSA                InBlock大小   OutBlock大小  (单位,字节)
768bit/PKCS        85                96
1024bit/PKCS     117               128
2048bit/PKCS     245               256
768bit/OAEP        54                96
1024bit/OAEP     86               128
2048bit/OAEP     214               256

大家可以看到,相同密钥长度, 加密出来的密文长度要比明文要长,且OAEP的InBlock/OutBlock要比PKCS的InBlock/OutBlock要小,单从熵的角度,意味着OAEP padding模式引入更多的熵,OAEP要比PKCS更安全(事实上,为何提出OAEP代替PKCS,大家可以到RSA网站看看OAEP文档 http://www.rsasecurity.com/rsalabs/node.asp?id=2125)。


下面,RSAUtils是我写的针对BouncyCastle的一个工具类,它封装了BouncyCastle的crypto中的RSAEngine,基本上,我很少单独使用RSAUtils,我更多的是结合DiegestUtils来使用。

http://blog.matrix.org.cn/cas/date/20060107 星期六 2006年01月07日

Ktpass和KTab的主要用法

不少人都没搞清楚Ktpass跟Ktab的用法,特此写一篇文章来叙说一下。
我假设你对Kerberos有所认识,可以读我的一篇文章中篇,里面初步介绍了Kerberos协议(基于Windows KDC)。
在Kerberos中,安全性完全是依赖于Share Secret,也就是,KDC跟Kerberos Service之间都共享着一条Key,Ktpass这个命令行工具承担着这样一个角色,它能够将非Windows Kerberos服务配置一个Service Principal,通常类似于HTTP/Service@DomainName,并且同时生成一个Keytbab,这样做的目的是在Windows域中的KDC和非Windows的服务(Kerberos Service)建立一种安全的信任关系,Keytab文件中就是存放着那条非常重要的跟KDC打交道的Secret Key。

你更改了Keytab中的Key,就必须同时更改Kerberos database中的Key。操作Keytab,JDK提供了一个很好的工具叫做KTab。


首先,在Windows域控制器上创建一个用户tomcat2005, 这是一个Windows的用户,我们使用Ktpass将一个Kerberos service (HTTP/tomcat@MYDAVID.ORG)Mapping到这个用户上面。Ktpass会修改当前用户在Windows AD中的用户登录名,你可以用setspn -L tomcat2005来查看究竟有多少Service Principal绑定到tomcat2005上。


C:\>ktpass -princ HTTP/tomcat@MYDAVID.ORG -mapuser tomcat2005 -pass tomcat2005 -out tomcat2005_keytab -crypto des-cbc-md5
Successfully mapped HTTP/tomcat to tomcat2005.
Key created.
Output keytab to tomcat2005_keytab:

Keytab version: 0x502
keysize 50 HTTP/tomcat@MYDAVID.ORG ptype 1 (KRB5_NT_PRINCIPAL) vno 1 etype 0x3 (DES-CBC-MD5) keylength 8 (0xb64540dace6e70d3)
Account has been set for DES-only encryption.


接着,执行,目的是往keytab上面增加新的service principal。
C:\>ktab -k tomcat2005_keytab -a HTTP/tomcat@MYDAVID.ORG
Password for HTTP/tomcat@MYDAVID.ORG:tomcat2005
Done!
Service key for HTTP/tomcat@MYDAVID.ORG is saved in C:\\tomcat2005_keytab

你可能问,Ktpass和Ktab都往keytab文件两面写Key,其实,他们都是写同样的Key,只不过Ktpass还有一个AD帐号Set SPN Name的作用。

还可以通过ktab -l -k tomcat2005_keytab, 来看看里面究竟有针对什么Service的Key

C:\>ktab -l -k tomcat2005_keytab
Keytab name: C:\\tomcat2005_keytab
KVNO Principal
--------------------------------
4 HTTP/tomcat@MYDAVID.ORG

KVNO是Service Key的更新序号,不需要理会,关键的是Principal。

Yale CAS项目总结

SSO总会有一个结束的时候,我最终把CAS Server 2.0放到Weblogic Portal上,并实现了到其他WebApp的单点登陆。困难比我原先想象的要大,总结几点,希望对来者有所帮助。
1,搞SSO前请先熟悉SSL/PKI,因为,CAS的安全性很大程度依赖于SSL,没有安全性,不敢想象SSO有何作为。
2,因为我们的环境是在Weblogic Portal上,Portal环境上,调试CAS费了我好大力气,加之我重写了CAS的LoginModule(CAS不提供J_Security_check登陆方式),中途抛出的错误很多,访问BEA Support网站是家常便饭了。
3,CAS需要配置信任证书,如果象我那样一步一步地创建根CA,ServerCA,恐怕会比较辛苦,但证书的确让我高枕无忧,从CAS Server和各个Web应用之间建立一种更松耦合的信任关系。
4,IE端到CAS Server的双向SSL虽是画蛇添足,但是在一些高安全性的SSO环境,如网上付费,付出少许的计算代价,即让身份欺诈无所遁形。

冷静下来,想了一下SSO的用处,看来在互连星空中会有卖点,事实上,电信已经使用了SSO了,联通在信平台也在各SP与MISC之间部署SSO,随着B2B,B2C的发展,相信SSO会有很不错的前途。

我个人对CAS的评价是,
PureJava Impl,OpenSource,能轻松在各种WebServer间移植,协议并没有Kerberos那么复杂(当然Kerberos更安全),所以使用和调试起来,没有Kerberos那么痛苦。实战中,本人更倾向使用CAS 3.0,基于Spring的一种实现方式,将来有空必为此写一Blog.

庆祝BEA广州UserGroup成立!

多年在Matrix,Blogjava,JavaEye游走后,我们彼此可能都很熟悉了,但这只是线上的,在线下,我们可能缺乏面对面交流的机会。今天,广州UserGroup成立了,广州UserGroup作为华南地区的中心枢纽,有着便捷的交通和广泛的J2EE群体基础。BEA广州UserGruop是对Matrix,Dev2Dev,JavaEye,BlogJava的一种不同的组织形式,它以活动讲座和面对面交流为主要方式。
今天联系了几位本地区多年为开源做出贡献的牛牛,他们对BEA广州UserGroup都寄予厚望和表示支持,包括Chirs,农民,白衣,char等。
我作为广州UserGroup的组织人员之一,希望此Group能为广大广东地区的,尤其是广州,深圳等地的J2EE爱好者提供一个值得信任的交流平台。
各位朋友,大家如果对户外讲惺裁春玫慕ㄒ?包括主题,时间地点,演讲专家推荐等),请到http://dev2dev.bea.com.cn/bbs/forum.jspa?forumID=29304&start=0
发言。
今年内,希望组织一次广东地区(主要是广州深圳)的J2EE高手见面会。

Tomcat(直至5.5.9版本)不支持KeyStore和KeyEntry使用不同的password

今天,有朋友在配置Tomcat SSL的时候,出现如下的异常:
java.security.UnrecoverableKeyException: Cannot recover key
而且他已经正确配置了keystoreFile和keystorePass。
后来我发现,他对Keystore中的Key使用了Password保护,而且
保护这个KeyEntry的KeyPass!=KeyStore的Keypass,导致出错,
Tomcat SSL要求这两个密码必须相等。
解决办法:
keytool -keypasswd -v -alias mykeyalias -keypass noequalpass -new equalpass -keystore mykeystore.jks -storepass equalpass
其中, mykeyalias是key在keystore中的别名,-keypass后面跟key的旧密码"noequalpass", -new 是新密码"equalpass",注意新密码跟storepass一致。

附:Weblogic是支持不一致的KeystorePass和KeyPass的。

广州食图(FB必备)

整理了一下广州食图,希望对广州FB的食友们有所帮助!

下载广州"食"图

解决加入域时出现的网络路径问题

今天,帮朋友部署域环境,配置好DNS后,客户端加入域出错,提示网络路径找不到(The network path was not found.),找了一一下support.microsoft.com,发现是Windows 2000 域控制器上未启用 Microsoft 网络的文件和打印共享选项[http://support.microsoft.com/default.aspx?scid=kb;zh-cn;258500],晕死,搞了老半天,这个错误是无法通过netdiag和dcdiag察觉出来的。
这周末的感触是,配置Windows域确实比较复杂,尤其是一定要把DNS配置好,DNS配置不好,必定会导致AD工作不正常。

CAS集成Weblogic的ServletAuthentication调用

本来,使用j_security_check是最简单的Build-in认证方式,但CAS有自己的登录入口,即login servlet,如果用该servlet,必须自己动手完成JAAS的登录。于是,开始扩展CAS的edu.yale.its.tp.cas.auth.provider,在该包中的provider都扩展自authHandler接口,而CAS是在web.xml中定义了最终使用哪一个authHandler。

edu.yale.its.tp.cas.authHandler
edu.yale.its.tp.cas.auth.provider.WeblogicHandler

我自己写了一个WeblogicHandler(edu.yale.its.tp.cas.auth.provider包中),专门让CAS登录到Weblogic Server,事实上,将来如果不用WLS,还可能使用Websphere,Jboss,AD之类。

后来发现,虽然能loginContext拿到Subject,但该Subject的Principal不能被页面的request.getPrincipal()所取得,醒悟自己在做JAAS Login,查看weblogic文档,原来Weblogic提供了
weblogic.servlet.security.ServletAuthentication
用于在Servlet端调用JAAS接口进行登录,通过该接口登录后,就如同User使用了标准的登录机制登入了Weblogic。
于是,立即修改了login servlet测试一下,加入

try {
CallbackHandler handler = new SimpleCallbackHandler(
request.getParameter("username"),
request.getParameter("password"));
Subject mySubject = weblogic.security.services.Authentication
.login(handler);
weblogic.servlet.security.ServletAuthentication.runAs(
mySubject, request);
System.out.println("mySubject[" +mySubject.toString()+"]"+
"写入Session");
} catch (LoginException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

然后,页面果然就能拿到Pincipal了。

手谈——计算机AI之新高度

手谈,由中大陈志行教授研发的围棋算法,目前已经由KOEI做成游戏发行。
大家可以去VeryCD下载。
我下了几盆,不得不赞叹陈教授的算法:AI很高。
很多局部对抗都做的很不错,唯一不足是全局判断(事实上,这是一个很难很难的题目),如果全局都做得很好,那么,就等于计算机会思考了(人工智能年代的全面到来)。

从一个围棋人的角度来看,手谈处理布局方面显然是用了定式,但是,在自身防守方面,不可能做得过于保守(保守等于输棋,你没理由为了做两只眼而放弃抢夺全局要点)。因此,它或多或少存在一些漏洞,我下了两盘棋,最后都是屠龙取胜,大家可以看看我的对战棋谱。

另外,大家下棋的时候,可以尽量使用打劫,手谈基本上不敢跟你打劫,因为算法的AI对全局的取舍还是做得不够。

下载棋谱

最后,我还是对这手谈的设计表示衷心的祝贺,算法的AI之高不是那些象棋和国际象棋所能比拟的。

Weblogic Security In Action

摘要
本文将探讨Weblogic Platform中的安全框架以及在该框架下如何实现企业安全(Weblogic Enterprise Security,简称WLES)。
本文分为上中下三篇。
上篇主要阐述WLES的概念,将按照如下的思路,让读者对Weblogic安全框架有一个明晰的理解,并在此基础上明白Weblogic基本安全要素如User,Group,Role,Resource。并探讨在WLES下实现认证和授权的方法。
中篇主要阐述WLES的配置,重点讲述如何在WLS中配置SSL和证书,如何配置LDAP和数据库,如何实现Windows集成安全,如何在开源技术如CAS,SAML,SPNEGO等基础上实现单点登陆(Single Sign on,即SSO)。
下篇主要解释Weblogic Mbean机制,讲述如何实现自己的Custom Security Provider,并解释如何使用Weblogic Security Provider构造一个强大稳健的安全体系。

[上篇]
1, Weblogic Platform安全框架概述
2, Security Realm下的用户、组、角色、资源和安全策略
3, 认证与授权
[中篇]
4, 配置SSL与数字证书
5, Windows集成安全
6, 单点登陆(SSO)
[下篇]
7, 实现自己的Security Provider
8, 在Security Provider上构造灵活的安全体系


Weblogic Security In Action 上篇


原来写文章是这么累的。
中篇,下篇正在撰写中,请密切关注。
希望各位指出文章的纰漏,然后发邮件给我,因为我实在没时间很仔细去审阅。

基于NTLM的Proxy认证

以Matrix的Blog为例,截取其中的认证过程进行分析(注意,本文中使用的cookie值已经被处理过,呵呵,别想干坏事握)

测试环境:
域:mydomain.com
域主机:davidturing.mydomain.com
域用户:davidturing@mydomain.com
代理服务器:proxyserver.mydomain.com

1) 登陆Windows域(mydomain.com),用户名为davidturing
2) 打开IE窗口,URL=http://www.matrix.org.cn/blog/cas/,由于公司使用了ProxyServer,员工必须通过ProxyServer才能上网。
于是,IE Client就向Proxyserver请求访问Matrix Blog。
3) Proxy认证使用了NTLM,对IE Client进行认证。
于是,IE(Client)就和ProxyServer(Server)执行下面的三次握手的认证过程。

1: C --> S GET ...

2: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM

3: C --> S GET ...
Authorization: NTLM

4: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM

5: C --> S GET ...
Authorization: NTLM

6: C <-- S 200 Ok

需要指出,NTLM只是两种Windows认证方式中的一种,Kerberos是另外一种,而且更有名,我会为Kerberos认证再写一篇Blog:)

4) 握手的过程被我Sniffer了下来,如下文所示:
/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive

{分析:注意,这是一个很简单的HTTP GET请求,无非是想请求www.matrix.org.cn /blog/cas这张页面}


/******************
ProxyServer-> Client:
******************/
HTTP/1.1 407 Proxy Authentication Required ( The ISA Server requires authorization to fulfill the request. Access to the Web Proxy service is denied. )
Via:1.1 PROXYSERVER
Proxy-Authenticate: NTLM
Proxy-Authenticate: Kerberos
Proxy-Authenticate: Negotiate
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 2372



......返回给客户端的HTTP实体,提示页面内容被省略......


{分析:接着,ProxyServer要求我提供认证信息,注意,HTTP 407代码的含义是类似于401,表示客户必须先经过代理服务器的授权。我们还可以看到,Proxy-Authenticate字段里面包含了NTLM,Kerberos,表明可以通过客户端来Negotiate再决定使用两者中的一种}

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive
Proxy-Authorization: NTLM TlRMTVNTUAABAAAAB4IAogAAAAAAAAAAAA
AAAAAAAAAFAJMIAAAAD2==

{分析:
这里,客户端将自己的NTLM代码发送给服务器,里面包含了一些自己的域帐号发送给ProxyServer,ProxyServer就可以知道用户是谁,然后去域服务器取出用户的域密码,加密一个随机字符串去Challenge用户(见下文)。

在NTLM中,这是三次握手的"第一手"(Type1 Message),目的是Client告诉Server两样东西:
hoststring:即client的主机名(比如davidturing)
domainstring:即client在域中的名(比如davidturing.mydomain.com)

Proxy-Authorization的信息结构如下
0 1 2 3
+-------+-------+-------+-------+
0: | 'N' | 'T' | 'L' | 'M' |
+-------+-------+-------+-------+
4: | 'S' | 'S' | 'P' | 0 |
+-------+-------+-------+-------+
8: | 1 | 0 | 0 | 0 |
+-------+-------+-------+-------+
12: | 0x03 | 0xb2 | 0 | 0 |
+-------+-------+-------+-------+
16: | domain length | domain length |
+-------+-------+-------+-------+
20: | domain offset | 0 | 0 |
+-------+-------+-------+-------+
24: | host length | host length |
+-------+-------+-------+-------+
28: | host offset | 0 | 0 |
+-------+-------+-------+-------+
32: | host string |
+ +
. .
. .
+ +-----------------+
| | domain string |
+-------------+ +
. .
. .
[如果数据图显示的太丑,可以参考:
http://www.innovation.ch/java/ntlm.html
]
由于截取的信息经过BASE64处理,所以,你不可能肉眼从Proxy-Authorization值中判断出主机名和主机域名:)
}


/******************
ProxyServer-> Client:
******************/
HTTP/1.1 407 Proxy Authentication Required ( ¾Ü¾ø•ÃÎÊ¡£ )
Via:1.1 PROXYSERVER

Proxy-Authenticate:
NTLM TlRMTVNTUAACAAAAGAAYADgAAAAFgoGikmfj
JzhsTW0AAAAAAAAAAIoAigBQAAAABQCTCAAA
AA9IAE4ASQBTAEkALgBDAE8ATQAuAEMATgAC
ABgASABOAEkAUwBJAC4AQwBPAE0ALgBDAE4A
AQAWAFAAUgBPAFgAWQBTAEUAUgBWAEUAUgA
EABgAaABuAGkAcwBpAC4AYwBvAG0ALgBjAG4A
AwAwAHAAcgBvAHgAeQBzAGUAcgB2AGUAcgAuA
GgAbgBpAHMAaQAuAGMAbwBtAC4AYwBuAAAAA
AA=

Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Pragma: no-cache
Cache-Control: no-cache
Content-Type: text/html
Content-Length: 0


{分析:这个步骤中,ProxyServer回应我的IE一个Proxy-Authorization,其值就是上面那段很长的字符,这是一个authcode,目的是Chanllenge客户端(IE)。Chanllenge是对客户端的一种身份挑战,好比方,你说你是张三,OK,服务器用张三的密码加密一段咚咚,你能告诉服务器这段咚咚是什么,服务器就相信你了。

这条type-2 Message是的三次握手的第二握。
0 1 2 3
+-------+-------+-------+-------+
0: | 'N' | 'T' | 'L' | 'M' |
+-------+-------+-------+-------+
4: | 'S' | 'S' | 'P' | 0 |
+-------+-------+-------+-------+
8: | 2 | 0 | 0 | 0 |
+-------+-------+-------+-------+
12: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
16: | message len | 0 | 0 |
+-------+-------+-------+-------+
20: | 0x01 | 0x82 | 0 | 0 |
+-------+-------+-------+-------+
24: | |
+ server nonce |
28: | |
+-------+-------+-------+-------+
32: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
36: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
里面包含了server nounce值,这个值就是Challenge了。我们需要
根据这个8字节的随机数构造type-3 message。
}

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Proxy-Authorization:
NTLM TlRMTVNTUAADAAAAGAAYAJIAAAAYABgAqgA
AABgAGABIAAAAGAAYAGAAAAAaABoAeAAAA
AAAAADCAAAABYKAogUAkwgAAAAPaABuAGk
AcwBpAC4AYwBvAG0ALgBjAG4AaAB1AGEAbg
BnAHoAaABhAG8AcQBpAG4ASABVAEEATgBHA
FoASABBAE8AUQBJAE4AMQCGRQ1i+bZleAs2A
kgEXS/CfJ3oOrsi6prctAW2HyADaWwbNqmpO1
Eptq7yJUh4SXd=

User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==


{分析:OK,这里就是IE客户端响应ProxyServer的Chanllenge,上面的NTLM=TIRMT….就是Challenge回应码,如果这段代码正确,ProxyServer就承认用户的身份,就可以让他到访问外网资源。

分析一下这个type-3 Message,它的结构如下:
0 1 2 3
+-------+-------+-------+-------+
0: | 'N' | 'T' | 'L' | 'M' |
+-------+-------+-------+-------+
4: | 'S' | 'S' | 'P' | 0 |
+-------+-------+-------+-------+
8: | 3 | 0 | 0 | 0 |
+-------+-------+-------+-------+
12: | LM-resp len | LM-Resp len |
+-------+-------+-------+-------+
16: | LM-resp off | 0 | 0 |
+-------+-------+-------+-------+
20: | NT-resp len | NT-Resp len |
+-------+-------+-------+-------+
24: | NT-resp off | 0 | 0 |
+-------+-------+-------+-------+
28: | domain length | domain length |
+-------+-------+-------+-------+
32: | domain offset | 0 | 0 |
+-------+-------+-------+-------+
36: | user length | user length |
+-------+-------+-------+-------+
40: | user offset | 0 | 0 |
+-------+-------+-------+-------+
44: | host length | host length |
+-------+-------+-------+-------+
48: | host offset | 0 | 0 |
+-------+-------+-------+-------+
52: | 0 | 0 | 0 | 0 |
+-------+-------+-------+-------+
56: | message len | 0 | 0 |
+-------+-------+-------+-------+
60: | 0x01 | 0x82 | 0 | 0 |
+-------+-------+-------+-------+
64: | domain string |
+ +
. .
. .
+ +-------------------+
| | user string |
+-----------+ +
. .
. .
+ +-------------+
| | host string |
+-----------------+ +
. .
. .
+ +---------------------------+
| | LanManager-response |
+---+ +
. .
. .
+ +------------------+
| | NT-response |
+------------+ +
. .
. .
+-------+-------+-------+-------+

domain string: 主机域名(如davidturing.mydomain.com)
user string:用户名(davidturing)
LanManager-response: 类DES的散列处理
NT-response:MD4散列处理
详情可参考:
http://samba.kn.vutbr.cz/samba/docs/man/Samba-Developers-Guide/pwencrypt.html
}

/******************
ProxyServer-> Client:
******************/
HTTP/1.1 301 Moved Permanently
Via: 1.1 PROXYSERVER
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 158
Date: Wed, 21 Sep 2005 03:44:57 GMT
Location: http://www.matrix.org.cn/blog//cas/
Content-Type: text/html
Server: Microsoft-IIS/6.0

Object Moved

This document may be found here

{分析:很明显,ProxyServer已经承认了我的身份,并让我访问Matrix了。这里有一个小插曲,Matrix做了重定向(熟悉HTTP协议的人应该知道HTTP 301表示move permanetly,即客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。)比如,如果我们直接访问http://www.matrix.org.cn/blog//cas/,服务器会IE重定向到http://61.142.81.140:9703/blog/cas/,你在页面上不会察觉到这一点。Chris估计是想做备份吧?Blog这东西经常出问题。}

到此,我们已经通过了Proxy认证了,下面的通讯的Traffic我就不想说了,反正就是先取HTML网页,再取网页的Style.css,有一个先后顺序,大家不必关心了。

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog//cas/ HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
If-Modified-Since: Mon, 19 Sep 2005 03:19:14 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Proxy-Connection: Keep-Alive
If-None-Match: "ea7c9ee9c8bcc51:10a4"
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==

/******************
ProxyServer-> Client:
******************/
HTTP/1.1 200 OK
Via: 1.1 PROXYSERVER
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 36149
Date: Wed, 21 Sep 2005 03:44:57 GMT
Content-Location: http://www.matrix.org.cn/blog//cas/index.html
Content-Type: text/html
Server: Microsoft-IIS/6.0
Last-Modified: Tue, 20 Sep 2005 14:29:13 GMT
Accept-Ranges: bytes
ETag: "4a5cbacefbdc51:10ce"



....页面内容被省略.........

/******************
Client->ProxyServer:
******************/
GET http://www.matrix.org.cn/blog/cas/styles-site.css HTTP/1.0
Accept: */*
Referer: http://www.matrix.org.cn/blog//cas/
Accept-Language: zh-cn,en;q=0.8,zh;q=0.5,zh-tw;q=0.3
Proxy-Connection: Keep-Alive
If-Modified-Since: Sat, 13 Aug 2005 13:23:57 GMT
If-None-Match: "3cea6142aa0c51:10a4"
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 2.0.50215)
Host: www.matrix.org.cn
Cookie: user=cas%3A%3AAq3HtCAsqNlhY%3A%3A1; matrix_user_cookie=Y2FzfDgzMzM4MURELTk17UStMUU4MS05OTJDLTJERDM4RERGNkUyRg==


/******************
ProxyServer-> Client:
******************/
HTTP/1.1 200 OK
Via: 1.1 PROXYSERVER
Connection: Keep-Alive
Proxy-Connection: Keep-Alive
Content-Length: 5379
Date: Wed, 21 Sep 2005 03:44:57 GMT
Content-Type: text/css
Server: Microsoft-IIS/6.0
Last-Modified: Sat, 13 Aug 2005 13:23:57 GMT
Accept-Ranges: bytes
ETag: "3cea6142aa0c51:10ce"

body {
margin:0px 0px 20px 0px;
background:#FFF;
}
A { color: #003366; text-decoration: underline; }
A:link { color: #003366; text-decoration: underline; }
.....styles-site.css内容被省略 .....
padding-right:15px;
padding-top:5px;
padding-bottom:5px;
}

BEA的Enterprise Solutions Forum meeting - September 20-24, 2004 in Nashua, New Hampshire, USA,里面有牛人N个

合照如下:
Nashua_ESF.jpg

Mp3和ppt的zip文件太多太大,我会分批上传。
Agenda如下:
Monday 20-Sept-04
8:30 Welcome and Orientation JP
9:00 Diablo (WLS 9.0) Beta Overview Jim Marino: Sr WLS PM
9:30 Diablo Beta - Main Features: Web Services/J2EE Jim Marino: Sr WLS PM
10:30 Break
10:45 Diablo Beta - Main Features: Web Services/J2EE - continued Jim Marino: Sr WLS PM
12:00 Lunch
1:00 Diablo Beta - Main Features: OA&M Stephen Hess: Director WLS PM
2:30 Break
2:45 Diablo Beta - Main Features: Security Pat Prince: Sr WLS PM
4:00 Diablo Beta - Main Features: JMS/Messaging Jim Marino: WLS PM
6:00 Adjourn

Tuesday 21-Sept-04
8:30 Non-stop WebLogic: Auto-tuning, Dynamic Updates & other HA Features Andy Piper: SW Staff Engineer
9:30 Mystery Guest
10:30 Break
10:45 Use Case: GE Lightweight Mobile Application Framework Christopher Cassidy: Sr Principal Business Consultant
12:00 Lunch
1:00 Voice Over IP Demo John Funk: Principal SE
2:00 Support Update: Patterns, Tools & Services Jeff Peng: Sr. Developer Relations Engineer
2:30 Break
3:00 Partner: inDepth:App Monitoring/Perf Mgmnt for WLS 8.1 - Hands-on Lab with Acsera Marshal Villarosa: Principal Solutions Architect; Grover Righter: VP Marketing; Acsera
5:45 Adjourn

Wednesday 22-Sept-04
8:30 Workshop 9.0 Beta Roadmap/Beehive Mike Foster: WLW SW Engineer II
10:00 Break
10:15 Workshop 9.0 Beta Update: NetUI Mike Foster: WLW SW Engineer II
10:45 Workshop 9.0 Beta Update: Controls David Read: WLW Sr Engineering Program Mgr
11:15 Workshop 9.0 Beta Update: Annotations/Migration David Read: WLW Sr Engineering Program Mgr
12:00 Lunch
1:00 Workshop 9.0 Beta Update: Project Model/Build System& Migration Mike Foster: WLW SW Engineer II
1:30 Workshop 9.0 Beta Update: Web Services David Read: WLW Sr Engineering Program Mgr
2:00 WLS/WLW 8.1 Competition Julie Taylor-Bridge: Competitive Technical Specialist - CSO
3:00 Break
3:15 WLS/WLW 8.1 Competition Julie Taylor-Bridge: Competitive Technical Specialist - CSO
4:30 Adjourn

Thursday 23-Sept-04
8:30 Beehive Review Ted Osborne: Ed Services Technologist
10:30 Break
10:45 SOA Jeff Bradburn: Sr Ed Services Technologist
12:00 Lunch
1:00 SOA Jeff Bradburn: Sr Ed Services Technologist
3:30 Break
3:45 Architectural Issues w/Emerging Technologies John Graves: Regional Technial Training Field Manager
4:45 Understanding Methodologies John Graves: Regional Technial Training Field Manager
6:00 Adjourn

Friday 24-Sept-04
8:30 ESF Review JP
9:00 SOA Self Assessment Tool Mark LaJeunesse: Director Business Programs
10:00 Dell Case Study: End to End Process - Delivery Review Deb Ayers: Principal SE & Valery Zelixon (ProActivity).
11:00 Siebel Portlets Chris Bale: Sr SW Engineer; Melissa Dawe: Eng Intern
12:00 Lunch
12:45 Siebel Portlets Chris Bale: Sr SW Engineer; Melissa Dawe: Eng Intern
1:45 WLP 9.x Tools Review Chris Bale: Sr SW Engineer; Melissa Dawe: Eng Intern
2:45 Break
3:00 WLP 9.x Tools Review Chris Bale: Sr SW Engineer; Melissa Dawe: Eng Intern
4:00 Adjourn

WeblogicServer绑定AD认证

1,构造一个干净的域,域名为domain002
2,构造该域里面的用户
weblogic The default administration user DefaultAuthenticator
user0001 weblogic DefaultAuthenticator
user0002 user0002 DefaultAuthenticator
3,建立一个组,weblogicAdmin,同时在AD中也建立一个这样的组
注意,在AD中的users而不是Builtin里面建组,因为两者的DN是不一样的。
4,将所有Weblogic中的user0001用户都加入到改组。
5,测试AD的可连接性,下载一个LDAP Browser。
6,在Weblogic Console中的Security->Realm的Authentication配置一个新的LDAP Provider,类型为:Configure a new Active Directory Authenticator...
7,配置参数:
i) 转到Active Directory那一Tab,看到HOST了吧?
HOST为你的AD的IP或者主机名,AD默认端口是389
ii) Principal为CN=user0001,CN=Users,DC=dlsvr,DC=com
其中,DC=dlsvr,DC=com为我的服务器的RootDN(例如DC=ibm,DC=com)
很讨厌AD的一个地方是它采用与其他LDAP不一样的命名方法,他用CN=User而不是OU=....,所以我前面的步骤才需要建立一个welogicAdmin的组。
iii)Credential为AD中user0001的密码。
注意:ii)和iii)是用于连接AD用的,构造一个LDAPConnection需要用户名密码的,懂不懂:)
转到user tab
iv) User Name Attribute:user0001
v) User Base DN:CN=Users,DC=dlsvr,DC=com
转到group tab
vi) Group Base DN:CN=weblogicAdmin,CN=Users,DC=dlsvr,DC=com
vii) weblogicAdmin
保存
关键的步骤到了:
Security->Realms->myrealm->Providers->Authentication
有没有看到Re-order the Configured Authentication Providers
对,就是这里需要调整一下顺序。
把ActiveDirectoryAuthenticator调整到最上面(优先级最高)
然后设置ActiveDirectoryAuthenticator的General页里面的Control Flag为Required。
接着DefaultAuthenticator里面的设成是OPTIONAL。
于是,AD取代了以前的DefaultAuthenticator了,如果两个都Requried,那么也你要接受双重认证,汗......一般不需要这样。
注意:boot.properties里面的默认的Weblogic启动账号同样受AD影响,你如果在AD里面禁止了Weblogic这个账号,我保证你WLS启动不了

(4)短信平台架构及接口文档

如果对里面的架构接口描述有什么不懂,可以联系我。
mail: china_sp@163.com。
文档版权所有,欢迎下载但请勿转载,谢谢。

短信平台安装,使用,维护说明书
下载

短信平台概要设计书
下载

短信平台应用接口设计说明书
下载

(3)短信应用接口代码(david.turing提供)

使用C++编写。
版权所有,欢迎下载,但请勿转载,谢谢。

下载


Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.