http://blog.csdn.net/xanxus46/article/details/9103031
分类: ejbca2013-06-15 21:39 199人阅读 评论(0) 收藏 举报
JBossebjca

研究ejbca源码快一个月了,从openipmp中的老版ejbca到最新的4.0.15,感觉看别人代码实在太痛苦了,而且之前自己对ejb并不是很熟悉,还必须自己重新学了一点基本的ejb知识。

我最开始是研究openipmp的,里面自带就有ejbca的jar包,所以一开始我看openipmp怎么调用ejbca就行,但是由于openipmp实在太老了,它使用的ejbca是遵守ejb2.1标准的,调用起来实在太复杂太麻烦了,所以经过一周后我彻底放弃它,重新看最新版的ejbca。

最新版的ejbca可以从官网下,官网下的包括java源码、jsp和一堆云里雾里的文档。但注意官网下的java源码并不是一个完整eclipse工程,我们需要修改源码的话,还是用svn检出eclipse工程的源码比较好。svn检出地址可以从http://ejbca.org/repository.html找到,是https://svn.cesecore.eu/svn/ejbca/branches/Branch_4_0/ejbca

检出完ejbca后,我们可以参考维基上关于ejbca的api http://wiki.ejbca.org/developers#toc6,我们首先导入工程,然后会发现有编译错误,因为工程使用了JBOSS5_HOME类变量,我们需要添加该变量,步骤是Window->Preferences->Java->Build Path->Classpath,指向jboss的根目录。设置完这个后还是不行,我们要使用ant命令编译得到一些必需的类,就在ejbca的根目录下使用ant,或者使用eclipse集成的ant。(注意,千万不要在windows X64上使用ejbca,因为windows X64的jdk缺少一个库,好像是sun的一个关于security的库,而ejbca必需这个库)。

做完以上步骤后,应该就没有问题了,我们现在就需要做最痛苦的事情——读代码。还好,ejbca的注释还是比较详尽的,而且都是javadoc注释,在eclipse查看很方便。好了,废话不多说,马上进入正题,使用ejbca注册新用户并且为用户导出证书。

注册新用户:ejbca使用方式有两种:web和命令行。web很简单,网上很多教程,这里主要介绍命令行方式。我们可以找到modules/ejbca-ejb-cli/src这个包里面都是使用命令行方式操作ejbca,而注册新用户是属于ra的操作,我们需要看org.ejbca.ui.cli.ra.RaAddUserCommand类,它的execute方法就是添加一个用户,那我们只需要调用该方法就添加用户,实在不明白这么好用的方法,ejbca的官方api为什么不给出,但是这个方法是不推荐的,因为注意到execute方法的参数是一个string数组,这就意味着我们可以出错的概率大大增加,他实际上用的是UserAdminSession的addUser方法,这个方法有很多重载方法,其中官方推荐的是使用一个userDataVo的对象作为注册参数,的确这比较好。然后下面是我写的一个junit测试用例(PS:舔一下Junit的菊花,junit确实是一个好东东)。

[java] view plaincopy
  1. public class AddUser {
  2. RaAddUserCommand raCommand = null;
  3. @Before
  4. public void setUp() throws Exception {
  5. raCommand = new RaAddUserCommand();
  6. }
  7. @Test
  8. public void test() {
  9. String[] args = { "", "xanxus1", "12345",
  10. "CN=xanxus", "NULL", "AdminCA1",
  11. "xanxusiou@163.com", "2", "P12" };
  12. try {
  13. raCommand.execute(args);
  14. } catch (ErrorAdminCommandException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. }
  19. }

这里解释一下参数的含义,第一个是没意义的,所以为空字符串,接着是用户名,密码,dn(这个需要注意,必须要有cn,而且cn必须是唯一的),subjectAltName(这个没什么用,就NULL吧),ca名字,用户邮箱,用户类型(2是终端用户),最后的是证书类型(这里是pkcs12)。

为用户导出证书:这里就不能简单的使用junit测试了,因为我们需要使用ejb远程调用,所以我们需要创建一个web工程,放在jboss环境下。然后我们创建一个servlet,在dopost里面导出证书吧(注意,必须是post里),代码如下:

[java] view plaincopy
  1. protected void doPost(HttpServletRequest request,
  2. HttpServletResponse response) throws ServletException, IOException {
  3. // TODO Auto-generated method stub
  4. response.setContentType("text/html;charset=UTF-8");
  5. String name = request.getParameter("name");
  6. String password = request.getParameter("password");
  7. try {
  8. Context jndiContext = new InitialContext();
  9. UserAdminSessionLocal userAdminSession = (UserAdminSessionLocal) jndiContext
  10. .lookup("ejbca/UserAdminSessionBean/local");
  11. AuthenticationSessionLocal authenticationSession = (AuthenticationSessionLocal) jndiContext
  12. .lookup("ejbca/AuthenticationSessionBean/local");
  13. CAAdminSessionLocal caAdminSession = (CAAdminSessionLocal) jndiContext
  14. .lookup("ejbca/CAAdminSessionBean/local");
  15. KeyRecoverySessionLocal keyRecoverySession = (KeyRecoverySessionLocal) jndiContext
  16. .lookup("ejbca/KeyRecoverySessionBean/local");
  17. SignSessionLocal signSession = (SignSessionLocal) jndiContext
  18. .lookup("ejbca/RSASignSessionBean/local");
  19. EndEntityProfileSessionLocal endEntityProfileSession = (EndEntityProfileSessionLocal) jndiContext
  20. .lookup("ejbca/EndEntityProfileSessionBean/local");
  21. Admin admin = new Admin(Admin.TYPE_PUBLIC_WEB_USER,
  22. request.getRemoteAddr());
  23. UserDataVO user = userAdminSession.findUser(new Admin(
  24. Admin.TYPE_PUBLIC_WEB_USER), name);
  25. GlobalConfigurationSessionLocal globalConfigurationSession = (GlobalConfigurationSessionLocal) jndiContext
  26. .lookup("ejbca/GlobalConfigurationSessionBean/local");
  27. RaAdminSessionLocal raAdminSession = (RaAdminSessionLocal) jndiContext
  28. .lookup("ejbca/RaAdminSessionBean/local");
  29. CertificateProfileSessionLocal certificateProfileSession = (CertificateProfileSessionLocal) jndiContext
  30. .lookup("ejbca/CertificateProfileSessionBean/local");
  31. boolean usekeyrecovery = false;
  32. usekeyrecovery = globalConfigurationSession
  33. .getCachedGlobalConfiguration(admin).getEnableKeyRecovery();
  34. // 生成证书
  35. boolean savekeys = user.getKeyRecoverable()
  36. && usekeyrecovery
  37. && (user.getStatus() != UserDataConstants.STATUS_KEYRECOVERY);
  38. boolean loadkeys = (user.getStatus() == UserDataConstants.STATUS_KEYRECOVERY)
  39. && usekeyrecovery;
  40. int endEntityProfileId = user.getEndEntityProfileId();
  41. int certificateProfileId = user.getCertificateProfileId();
  42. EndEntityProfile endEntityProfile = endEntityProfileSession
  43. .getEndEntityProfile(admin, endEntityProfileId);
  44. boolean reusecertificate = endEntityProfile
  45. .getReUseKeyRecoveredCertificate();
  46. GenerateToken token = new GenerateToken(authenticationSession,
  47. userAdminSession, caAdminSession, keyRecoverySession,
  48. signSession);
  49. KeyStore keyStore = token.generateOrKeyRecoverToken(admin, name,
  50. password, user.getCAId(), "1024",
  51. AlgorithmConstants.KEYALGORITHM_RSA, false, loadkeys,
  52. savekeys, reusecertificate, endEntityProfileId);
  53. System.out.println("size:" + keyStore.size());
  54. sendP12Token(keyStore, name, password, response);
  55. } catch (Exception exception) {
  56. exception.printStackTrace();
  57. }
  58. }
  59. private void sendP12Token(KeyStore ks, String username, String kspassword,
  60. HttpServletResponse out) throws Exception {
  61. ByteArrayOutputStream buffer = new ByteArrayOutputStream();
  62. ks.store(buffer, kspassword.toCharArray());
  63. out.setContentType("application/x-pkcs12");
  64. out.setHeader("Content-disposition", "filename=" + username + ".p12");
  65. out.setContentLength(buffer.size());
  66. buffer.writeTo(out.getOutputStream());
  67. out.flushBuffer();
  68. buffer.close();
  69. }

首先,导出用户的前提是你必须已经在jboss里部署好ejbca,然后第一步是使用jndi找出远程对象,使用lookup方法,参数可以从jboss的jndiview里找出,注意这里都是local对象,接着就是使用GenerateToken对象生成keystore,有一个false参数代表生成的是p12证书,还能指定密码的长度和算法,最后就是使用response输出证书。

以上就是目前为止我看ejbca的成果,以后会继续更新,ejbca资料实在太少,希望大家一起努力,共同研究。

EJBCA使用之注册用户及创建证书相关推荐

  1. Tomcat应用部署:打war包、在Tomcat中注册用户角色、创建虚拟目录和域名

    #1.打war包 1)命令:jar -cvf xx.war * (备注:执行打包的前提条件:目录必须切换到打包项目的webRoot(webContent)目录下) 备注:1. c:创建新的文档v:显示 ...

  2. 【Kubernetes 018】cfssl创建证书并结合RBAC的RoleBinding配置新用户config文件操作详解

    安全性是企业生产环境中的头等大事,对于访问同一集群的不同用户或者用户组来说,将权限分级是很有必要的.和很多云厂商一样,k8s也是采用按照角色和用户绑定的方式来分配权限的,这一节我们就来实际操作下,新建 ...

  3. Linux创建新用户并使用证书远程登录

    因业务需要,需要在服务器上创建多用户,方便多人维护,那么可以利用证书登录创建多用户登录,然后用户如果需要root权限再手动切换即可,下面简单介绍下在Linux上如何进行多用户创建以及使用证书登录. 添 ...

  4. 苹果开发者账号官方翻译篇-创建证书

    *证书的概述 在开发应用程序的过程中,您将创建不同的证书类型,以便在不同的上下文中使用.您将为iOS.tvOS和watchOS应用程序使用相同的证书集,为macOS应用程序使用不同的证书集.您将使用开 ...

  5. WebAPi之SelfHost自创建证书启动Https疑难解惑及无法正确返回结果

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

  6. 通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书)

    通过CertEnroll在CA上(1创建证书请求2得到证书3安装证书) 原文网址:http://www.cnblogs.com/rippleyong/archive/2008/12/15/135541 ...

  7. 如何在Domino中使用文本文件注册用户

    具体的步骤如下: 1.先用以下的格式创建一个文本文件(每个用户一行): ZhangSan;;;;passw0rd;e:\id\603server;zhangsan.id;603server/r6dom ...

  8. 如何判断注册用户是否已经存在(membership验证)

    如何判断注册用户是否已经存在(membership验证) MembershipCreateStatus iStatus;         Membership.CreateUser(username, ...

  9. 10.9 自动注册DSN和创建表

    10.9 自动注册DSN和创建表 在开始编写自己的数据库应用程序时,读者很快会遇到两个令人头痛的问题.一是在访问ODBC数据源前,必须在ODBC管理器中手工注册DSN(数据源名).这样的应用程序要求用 ...

最新文章

  1. 【java】兴唐第二十五节课小程序学生卡转账小系统(自己写的异常)
  2. 机器学习工作流程第一步:如何用Python做数据准备?
  3. Ngrok: 使用 Ngrok 实现内网穿透
  4. python读取和存入json文件
  5. 离散数学图论旅行规划问题_2020年MathorCup高校数学建模挑战赛——C 题 仓内拣货优化问题...
  6. 一天学习一个设计模式之命令模式
  7. mysql5.7.29下载与安装并设置密码
  8. 37. customer payment(1)
  9. 从零开始学centos(一)
  10. PHP之GD图像处理
  11. Python功能实现:为pdf电子书籍生成书签目录
  12. 聊一聊积分墙的那些事儿
  13. 阿拉伯数字金额转换为汉语大写
  14. Android uiautomatorviewer无法启动
  15. oracle 赋予dorp,ORACLE高级操作
  16. oppo便签误删怎么办_OPPO手机便签删除了怎么恢复?有无需登录云端就可以恢复的备忘录软件吗...
  17. 【原创】VBA学习笔记(15)VBA的参数传递:ByVal 和 ByRef 的区别
  18. 电脑使用者的眼睛保护须知
  19. 《学习总章》硬件工程师学习首页
  20. 自动驾驶面临的困难以及中国在自动驾驶的优势

热门文章

  1. 2021- 10 -9 LeetCode 958. 二叉树的完全性检验(待补完)
  2. 使用javabean类用户注册
  3. 【小练习05】HTML+CSS--淘宝商铺小页面
  4. 用java实现计算器加减乘除功能,并能够循环接收新的数据,通过用户交互实现
  5. 利用MySQL创建一个简单的employee员工表并修改表
  6. Java-Web JSP指令、javabean和EL表达式
  7. nginx服务器远程无法访问,客户端连接Nginx偶尔提示无法连接到远程服务器
  8. 剑指Offer #08 跳台阶(递推)
  9. 剑指Offer #04 重建二叉树(递归)
  10. java camel from uri_java – 如何将Camel属性加载到Bean中?