基于ejbca community 6.3.1.1构建独立ca系统管理数字证书 - 游戏开发.docx
基于ejbcacommunity6.3.1.1构建独立ca系统管理数字证书-游戏开发-最新IT资讯_电脑知识大全_网络安全教程-次元立方网数字证书这个名词相信很多人听过,但并不了解,ejbca可能很多人都没有听过数字证书Certificate,就是互联网通信经过中标志通信各方身份的一个文件,能够理解为网络身份证,主要目的是验证身份ejbca,是一个CACertificateAuthority系统软件,CA是数字证书认证中心的简称,主要功能是管理数字证书,包括证书的颁发、销毁、更新等,ejbca实现了CA规范,因而能够用来管理数字证书接下来,笔者将根据ejbca安装、使用、数字证书使用、webservice接口、nginx代理顺序逐步介绍一个独立ca系统完好的建立与使用经过centos安装ejbca-community-6.3.1.1ejbca安装经过算比拟复杂了,本文以centos6.5系统为例介绍安装经过,其他linux能够参考,windows下的安装经过几乎一样,安装经过使用是ejbcacommunity6.3.1.1社区版,安装经过请严格根据下面步骤,不然很容易出错!1、安装基础环境安装ejbca需要jdk-1.7以上、ant构建工具、可用的mysql数据库、jboss-7.1.1,其中jdk、ant、mysql安装配置经过参考:/cnblogs/ywlaker/p/6129872.,假如已经安装过这些,能够忽略,直接进入下面步骤2、安装启动jboss从jboss官方网站下载jboss安装包:jboss-as-7.1.1.Final.tar.gz,解压并配置环境变量tarxvfjboss-as-7.1.1.Final.tar.gz-C/usr/javavi/etc/profile追加内容#jbossconfexportJBOSS_HOME=/usr/java/jboss-as-7.1.1.Final使配置立即生效source/etc/profile启动jboss,注意最后的符号,待启动完成再运行exitsh/usr/java/jboss-as-7.1.1.Final/bin/standalone.sh这样jboss就运行在后台了,下面命令查看jboss进程并关闭ps-ef|grepjbosskill-9进程号3、配置jboss的mysql数据源创立目录,然后在该目录下创立module.xmlmkdir-p/usr/java/jboss-as-7.1.1.Final/modules/com/mysql/maincd/usr/java/jboss-as-7.1.1.Final/modules/com/mysql/mainvimodule.xmlmodule.xml内容如下?xmlversion=1.0encoding=UTF-8?modulexmlns=urn:jboss:module:1.0name=com.mysqlresourcesresource-rootpath=mysql-connector-java-5.1.27.jar/resourcesdependenciesmodulename=javax.api/modulename=javax.transaction.api/dependencies/module下载mysql的驱动包mysql-connector-java-5.1.27.jar,放在/usr/file目录,然后拷贝到当前目录cp/usr/file/mysql-connector-java-5.1.27.jar./打开新的shell窗口,运行sh/usr/java/jboss-as-7.1.1.Final/bin/jboss-cli.sh-c假如是disconnect状态,先输入connect,多回车几次后,运行下面命令/subsystem=datasources/jdbc-driver=com.mysql.jdbc.Driver:add(driver-name=com.mysql.jdbc.Driver,driver-class-name=com.mysql.jdbc.Driver,driver-module-name=com.mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc.jdbc2.optional.MysqlXADataSource):reload4、安装配置ejbca从ejbca官方网站下载ejbca安装包:ejbca_ce_6_3_1_1.zip,放在/usr/file目录,解压,准备修改配置unzip/usr/file/ejbca_ce_6_3_1_1.zip-d/usr/javacd/usr/javamvejbca_ce_6_3_1_1ejbca-ce-6.3.1.1cd/usr/java/ejbca-ce-6.3.1.1/conf/1、修改ejbca.propertiesmvejbca.properties.sampleejbca.propertiesviejbca.properties修改如下内容appserver.home=/usr/java/jboss-as-7.1.1.Finalappserver.type=jboss2、修改database.propertiesmvdatabase.properties.sampledatabase.propertiesvidatabase.properties修改如下内容#dataSourcedatasource.jndi-name=jboss/datasources/MySqlDS#mysqlinfodatabase.name=mysqldatabase.url=jdbc:mysql:/127.0.0.1:3306/ejbca?characterEncoding=UTF-8database.driver=com.mysql.jdbc.Driverdatabase.username=rootdatabase.password=root3、修改install.propertiesmvinstall.properties.sampleinstall.propertiesviinstall.properties修改如下内容#设置ca名称ca.name=test#设置ca信息ca.dn=CN=test,O=test,C=cn4、修改cesecore.properties、jaxws.properties,不需要修改内容mvcesecore.properties.samplecesecore.propertiesmvjaxws.properties.samplejaxws.properties5、修改web.propertiesmvweb.properties.sampleweb.propertiesviweb.properties修改如下内容#密码最好6位superadmin.password=123456=superadminsserver.hostname=ca.testsserver.dn=CN=$sserver.hostname,O=test,C=cn5、部署ejbca到jboss首先,在配置的mysql中创立ejbca数据库,编码utf-8,然后正式用ant构建ejbca并安装到jbosscd/usr/java/ejbca-ce-6.3.1.1antcleandeployantinstallantdeploy-keystoredeploy用ant部署,install生成证书,deploy-keystore将证书部署到jboss,前两步所需时间较长,经过中如需输入,请直接回车6、配置jboss开启s打开新的shell窗口,运行sh/usr/java/jboss-as-7.1.1.Final/bin/jboss-cli.sh-c假如是disconnect状态,运行connect,多回车几次,准备运行下面4部分配置第一部分配置任意主机可访问/interface=:add(inet-address=0.0.0.0)/interface=spub:add(inet-address=0.0.0.0)/interface=spriv:add(inet-address=0.0.0.0)/socket-binding-group=standard-sockets/socket-binding=:add(port=8080,interface=)/subsystem=undertow/server=default-server/-listener=:add(socket-binding=)/subsystem=undertow/server=default-server/-listener=:write-attribute(name=redirect-socket,value=spriv):reload第二部分配置证书/core-service=management/security-realm=SSLRealm:add()/core-service=management/security-realm=SSLRealm/server-identity=ssl:add(keystore-path=$jboss.server.config.dir/keystore/keystore.jks,keystore-password=serverpwd,alias=prod-ica1)/core-service=management/security-realm=SSLRealm/authentication=truststore:add(keystore-path=$jboss.server.config.dir/keystore/truststore.jks,keystore-password=changeit)/socket-binding-group=standard-sockets/socket-binding=spriv:add(port=8443,interface=spriv)/socket-binding-group=standard-sockets/socket-binding=spub:add(port=8442,interface=spub):reload第三部分配置ssl/subsystem=undertow/server=default-server/s-listener=spriv:add(socket-binding=spriv,security-realm=SSLRealm,verify-client=REQUIRED)/subsystem=undertow/server=default-server/s-listener=spub:add(socket-binding=spub,security-realm=SSLRealm):reload第四部分配置webservice/system-property=org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:add(value=true)/system-property=org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:add(value=true)/system-property=org.apache.catalina.connector.URI_ENCODING:add(value=UTF-8)/system-property=org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING:add(value=true)/subsystem=webservices:write-attribute(name=wsdl-host,value=jbossws.undefined.host)/subsystem=webservices:write-attribute(name=modify-wsdl-address,value=true):reload使用ejbca管理数字证书ejbca安装完成后,我们就能够使用它管理数字证书了,假设安装ejbca的服务器地址为:172.17.210.124,我们在windows系统下先配置一个hosts,编辑C:WindowsSystem32driversetc目录下的hosts文件,参加一行172.17.210.124ca.test然后拷贝ejbca服务器/usr/java/ejbca-ce-6.3.1.1/p12/目录下的superadmin.p12文件到windows系统,双击该文件开场安装,默认密码是ejbca,假如配置经过中修改正,请使用修改正的密码如123456ejbca系统提供了两个界面管理员界面需要证书,使用刚刚安装的superadmin证书s:/ca.test:8443/ejbca/adminweb/用户界面:/ca.test:8080/ejbca/弄好了超级管理员证书之后,我们开场管理数字证书吧!1、用户注册数字证书是身份认证的载体,身份认证的对象就是用户,数字证书包含用户的基本信息,就想身份证包含了你的姓名等基本信息一样,注册经过即是你想ejbca提交个人基本信息ejbca管理员界面中,打开RAFunctionsAddEndEntity菜单,填写下面Required列打勾的项。用户模板选择EMPTY输入用户名与密码Commonname,假如是服务器用证书,这里请填写域名填写证书信息,证书模板选择ENDUSER,CA选择dev,Token选择P12file最后点击Add按钮注册2、下载证书注册完用户,自然迫不及待要弄到一个证书了,在ejbca用户界面中,打开EnrollCreateBrowserCertificate菜单输入用户名和密码,点击OK按钮,进入下面的页面Keylength选择2048bits;Certificateprofile选择ENDUSER,点击Enroll按钮下载证书3、吊销证书管理员发现用户证书被人盗用了,好办,吊销它ejbca管理员界面中,打开RAFunctionsSearchEndEntities菜单。Searchendentitieswithstatus处下拉框选择All,点击右边的Search按钮查看用户信息下列图省略其他列勾选需要吊销的用户,点击表格下方的RevokeSelected按钮,吊销用户4、更新证书用户上次申请的证书到期了,要更换新的证书ejbca管理员界面中,打开RAFunctionsSearchEndEntities菜单。Searchendentitieswithstatus处下拉框选择All,点击右边的Search按钮查看用户信息下列图省略其他列点击需要更新证书用户的最右边列中的EditEndEntity超链接,编辑用户设置Status为New,点击右边的Save按钮。然后输入新密码,其他项保持不变,点击页面最下方的Save按钮保存设置5、根证书ejbca作为一个CA,有它本人的根证书ejbca用户界面中,打开RetrieveFetchCACertificates菜单,能够下载不同格式的根证书6、申请tomcat服务器证书以上方式能够管理普通用户用的阅读器证书,格式为p12,tomcat服务器用的证书格式为jks,怎么申请呢?用户注册时,证书模板选择SERVER,CA选择dev,Token选择JKSfile,其他项的值不变下载证书时,在ejbca用户界面中,打开EnrollCreateKeystore菜单,输入用户名与密码,进入下面的页面Keylength选择2048bits;Certificateprofile选择SERVER,点击Enroll按钮下载证书其他服务器证书格式大同小异,相信你能够探索出来!使用webservice构建本人的CA系统ejbca系统固然安装好了,可以以管理数字证书,但是,我们所有的操作都在ejbca提供的界面中执行,先不讲全部是英文,单单它里面很多配置项就让人眼花缭乱,很多配置项要么是固定的,要么是不需要的,因而,最合理的做法是在ejbca之上构建一个中间层,用户访问中间层提供的证书管理服务,中间层的服务则使用ejbca实现,正好ejbca提供了完好的webservice接口中间层只需要提供数字证书的注册、下载、吊销、更新即可,更多的功能当然可以以实现,看详细需求了,下面介绍这个中间层的基本实现经过1、superadmin.jks证书ejbca提供的webservice接口需要证书认证,官方源码给出的例子中使用的就是superadmin超级管理员的证书,但格式是jks,因而我们需要弄到superadmin.jks证书,通过工具转换是能够的,但ejbca能够直接生成对superadmin用户执行更新操作,保存之前,修改下面项的值为JKSfile根据下载普通用户证书的步骤下载superadmin的jks格式证书2、初始化webservice连接有了superadmin.jks证书,我们就能够用它来连接webservice服务了,但是,必须将webservice所需的jar包添加到工程中,这些jar包是下面两个目录下的所有jar/usr/java/ejbca-ce-6.3.1.1/dist/ejbca-ws-cli/lib/usr/java/ejbca-ce-6.3.1.1/dist/ejbca-ws-cli然后在代码中初始化webservice连接publicvoidinit()if(!newFile(certPath).exists()return;CryptoProviderTools.installBCProvider();System.setProperty(.ssl.trustStore,d:/superadmin.jksSystem.setProperty(.ssl.trustStorePassword,123456System.setProperty(.ssl.keyStore,d:/superadmin.jksSystem.setProperty(.ssl.keyStorePassword,123456QNameqname=newQName(:/ws.protocol.core.ejbca.org/,EjbcaWSServicetryEjbcaWSServiceservice=newEjbcaWSService(newURL(s:/ca.test:8443/ejbca/ejbcaws/ejbcaws?wsdl),qname);EjbcaWSejbcaWS=service.getEjbcaWSPort();catch(Exceptione)注意:连接地址只能是域名,这个域名是安装ejbca时为ejbca服务器指定的,所以连接ejbca提供的webservice接口服务的机器要配置hosts172.17.210.124ca.test初始化的目的是拿到EjbcaWS对象的实例,接下来的数字证书的注册、下载等服务均基于它3、实现数字证书管理服务查看用户能否已经注册privatebooleanisExist(Stringusername)throwsExceptionUserMatchusermatch=newUserMatch();usermatch.setMatchwith(UserMatch.MATCH_WITH_USERNAME);usermatch.setMatchtype(UserMatch.MATCH_TYPE_EQUALS);usermatch.setMatchvalue(username);tryListUserDataVOWSusers=ejbcaWS.findUser(usermatch);if(users!=nullusers.size()0)returntrue;elsereturnfalse;catch(Exceptione)thrownewException(检查用户+username()+能否存在时出错:+e.getMessage();用户注册与更新,用的都是editUser()方法,因而要先判定能否存在publicvoideditUser()throwsExceptionUserDataVOWSuserData=newUserDataVOWS();userData.setUsername(testname/用户名userData.setPassword(123456/密码userData.setClearPwd(false);/默认userData.setSubjectDN(CN=+testname+,OU=+testou+,O=+testo+,C=cn+,telephoneNumber=+1234567890);/设置唯一甄别名Stringpattern=yyyy-MM-ddHH:mm:ssZZ/ISO8601标准时间格式userData.setStartTime(DateFormatUtils.format(newDate(),pattern);/证书有效起始日期userData.setEndTime(DateFormatUtils.format(DateUtils.addDays(newDate(),100),pattern);/结束日期userData.setCaName(test/ca名称,ejbca的名称userData.setSubjectAltName(null);userData.setEmail(testtest/邮件地址userData.setStatus(UserDataVOWS.STATUS_NEW);/状态为newuserData.setTokenType(UserDataVOWS.TOKEN_TYPE_P12);/设置p12格式证书userData.setEndEntityProfileName(user/终端实体模板userData.setCertificateProfileName(user/证书模板tryejbcaWS.editUser(userData);catch(Exceptione)thrownewException(e.getMessage();代码中有几处值得注意的,终端实体模板user和证书模板user需要在ejbca管理员界面中配置,并且终端实体模板user中要配置开启SubjectDN的属性如CN、OU、O、C、telephoneNumber等,还要允许修改startTime和endTime吊销证书publicvoidrevoke(Stringusername)throwsServiceExceptiontryejbcaWS.revokeUser(username,RevokedCertInfo.REVOCATION_REASON_UNSPECIFIED,false);catch(Exceptione)创立证书privatevoidcreateCert(Stringusername,Stringpassword,Stringpath)throwsExceptionFileOutputStreamfileOutputStream=null;try/创立证书文件KeyStoreksenv=ejbcaWS.pkcs12Req(username,password,null,2048,AlgorithmConstants.KEYALGORITHM_RSA);java.security.KeyStoreks=KeyStoreHelper.getKeyStore(ksenv.getKeystoreData(),PKCS12,password);fileOutputStream=newFileOutputStream(path+File.separator+username+.p12ks.store(fileOutputStream,password.toCharArray();/创立密码文件FilepwdFile=newFile(path+File.separator+username+.pwdpwdFile.createNewFile();BufferedWriterout=newBufferedWriter(newFileWriter(pwdFile);out.write(password);out.flush();out.close();catch(Exceptione)thrownewException(用户+username+证书创立失败:+e.getMessage();finallyif(fileOutputStream!=null)tryfileOutputStream.close();catch(IOExceptione)证书创立在服务器上,用户调用下载证书的接口服务,应该返回一个下载地址,这里介绍用nginx作为文件下载服务器,参考:/cnblogs/ywlaker/p/6129872.一文介绍的关于nginx的部分到此为止,ejbca构建的ca系统已经完成,当然,上述只是核心代码,怎么运行、部署就不介绍了,下面简单介绍s基本原理与数字证书的使用s基本原理与数字证书的使用首先,介绍下密码学的基本知识,我们从下面的加密通信模型开场我向朋友发送一条消息有时间一起吃饭吗,实际在网络中传输的是加密后的数据,而不是原文,只是加密和解密经过对我和朋友是透明的1、对称与非对称加密上述通信经过中,假如加密与解密使用一样的密钥,称为对称加密,假如使用不同的密钥,称为非对称加密对称加密的特点是速度快,可加密的数据量大;非对称加密的特点是速度慢,因而只用来加密少量数据,但极难破解非对称加密经过中使用的两个不同的密钥,一个称为私钥,一个称为公钥,它们逐一对应,称为密钥对,公钥能够给任何人使用,但私钥必须本人保持,一旦私钥泄露,这个密钥对就应该被抛弃密钥对有两个非常重要的特点:1、私钥能够导出公钥,但公钥无法导出私钥;2、经私钥加密的内容只能由公钥解密,经公钥加密的内容也只能由私钥解密。这两个特点有两个重要用处:1、私钥持有者用私钥加密内容,发送给公钥持有者解密,验证私钥持有者的身份。由于公钥能解密的内容,只能是由私钥加密的;2、公钥持有者用公钥加密内容,发送给私钥持有者解密,保证内容安全。由于只要私钥能解密,即便内容被截获,截获者也无法知道内容是什么2、数字证书数字证书是一个文件,包含了使用者的身份信息、以及权威机构CA的数字签名,就向我们的居民身份证一样,数字证书是网络身份证,用于验证互联网上证书持有者的身份颁发数字证书的机构叫CA,全世界只要少数权威的CA,由于颁发出去的证书它们是要负法律责任的,所以向它们申请证书也要缴费,我们本人搭建的ejbca颁发的证书只合适在企业内部使用,这个CA是没有权利向互联网上其他商业公司颁发证书的有了数字证书,只要配置服务开启s就能够使用数字证书了s对于数字证书的认证包括单向认证与双向认证,单向认证只由客户端验证服务器,双向认证则两者互相验证,只要验证不通过,通信就自动中断,下面介绍通信的流程以及怎样在tomcat中配置3、s单向认证单向认证的两个实体单向认证的流程如下列图扼要讲明如下客户端访问服务器服务器响应客户端,发送服务器证书给客户端客户端查询受信任根证书颁发机构,验证服务器证书客户端验证完服务器证书,生成密钥对及会话密钥,与服务器协商会话密钥会话密钥协商完成,开场安全加密通信tomcat开启s单向认证的配置Connectorport=8443protocol=org.apache.coyote.11.Http11ProtocolmaxThreads=150SSLEnabled=truescheme=ssecure=trueclientAuth=falsesslProtocol=TLSkeystoreFile=D:omcat.jkskeystorePass=123456/4、s双向认证双向认证的两个实体双向认证的流程如下列图扼要讲明如下客户端访问服务器服务器响应客户端,发送服务器证书给客户端客户端查询受信任根证书颁发机构,验证服务器证书验证完服务器证书,客户端发送客户端证书给服务器服务器查询信任库或通过证书链,验证客户端证书客户端与服务器协商会话密钥加密方案客户端与服务器协商会话密钥会话密钥协商完成,开场安全加密通信tomcat开启s双向认证的配置Connectorport=8443protocol=org.apache.coyote.11.Http11ProtocolmaxThreads=150SSLEnabled=truescheme=ssecure=trueclientAuth=truesslProtocol=TLSkeystoreFile=D:omcat.jkskeystorePass=123456truststoreFile=D:omcat.jkstruststorePass=123456/