1. 概述
PKI(Public Key Infrastructure ) 即"公钥基础设施"较好地解决了Web 应用中的机密性、完整性、真实性和抗否认性等安全问题。但在Web 环境下,还必须证明公钥与其持有者之间的映射关系,并认证密钥持有者的身份。数字证书很好地解决了这个问题。同样,在分布式环境下,还应该建立起安全、有效的证书管理机制,实现证书的生成、存储、分发、吊销等操作,从而为Web 应用乃至网络通信提供必要的密钥和证书服务。公钥基础设施PKI 就是这样的一种提供安全服务的基础设施。PKI 的核心是对证书及其公/私钥对的管理。同时,PKI 也代表着一种分布式的信任模型关系,它首先要选择或定义证书格式及其操作过程,其次需要明确证书签发机构或个人之间的信任关系。
EJBCA就是这样一个针对PKI证书体系企业级的开源解决方案。它基于J2EE技术,提供了一个强大的、高性能并基于组件的CA体系。EJBCA兼具灵活性和平台独立性,能够独立使用,也能和任何J2EE应用程序集成。
2. 软件环境
操作系统:Centos 5.4
数据库:mysql 5.0
JDK:jdk 1.6
EJBCA:ejbca 3.9.3
ANT: ant 1.7.1
JBOSS:jboss 4.2.3
约定ejbca及相关软件都安装在/opt/目录下。
3. EJBCA基本架构
4. EJBCA的部署模式
完整的部署方案
EJBCA本身对负载均衡、高可用等有较好的支持,完整的部署方案描述了典型的完整的部署方案的部署形式。
CA与RA分离(External RA )部署模式
CA与RA分离(External RA )的部署模式,还可以退化成CA与RA部署在一起的模式,初期在安全性要求不高的情况下,基于成本及管理的方便,可以采用CA与RA一体化部署的模式。
5. JDK安装
chmod 755 jdk-6u17-linux-i586.bin
./ jdk-6u17-linux-i586.bin
mv jdk-6u17-linux-i586 /opt/jdk
6. Java(TM) Cryptography Extension (JCE)安装
unzip jce_policy-6.zip
mv jce_policy-6/jce/*jar /opt/jdk/jre/lib/security/
JCE(Java密码扩展)为应用程序采用Java加密和数字签名提供了一种统一和一致的方式。如果在EJBCA中使用高强度的加密方式或者当数字证书的用户密码大于7个字符时候,必须安装JCE包,否则在ejbca中会报类似如下的错误:
Exception:
java.io.IOException: exception encrypting data – java.security.InvalidKeyException: Illegal key size
at org.bouncycastle.jce.provider.JDKPKCS12KeyStore.wrapKey(JDKPKCS12KeyStore.java:602)
at org.bouncycastle.jce.provider.JDKPKCS12KeyStore.engineStore(JDKPKCS12KeyStore.java:1108)
at java.security.KeyStore.store(KeyStore.java:1117)
at org.ejbca.ui.web.pub.CertReqServlet$RequestInstance.sendP12Token(CertReqServlet.java:574)
at org.ejbca.ui.web.pub.CertReqServlet$RequestInstance.doPost(CertReqServlet.java:273)
at org.ejbca.ui.web.pub.CertReqServlet.doPost(CertReqServlet.java:726)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoE
ndpoint.java:446)
at java.lang.Thread.run(Thread.java:619)
7. ANT安装
wget http://apache.etoak.com/ant/binaries/apache-ant-1.7.1-bin.tar.gz
unzip apache-ant-1.7.1-bin.zip
mv apache-ant-1.7.1-bin /opt/ant
8. Jboss安装
wget http://cdnetworks-kr-1.dl.sourceforge.net/project/jboss/JBoss/JBoss-4.2.3.GA/jboss-4.2.3.GA.zip
unzip jboss-4.2.3.GA.zip
mv jboss-4.2.3.GA /opt/jboss-4.2.3.GA
chmod 755 /opt/jboss-4.2.3.GA/bin/*sh
Ø 拷贝Jboss Web Service相关的包
在jdk1.6+Jboss 4.2.3组合情况下,要支持JAX-WS 2.0 apis,需要拷贝${JBOSS_HOME}/client下的如下包到${JBOSS_HOME}/lib/endorsed
jboss-jaxrpc.jar
jboss-jaxws.jar
jboss-jaxws-ext.jar
jboss-saaj.jar
jaxb-api.jar
否则会报如下错误:
setProperty must be overridden by all subclasses of SOAPMessage
并会导致jboss直接退出
参考:
http://sourceforge.net/project/shownotes.php?release_id=614346&group_id=22866
https://jira.jboss.org/jira/browse/JBWS-1439
Ø 修改jboss 端口
vi jboss-4.2.3.GA/server/default/deploy/jboss-web.deployer/server.xml,将
<Connector port="8080" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
修改为:
<Connector port="80" address="0.0.0.0"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
Ø 修改启动参数
vi jboss-4.2.3.GA/bin/run.conf,修改如下:
JAVA_OPTS="-Xms1024m –Xmx1024m –server –XX:MaxPermSize=512m –XX:PermSize=256m -XX:MaxNewSize=512m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"
由于在一些平台上ejbca 3.9.3+jboss 5.0版本的组合方式在安装时候存在一些问题,推荐使用jboss 4.2.3版本。
9. Mysql安装配置
Ø 下载安装mysql安装包:
rpm –ivh MySQL-server-community-5.0.89-0.rhel5.i386.rpm MySQL-client-community-5.0.89-0.rhel5.i386.rpm
tar zxvf mysql-connector-java-5.1.10.tar.gz
cp mysql-connector-java-5.1.10/mysql-connector-java-5.1.10-bin.jar /opt/jboss-4.2.3.GA/server/default/lib
Ø 创建ejbca数据库
mysql –uroot –p
create database ejbca default character set utf8;
grant all privileges on *.* to [email protected] identified by ‘ejbca’;
flush privileges;
10. 环境变量配置
修改~/.bash_profile,内容如下:
export JAVA_HOME=/opt/jdk
export JBOSS_HOME=/opt/jboss-4.2.3.GA
export APPSRV_HOME=/opt/jboss-4.2.3.GA
export J2EE_HOME=/opt/jboss-4.2.3.GA
export ANT_HOME=/opt/ant
export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin:$JBOSS_HOME/bin:$ANT_HOME/bin:.
export EJBCA_HOME=/opt/ejbca_3_9_3
export ANT_OPTS=-Xmx640m
11. EJBCA安装配置
wget http://downloads.sourceforge.net/ejbca/ejbca_3_9_3.zip
unzip ejbca_3_9_3.zip
mv ejbca_3_9_3 /opt/
cd /opt/ejbca_3_9_3/conf
Ø 修改ejbca.propterties配置文件
cp ejbca.properties.sample ejbca.properties
内容如下:
appserver.type=jboss
appserver.home=${env.APPSRV_HOME}
java.ver=15
ca.name=Yeeach Root CA
ca.dn=CN=Yeeach Root CA,O=Yeeach,C=CN
其他采用缺省值
Ø 修改database.properties
cp database.properties.sample database.properties
内容如下:
database.name=mysql
datasource.mapping=mySQL
database.url=jdbc:mysql://127.0.0.1:3306/ejbca?characterEncoding=UTF-8
database.driver=com.mysql.jdbc.Driver
database.username=ejbca
database.password=ejbca
Ø 修改web.properties
cp web.properties.sample web.properties
内容如下:
java.trustpassword=ejbca
superadmin.dn=CN=SuperAdmin 不要修改此处,3.9.3有bug,不能修改此处,不然登录管理界面时候报:Authorization Denied
superadmin.password=ejbca
httpsserver.hostname=*.yeeach.com
httpserver.pubhttp=80
注意:此处httpsserver.hostname=*.yeeach.com使用了所谓的通配符证书(wildcard certificates),以便能够支持对ca.yeeach.com,www.yeeach.com这样的域名都采用同一个证书。
Ø 安装ejbca
cd /opt/ejbca_3_9_3/
cp lib/bc*jar /opt/jboss-4.2.3.GA/server/default/lib/
ant bootstrap
启动jboss:/opt/jboss-4.2.3.GA/bin/run.sh&
ant install 一路回车确认完成安装,生成了CA、Jboss证书、浏览器证书。
杀掉jboss :ps -ef|grep jboss|grep -v grep|awk ‘{print $2}’|xargs kill -9
部署ejbca:ant deploy
再次启动jboss:/opt/jboss-4.2.3.GA/bin/run.sh&
修改客户端c:\WINDOWS\system32\drivers\etc\hosts,配置测试域名
192.168.70.23 ca.yeeach.com
导入证书:在客户端浏览器里面导入/opt/ejbca_3_9_3/p12/superadmin.p12证书,密码默认是ejbca(在web.propterties中的superadmin.password=ejbca)
输入https://ca.yeeach.com:8443/ejbca 就可以通过web方式管理CA了
Ø 重装ejbca
在测试系统中,如果要重装ejbca,请按照如下步骤重装ejbca。
重建数据库:
mysql –uroot –p
mysql>drop database ejbca;
mysql>create database ejbca default character set utf8;
清空ejbca:
ant clean
按照前面的安装步骤重新安装ejbca
ant bootstrap
…
当然在生产系统中就不要轻易重新安装。
12. 导入p12格式的证书说明
下面以导入superadmin.p12为例说明p12格式的数字证书导入到客户端的过程。
1) 、双击superadmin.p12证书文件 ,出现如下画面,单击下一步
2)、出现如下画面选择“下一步”
3)、出现如下画面,输入superadmin.p12证书的密码(缺省为ejbca),然后点击“下一步”
为了安全,可以在输入私钥密码后,勾选下面的‘启用强制私钥保护’,这样当使用证书登录时,还会要求您输入密码
为了安全起见,建议不要选择“标志此密钥为可导出的。这将允许您在稍后备份或传输密钥”,以限定密钥的传播范围。
4)、出现如下画面,选择“根据证书类型,自动选择证书存储区” ,然后点击“下一步”
5)、出现如下画面,然后点击“完成”
6)、出现安全警告窗口,选择“是”,完成安装。
7)、安装完成后,在“受信任的根证书颁发机构”有颁发给“Yeeach Root CA“的记录“个人”中有颁发给“Yeeach Super Admin”的记录。如果没有,再次手动导入。
下载pdf版本:基于EJBCA搭建自己的CA认证中心之EJBCA安装配置指南.pdf