数学成绩不咋滴,看了很久,结合网上文章整理了一份容易理解的身份证效验规则。
根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址区位码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
地址区位码:表示居民常住户口所在县(市、区)的行政区划代码。
出生日期码:表示居民出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
数字顺序码:表示同一地址区位码所标识的区域范围内,对同年同月同日出生的人员编定的顺序号。奇数分给男性,偶数分给女性。
数字校验码:根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。由(1,2,3,4,5,6,7,8,9,X)构成。
下面举例说明该计算方法并用代码实现。
1. bit:位
一个二进制数据0或1,是1bit;
2. byte:字节
存储空间的基本计量单位,如:MySQL中定义 VARCHAR(45) 即是指 45个字节;
1 byte = 8 bit
3. 一个英文字符占一个字节;
1 字母 = 1 byte = 8 bit
4. 一个汉字占2个字节;
1 汉字 = 2 byte = 16 bit
byte:一个字节(8位)(-128~127)(-2的7次方到2的7次方-1)
short:两个字节(16位)(-32768~32767)(-2的15次方到2的15次方-1)
int:四个字节(32位)(一个字长)(-2147483648~2147483647)(-2的31次方到2的31次方-1)
long:八个字节(64位)(-9223372036854774808~9223372036854774807)(-2的63次方到2的63次方-1)
float:四个字节(32位)(3.402823e+38 ~ 1.401298e-45)(e+38是乘以10的38次方,e-45是乘以10的负45次方)
double:八个字节(64位)(1.797693e+308~ 4.9000000e-324)
最近要做一个登录时数字证书验证的功能,在用户登录时除了效验用户名密码,还需验证其数字证书。
相关资源:IBM developerWroks中国中的tomcat4中使用SSL,javaeye中的Acegi X.509双向认证
异同之处
与tomcat4中使用SSL中的异同:jdk1.4中已经包含JSSE。
与AcegiX.509双向认证中的异同:tomcat6配置文件多了SSLEnabled="true"属性。
实现方法
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
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
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
修改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导入至个人
<%
//获得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();
}
%>
Properties pr = new Properties();
// 端口,IP
pr.put("82.0.176.214","16400");
Context ictx = new InitialContext(pr);
// 在joram 4.3.26中用这种方法死活连接不上JNDI,用下面方法能连接成功
Hashtable prop = new Hashtable();
prop.put(Context.INITIAL_CONTEXT_FACTORY,"fr.dyade.aaa.jndi2.client.NamingContextFactory");
prop.put("java.naming.factory.host", host);
prop.put("java.naming.factory.port", port);
Context jndiCtx = new InitialContext(prop);
以编程方式启动joram服务器,而不使用命令行方式启动
AgentServer.main(new String[] { "0", "./s0" });
注意:这种方式启动joram服务器,a3servers.xml文件的目录必须在classpath中。
注注意:假如你的a3servers.xml文件不在classpath中,他会读自己jar包中的a3servers.xml,自带的xml文件中没有配置jndi服务器,如果你碰到在程序中启动服务器,却连接不上jndi,看下是不是这个问题。
我就犯了个错误,将a3servers.xml的文件路径放classpath中去了,而不是这个文件的目录路径,joram找不到我的配置文件,就去读自带的配置文件。造成连接不上jndi,最后还是同事帮偶解决的。
使用这种方法要先设置好环境变量CATALINA_HOME=tomcat的安装路径
如果有时你不想重启整个应用,而只操作tomcat下某一个项目
<property name="tomcat.home" value="you tomcat home directory here."></property>
<TARGET name="start-tomcat" depends="stop-tomcat">
<ECHO message="Start Tomcat" />
<JAVA dir=/bin/ fork="true" jar="/bin/bootstrap.jar">
<ARG value="start" />
</JAVA>
</TARGET>
<TARGET name="stop-tomcat">
<ECHO message="Stop Tomcat" />
<JAVA dir=/bin/ fork="true" jar="/bin/bootstrap.jar">
<ARG value="stop" />
</JAVA>
</TARGET>
(1) 将%TOMCAT_HOME%\server\lib\catalina-ant.jar文件复制到类路径下
(2) 新建tomcatTasks.properties文件
#这些值就是catalina-ant.jar中的类文件,用来扩展ant的功能
start=org.apache.catalina.ant.StartTask
reload=org.apache.catalina.ant.ReloadTask
stop=org.apache.catalina.ant.StopTask
(3) 在build.xml中加入下面代码片段
<TASKDEF file="tomcatTasks.properties">
<CLASSPATH>
<PATHELEMENT path="/server/lib/catalina-ant.jar" />
</CLASSPATH>
</TASKDEF>
<TARGET name="启动当前项目">
<START path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />
</TARGET>
<TARGET name="重新装载当前项目">
<RELOAD path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />
</TARGET>
<TARGET name="停止当前项目">
<STOP path="/projectName" password="adminpasswd" username="admin" url="http://localhost:8080/manager" />
</TARGET>
# url就是在默认首页的Tomcat Manager进去的那功能页面
# username/password就是在conf/tomcat-user.xml中配置的用户名密码,注意这个用户要有manager权限
# /projectName就是你是管理的项目的名称
配置好后,就可以使用通过ant脚本来启动,重新装载,停止某一项目了。