since.2006  

最近要做一个登录时数字证书验证的功能,在用户登录时除了效验用户名密码,还需验证其数字证书。

相关资源:IBM developerWroks中国中的tomcat4中使用SSLjavaeye中的Acegi X.509双向认证

异同之处
tomcat4中使用SSL中的异同:jdk1.4中已经包含JSSE。
AcegiX.509双向认证中的异同:tomcat6配置文件多了SSLEnabled="true"属性。

实现方法

  • 生成CA证书。目前不使用第三方权威机构的CA来认证,自己充当CA的角色。

1.创建私钥:
C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
2.创建证书请求:
C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
3.自签署证书:
C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey root/root-key.pem -days 3650
4.将证书导出成浏览器支持的.p12格式:
C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey root/root-key.pem -out root/root.p12

  • 生成server证书

1.创建私钥:
C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
2.创建证书请求:
C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
3.自签署证书:
C:\OpenSSL\apps>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式:
C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12

  • 生成client证书

1.创建私钥:
C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求:
C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
3.自签署证书:
C:\OpenSSL\apps>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式:
C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12

  • 根据root证书生成jks文件
C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem -keystore root.jks
  • 配置tomcat使用SSL

修改conf/server.xml,tomcat6中多了SSLEnabled="true"属性。keystorefile, truststorefile设置为你正确的相关路径

<CONNECTOR truststorepass="123456" truststoretype="JKS" truststorefile="d:/path/bin/x509/root.jks"  
keystorepass="123456" keystoretype="PKCS12" keystorefile="d:/path/bin/x509/server.p12" clientauth="true"  
sslprotocol="TLS" acceptcount="100" disableuploadtimeout="true" enablelookups="false" maxsparethreads="75"  
minsparethreads="25" maxthreads="150" maxhttpheadersize="8192" sslenabled="true" port="8443" protocol="HTTP/1.1"  
scheme="https" secure="true" />
  • 将root.p12,client.p12分别导入到IE中去(IE->;Internet选项->内容->证书)

root.p12导入至受信任的根证书颁发机构,client.p12导入至个人

  • 访问你的应用http://ip:8443,如果配置正确的话会出现请求你数字证书的对话框。
  • 在jsp中取得符合x.509格式的证书
<%    
    //获得certificate chain    
    X509Certificate[] ca = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");    
    if (ca == null) {    
        out.println("No cert info!");    
    } else {    
        String serial = ca[0].getSerialNumber().toString();    
        String DN = ca[0].getSubjectDN().toString();    
    }    
%> 
Posted by hee at 06:09 AM | Permalink | 评论(2)

IE/OPERA下元素有innerText这个方法用来剔除dom下的html标签,快速的取得文本内容。
Firefox下没有这个属性,可以用DOM Level3的textContent来代替。

<DIV id=target><SPAN>hello </SPAN>world</DIV>    
<SCRIPT type=text/javascript>    
    var dom = document.getElementById("target");    
    if (dom.innerText) {    
        alert("innerText: " + dom.innerText);    
    } else {    
        alert("textContent: " + dom.textContent);    
    }    
</SCRIPT>
Posted by hee at 23:06 PM | Permalink | 评论(0)

有文章说html dom中设置自定义属性时,需要使用setAttribute来设置.
但在某些情况下,不能全使用setAttribute来设置值
比如:

// 设置自定义属性
element.setAttribute("attribute.name", "attribute.value");
// 取得自定义属性
var value = element.setAttribute("attribute.name", "attribute.value");
alert(value);

在setAttribute属性值为字符串时,IE6,Firefox2,opera9下都工作正常.
而setAttribute当属性值为对象时,用上面的方法,只有IE下能工作正常.
比如:

// 设置自定义属性
element.setAttribute("attribute.name", object);
// 取得自定义属性
var obj = element.getAttribute("attribute.name");
// IE下返回的类型是object,而Firefox,opera下返回的类型却是string
alert(typeof obj);

解决的办法可以在设置自定义属性时,像设置内置属性一样操作

// 设置自定义属性
element.attribute = object;
// 取得自定义属性
var obj = element.getAttribute("attribute");
// 这样IE,Firefox,opera下都工作正常了
alert(typeof obj);

 

Posted by hee at 14:03 PM | Permalink | 评论(0)

dp.SyntaxHighlighter一款基于js的客户端源代码加亮脚本。
支持大多数编程语言,如:css,c#,c++,vb,delphi,js,php,ruby,sql,html等等。
目前这个blog的源代码加亮功能就是使用dp.SyntaxHighlighter,感觉效果比较清爽。
其它的还有基于PHP的GeSHi

dp.SyntaxHighlighter的使用方法较简单,在需要进行源代码加亮的页面头部、尾部分别导入下面代码:

<!-- 在头部导入css样式表 -->   
<LINK href="SyntaxHighlighter.css" type=text/css rel=stylesheet></LINK>   
<SCRIPT language=javascript src="/exblog2/js/3part/SyntaxHighlighter/Scripts/shCore.js"></SCRIPT>   
<SCRIPT language=javascript src="/exblog2/js/3part/SyntaxHighlighter/Scripts/shBrushJava.js"></SCRIPT>   
<SCRIPT language=javascript src="/exblog2/js/3part/SyntaxHighlighter/Scripts/shBrushJScript.js"></SCRIPT>   
<SCRIPT language=javascript src="/exblog2/js/3part/SyntaxHighlighter/Scripts/shBrushPhp.js"></SCRIPT>   
<SCRIPT language=javascript src="/exblog2/js/3part/SyntaxHighlighter/Scripts/shBrushXml.js"></SCRIPT>   
<SCRIPT language=javascript src="/exblog2/js/3part/SyntaxHighlighter/Scripts/shBrushCss.js"></SCRIPT>   
   
<!-- name属性的值在下面的js方法中的参数 --> 
<!-- class属性的表示源代码的种类,这里是javascript --> 
<TEXTAREA class=javascript name=code rows=10 cols=60> 
function msg() {    
        alert("hello world!");    
    }    
</pre></TEXTAREA>  
Posted by hee at 17:03 PM | Permalink | 评论(0)

之前的留言回复使用tiny_mec做所见即所得编辑器,速度感觉太慢了,于是自己想写个简单的UBB编辑器玩玩,碰到一些问题记这里:

IE和Firefox下取消事件冒泡

function showEmot() {    
    var evt =  || event;    
    if(evt.preventDefault) {    
        // Firefox    
        evt.preventDefault();    
        evt.stopPropagation();    
    } else {    
        // IE    
        evt.cancelBubble=true;    
        evt.returnValue = false;    
    }    
}

textarea下将一段内容替换鼠标所选文字或插入到当前光标位置

function append($val) {    
    // sEditorId textarea的ID    
    var eObj = document.getElementById(sEditorId);    
    // ie    
    if (eObj.createTextRange) {    
        eObj.focus();    
        document.selection.createRange().duplicate().text = $val;    
    } else {    
        // firefox    
        var iStart = eObj.selectionStart;    
        var iEnd = eObj.selectionEnd;    
        eObj.value = eObj.value.substr(0, iStart) + $val + eObj.value.substr(iEnd, eObj.value.length);    
        eObj.focus();    
    }    
}  
Posted by hee at 23:03 PM | Permalink | 评论(0)

字符串形式的xml数据(和html合在一起),在IE和FF下都可以用一般的dom标签定位到过去取值。
但在FF中有一个BUG,假如值有时,取出来的值会是:[CDATA[数据]]。

<XMP id=target> 
<root><node><![CDATA[数据]]></node></root> 
</XMP>
function getXmlFromString($str) {
// 简单用这种方法判断一下是否是IE
    if (document.all) {
        var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
        xmlDom.loadXML($str);
        return xmlDom;
    } else {
        return new DOMParser().parseFromString($str, "text/xml");
    }
} // 此时就可以用像处理xml一样的方法取值了 var doc = getXmlFromString(document.getElementById("target").innerHTML); alert(doc.childNodes[0].childNodes[0].childNodes[0].nodeValue);
Posted by hee at 16:01 PM | Permalink | 评论(0)