当前位置:文档之家› 安全认证网关的Web系统开发规范

安全认证网关的Web系统开发规范

安全认证网关Web系统开发规范v1.1电子政务外网电子认证办公室2010年12月目录1规范描述 (1)2开发常见问题 (2)2.1如何保证应用用户与SSL连接用户的一致性? (2)2.2http与https进行切换时应用如何保持用户session? (2)2.3采用可选验证时,应用如何判断用户是否提交了证书? (3)3应用接口 (4)3.1接口描述 (4)3.2接口实例 (5)3.2.1Asp脚本示例 (5)3.2.2JSP脚本示例 (6)的示例 (8)的C#脚本示例 (11)SSL安全网关能够对用户的数字证书进行验证,在浏览器与Web服务器之间建立安全加密通道,可以为Web应用系统提供用户身份认证和数据保密的功能。

为了充分利用SSL安全网关的安全功能,保证系统可操作性和性能,实现系统与安全网关的顺利结合,在Web应用系统的开发过程中应注意以下几点:✧系统中的用户标志设置必须以用户数字证书中的标志为基础。

✧用户身份的获取必须以安全网关提供为准,用户身份从cookie中获取,系统可以去掉登录页面。

✧在使用超级连接时尽可能使用相对链接,禁止使用HTTP的绝对链接本地服务,否则无法访问,本地服务用户只能通过HTTPS访问。

✧避免使用协议的特有功能,保持HTTP与HTTPS的通用性。

✧不得使用KOAL_开头的cookie作为有用信息,否则会被过滤。

✧避免使用过多的cookie信息,建议不要超过1000字节。

✧对于网页中参数的传递尽可能以POST方式,避免GET方式。

✧在网页美观的前提下,保证网页的简洁性,尽量减少网页中的帧数和资源数目(图片等),提高SSL的连接性能。

✧减少使用重定向功能,避免使用多重重定向功能。

✧系统提供统一的固定端口对外提供服务,避免使用动态及多个端口。

✧对每个网页都必须对获取的用户身份cookie与应用保存的用户session值进行对比,防止另一个用户使用未关闭的IE进行访问。

✧若网页包含多框架或多窗口,则网页内容的获取应统一由HTTPS方式获取,避免混用其他方式(HTTP,about:blank空页面等)获取,否则会提示网页包含不安全内容。

2.1如何保证应用用户与SSL连接用户的一致性?●问题描述:通过SSL访问应用,提交用户证书并正确进入,此时在IE不关闭的情况下更换用户证书,进行访问时会提示重新输入证书密码并验证,使用新的证书建立连接访问后,发现应用中的用户还是先前的用户,并没有与当前证书对应。

(此种现象仅会在客户端实现较为完善,对硬件证书时刻监控的情况下才会发生,否则IE还是采用原有SSL连接进行,并不以新证书进行连接)。

●问题分析:通常用户session有效期是与客户端进程关联的,由于IE没有关闭,因此用户的session继续有效,虽然SSL连接已经发现用户发生变化,但应用还是根据原有的用户session进行判断,导致应用身份与SSL连接身份不一致。

●问题解决:在这种情况下,由于SSL连接已经发现了身份变更,因此只要应用始终与SSL连接的身份保持一致就可以了。

实现的方法是:应用每次收到请求时都可以通过cookie方式获取用户身份,然后将此身份与用户session保存的身份进行对比,若发生变化,则重新设定用户信息。

2.2http与https进行切换时应用如何保持用户session?●问题描述:SSL网关保护部分Web资源,具体方式如下,用户首先通过http方式登录网站,在进行某些重要操作时候使用https方式通过SSL网关认证访问应用,此时Web应用无法获取原有用户session。

●问题分析:通常的用户session是根据用户访问的地址来匹配的,通常是域名,由于客户端通过http访问的地址与https访问的地址不同,因此通过https访问的时候客户端不会把先前用户通过http获得的信息也一起发送。

所以,应用无法获取用户session并不是SSL网关将用户信息过滤掉,而是客户端根本没有发送用户信息。

●问题解决:通过以上问题分析,问题的解决其实就是解决不同网站(应用)间共用用户session的问题。

一种简单的方法是在切换https的时候,在https页面中加入隐含表单,在提交服务器之前通过客户端脚本将原有用户端信息自动填入,服务器通过获取隐含表单内容来判断用户,而不是简单的通过页面session判断(页面session肯定不一样)。

另一种方法是在切换https的时候把用户session信息作为参数直接在URL 地址中,服务端从URL请求中获取用户信息。

2.3采用可选验证时,应用如何判断用户是否提交了证书?●问题描述:SSL服务采用可选验证时,用户既可以提交证书验证,也可以不提交证书进行验证,都可以访问后台应用,应用如何区分用户是否进行了证书验证呢,是否可以采取应用获取证书内容的cookie方式来来判断呢?即能够获取到cookie就认为用户通过了证书认证,获取不到cookie就认为用户未提交证书。

●问题分析:当用户提交证书验证通过后,SSL服务获取证书信息并以cookie方式发送到应用服务器,在加入证书信息的cookie前,SSL服务会对原有请求信息进行分析,若有相同cookie名称的内容则进行破坏处理,保证应用获取的证书信息的正确性;当用户不提交证书信息时,SSL服务无法获取证书信息,因此不会加入新的cookie信息,当然也不会检查用户请求信息中的内容了,因此用户在不提交证书情况下完全可以在请求中伪造出相应的cookie信息,而SSL服务误认为是应用所需要的信息而不加处理,造成应用也可以获取到“证书内容的cookie”,误认为用户已经经过了证书验证。

●问题解决为了避免应用的错误判断,SSL服务在设定绑定cookie的前提下,无论是否获取到证书信息,都在用户信息中加入名称为SSL_VERIFY_CERT的cookie项,证书通过验证则cookie的值为yes,若未通过证书验证值为no。

因此,应用可以通过SSL_VERIFY_CERT来判断用户是否通过了证书验证。

3.1接口描述SSL与应用系统的接口以cookie的方式实现,SSL服务将证书及其他信息以cookie方式发送到应用服务器,每一个cookie的名称都有其确定的含义。

cookie 名称的定义如下(假定):3.2接口实例3.2.1Asp脚本示例<html>用户编码=<%=Request.Cookies("KOAL_CERT_CN")%> <BR>用户姓名=<%=Request.Cookies("KOAL_CERT_GN")%> <BR>客户IP=<%=Request.Cookies("KOAL_CLIENT_IP")%> <BR>职级=<%=Request.Cookies(" KOAL_CERT_T")%><BR>EMAIL地址=<%=Request.Cookies("KOAL_CERT_E")%> <BR>组织=<%=Request.Cookies("KOAL_CERT_O")%><BR>部门=<%=Request.Cookies("KOAL_CERT_OU")%><BR>颁发者名称=<%=Request.Cookies("KOAL_CERT_ISSUER_CN ")%><BR>证书失效期=<%=Request.Cookies("KOAL_NOT_AFTER ")%><BR>用户证书=<%=Request.Cookies("KOAL_CERT ")%></html>3.2.2JSP脚本示例<%@ page contentType="text/html; charset=GBK"%><%@ page import=".URLDecoder"%><%Cookie[] cookies = request.getCookies();if(cookies == null)cookies = new Cookie[0];String name = "";String value = "";for(int i = 0; i < cookies.length; i ++){Cookie cookie = cookies[i];if("KOAL_CERT_CN".equals(cookie.getName())){name = "用户标识:";value = new String(URLDecoder.decode(cookie.getValue()).getBytes("ISO-8859-1"), "GBK");}else if("KOAL_CERT_G".equals(cookie.getName())){name = "姓名:";value = new String(URLDecoder.decode(cookie.getValue()).getBytes("ISO-8859-1"), "GBK");}else if("KOAL_CERT_O".equals(cookie.getName())){name = "组织:";value = new String(URLDecoder.decode(cookie.getValue()).getBytes("ISO-8859-1"), "GBK");}else if("KOAL_CERT_OU".equals(cookie.getName())){name = "部门:";value = new String(URLDecoder.decode(cookie.getValue()).getBytes("ISO-8859-1"), "GBK");}else if("KOAL_CERT_E".equals(cookie.getName())){name = "E-mail:";value = new String(URLDecoder.decode(cookie.getValue()).getBytes("ISO-8859-1"), "GBK");}else if("KOAL_CLIENT_IP".equals(cookie.getName())){name = "客户IP:";value = cookie.getValue();}else if("KOAL_CERT_ISSUER_CN ".equals(cookie.getName())){name = "颁发者名称:";value = new String(URLDecoder.decode(cookie.getValue()).getBytes("ISO-8859-1"), "GBK");}else if("KOAL_NOT_AFTER ".equals(cookie.getName())){name = "证书失效期:";value = cookie.getValue();}else if("KOAL_CERT ".equals(cookie.getName())){name ="用户证书:";value = cookie.getValue();}else{continue;}%><%= name %><%= value %>&nbsp;<BR><%}%>的示例<html><head><title>SAMPLES TO GET THE COOKIES</title></head><script language="VB" runat="server">Sub Page_Load(sender As Object, e As EventArgs)dim KOAL_CLIENT_IPdim KOAL_CERT_Edim KOAL_CERT_CNdim KOAL_CERT_Odim KOAL_CERT_OUdim KOAL_CERT_Gdim KOAL_CERT_LIf Not Request.Cookies("KOAL_CLIENT_IP") Is Nothing ThenKOAL_CLIENT_IP = Server.HtmlEncode(Request.Cookies("KOAL_CLIENT_IP").Value)End IfIf Not Request.Cookies("KOAL_CERT_E") Is Nothing ThenKOAL_CERT_E = Server.HtmlEncode(Request.Cookies("KOAL_CERT_E").Value)End IfIf Not Request.Cookies("KOAL_CERT_CN") Is Nothing ThenKOAL_CERT_CN = Server.HtmlEncode(Request.Cookies("KOAL_CERT_CN").Value)End IfIf Not Request.Cookies("KOAL_CERT_O") Is Nothing ThenKOAL_CERT_O = Server.HtmlEncode(Request.Cookies("KOAL_CERT_O").Value)End IfIf Not Request.Cookies("KOAL_CERT_OU") Is Nothing ThenKOAL_CERT_OU = Server.HtmlEncode(Request.Cookies("KOAL_CERT_OU").Value)End IfIf Not Request.Cookies("KOAL_CERT_G") Is Nothing ThenKOAL_CERT_G = Server.HtmlEncode(Request.Cookies("KOAL_CERT_G").Value)End IfIf Not Request.Cookies("KOAL_CERT_L") Is Nothing ThenKOAL_CERT_L = Server.HtmlEncode(Request.Cookies("KOAL_CERT_L").Value)End Ifresponse.write("Cookie List:" )Response.Write("<br>")response.write("Cookie KOAL_CLIENT_IP is "& KOAL_CLIENT_IP ) Response.Write("<br>")response.write("Cookie KOAL_CERT_E is "& KOAL_CERT_E )Response.Write("<br>")response.write("Cookie KOAL_CERT_CN is "& KOAL_CERT_CN ) Response.Write("<br>")response.write("Cookie KOAL_CERT_O is "& KOAL_CERT_O )Response.Write("<br>")response.write("Cookie KOAL_CERT_OU is "& KOAL_CERT_OU ) Response.Write("<br>")response.write("Cookie KOAL_CERT_G is "& KOAL_CERT_G )Response.Write("<br>")response.write("Cookie KOAL_CERT_L is "& KOAL_CERT_L )Response.Write("<br>")End Sub</script></html>的C#脚本示例<%@ CODEPAGE = "936" %><%@ Import Namespace="System.Globalization" %><html>用户编码=<%=Request.Cookies("KOAL_CERT_CN") .Value%><BR>用户姓名=<%=Request.Cookies("KOAL_CERT_GN") .Value%><BR>客户IP=<%=Request.Cookies("KOAL_CLIENT_IP") .Value%><BR>职级=<%=Request.Cookies(" KOAL_CERT_T") .Value%><BR>EMAIL地址=<%=Request.Cookies("KOAL_CERT_E") .Value%><BR>组织=<%=Request.Cookies("KOAL_CERT_O") .Value%><BR>部门=<%=Request.Cookies("KOAL_CERT_OU") .Value%><BR>颁发者名称=<%=Request.Cookies("KOAL_CERT_ISSUER_CN ") .Value%> <BR>证书失效期=<%=Request.Cookies("KOAL_NOT_AFTER ") .Value%><BR>用户证书=<%=Request.Cookies("KOAL_CERT ") .Value%></html>。

相关主题