本文转自:
数字证书简介及Java编码实现
CA认证原理以及实现
java CA证书制作和代码中使用

名词大意

秘钥库:存储了公钥私钥信息,一个秘钥库可以存储多对的密钥对(密钥对可以理解为就是数字证书),通过alias别名来取出需要的密钥对,存放于服务器xxx.keystore文件
数字证书:只能存储公钥,可以从xxxx.keystore中导出某个密钥对公钥证书,存放于客户端xxx.cer文件

java使用数字证书

Java 6提供了完善的数字证书管理实现,我们几乎无需关注,仅通过操作密钥库数字证书就可完成相应的加密解密签名验签过程。

密钥库管理私钥数字证书管理公钥,公钥和私钥分属消息传递双方,进行加密消息传递

CertificateCoder工具类

 /***** 获得私钥,获得私钥后,通过RSA算方法实现进行"私钥加密,公钥解密"和"公钥加密,私钥解密"操作* @param keyStorePath 密钥库路径* @param alias 别名* @param keystore_password 秘钥库密码* @param ca_password 证书密码* @return  私钥*/private static PrivateKey getPrivateKeyByKeyStore(String keyStorePath, String alias, String keystore_password,String ca_password)throws Exception{//获得密钥库KeyStore ks = getKeyStore(keyStorePath,keystore_password);//获得私钥return  (PrivateKey)ks.getKey(alias, ca_password.toCharArray());}/***** 由Certificate获得公钥,获得公钥后,通过RSA算方法实现进行"私钥加密,公钥解密"和"公钥加密,私钥解密"操作* @param certificatePath  证书路径* @return 公钥*/private static PublicKey getPublicKeyByCertificate(String certificatePath)throws Exception {//获得证书Certificate certificate = getCertificate(certificatePath);//获得公钥return certificate.getPublicKey();}/***** 加载数字证书,JAVA 6仅支持x.509的数字证书* @param certificatePath  证书路径* @return   证书* @throws Exception*/private static Certificate getCertificate(String certificatePath) throws Exception{//实例化证书工厂CertificateFactory certificateFactory = CertificateFactory.getInstance("x.509");//取得证书文件流FileInputStream in = new FileInputStream(certificatePath);//生成证书Certificate certificate = certificateFactory.generateCertificate(in);//关闭证书文件流in.close();return certificate;}/***** 获得Certificate* @param keyStorePath 密钥库路径* @param alias 别名* @param keystore_password  秘钥库密码* @return  证书* @throws Exception*/private static Certificate getCertificate(String keyStorePath,String alias,String keystore_password) throws Exception{//由密钥库获得数字证书构建数字签名对象//获得密钥库KeyStore ks = getKeyStore(keyStorePath,keystore_password);//获得证书return ks.getCertificate(alias);}/***** 加载密钥库,加载了以后,我们就能通过相应的方法获得私钥,也可以获得数字证书* @param keyStorePath 密钥库路径* @param keystore_password 密码* @return  密钥库* @throws Exception*/private static KeyStore getKeyStore(String keyStorePath,String keystore_password) throws Exception{//实例化密钥库KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());//获得密钥库文件流FileInputStream is = new FileInputStream(keyStorePath);//加载密钥库ks.load(is,keystore_password.toCharArray());//关闭密钥库文件流is.close();return ks;}/***** 私钥加密* @param data  待加密的数据* @param keyStorePath  密钥库路径* @param alias  别名* @param keystore_password   秘钥库密码* @param ca_password   证书密码* @return  加密数据* @throws Exception*/public static byte[] encryptByPriateKey(byte[] data,String keyStorePath,String alias,String keystore_password,String ca_password) throws Exception{//获得私钥PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath,alias,keystore_password,ca_password);//对数据加密Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE,privateKey);return cipher.doFinal(data);}/***** 私钥解密* @param data  待解密数据* @param keyStorePath 密钥库路径* @param alias  别名* @param keystore_password   秘钥库密码* @param ca_password   证书密码* @return  解密数据* @throws Exception*/public static byte[] decryptByPrivateKey(byte[] data,String keyStorePath,String alias,String keystore_password,String ca_password) throws Exception{//取得私钥PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath,alias,keystore_password,ca_password);//对数据解密Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE,privateKey);return cipher.doFinal(data);}/***** 公钥加密* @param data  等待加密数据* @param certificatePath  证书路径* @return   加密数据* @throws Exception*/public static byte[] encryptByPublicKey(byte[] data,String certificatePath) throws Exception{//取得公钥PublicKey publicKey = getPublicKeyByCertificate(certificatePath);//对数据加密Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE,publicKey);return cipher.doFinal(data);}/***** 公钥解密* @param data  等待解密的数据* @param certificatePath  证书路径* @return  解密数据* @throws Exception*/public static byte[] decryptByPublicKey(byte[] data,String certificatePath)throws Exception{//取得公钥PublicKey publicKey = getPublicKeyByCertificate(certificatePath);//对数据解密Cipher cipher = Cipher.getInstance(publicKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);return cipher.doFinal(data);}/***** @param sign  签名* @param keyStorePath 密钥库路径* @param alias 别名* @param keystore_password   秘钥库密码* @param ca_password   证书密码* @return 签名* @throws Exception*/public static byte[] sign(byte[] sign,String keyStorePath,String alias,String keystore_password,String ca_password)throws Exception{//获得证书X509Certificate x509Certificate = (X509Certificate) getCertificate(keyStorePath,alias,keystore_password);//构建签名,由证书指定签名算法Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());//获取私钥PrivateKey privateKey = getPrivateKeyByKeyStore(keyStorePath,alias,keystore_password,ca_password);//初始化签名,由私钥构建signature.initSign(privateKey);signature.update(sign);return signature.sign();}/***** 验证签名* @param data  数据* @param sign  签名* @param certificatePath  证书路径* @return  验证通过为真* @throws Exception*/public static boolean verify(byte[] data,byte[] sign,String certificatePath) throws Exception{//获得证书X509Certificate x509Certificate = (X509Certificate)getCertificate(certificatePath);//由证书构建签名Signature signature = Signature.getInstance(x509Certificate.getSigAlgName());//由证书初始化签名,实际上是使用了证书中的公钥signature.initVerify(x509Certificate);signature.update(data);return signature.verify(sign);}

CertificateCoderTest测试类

/** 秘钥库密码. */private static final String keystore_password  = "123456";/** 证书密码. */private static final String ca_password   = "111111";/** 证书别名. */private static final String alias = "ljw";/** 密钥库文件. */private static final String keyStorePath = "F:\\Certifacate\\ljw.keystore";/** 数字证书文件. */private static final String certificatePath = "F:\\Certifacate\\ljw.cer";//我们假定密钥库文件yale.keystore存储在D盘根目录,数字证书文件yale.cer也存储在D盘根目录/***** 公钥加密---私钥解密* @throws Exception*/@Testpublic void test1() throws Exception{System.err.println("公钥加密---私钥解密");String inputStr = "数字证书";byte[] data = inputStr.getBytes();//公钥加密byte[] encrypt = CertificateCoder.encryptByPublicKey(data, certificatePath);//私钥解密byte[] decrypt = CertificateCoder.decryptByPrivateKey(encrypt, keyStorePath, alias, keystore_password, ca_password);String outputStr = new String(decrypt);System.err.println("加密前:\n" + inputStr);System.err.println("解密后:\n" + outputStr);}/***** 私钥加密---公钥解密* @throws Exception*/@Testpublic  void test2()throws Exception{System.err.println("私钥加密---公钥解密");String inputStr = "数字签名";byte[] data = inputStr.getBytes();//私钥加密byte[] encodedData = CertificateCoder.encryptByPriateKey(data, keyStorePath, alias, keystore_password, ca_password);//公钥解密byte[] decodeData = CertificateCoder.decryptByPublicKey(encodedData, certificatePath);String outputStr = new String (decodeData);System.err.println("加密前:\n" + inputStr);System.err.println("解密后:\n" + outputStr);}@Testpublic  void testSign()throws Exception{String inputStr = "签名";byte[] data = inputStr.getBytes();System.err.println("私钥签名---公钥验证");//产生签名byte[] sign = CertificateCoder.sign(data, keyStorePath, alias, keystore_password, ca_password);System.err.println("签名:\n" + sign);//验证签名boolean status = CertificateCoder.verify(data, sign, certificatePath);System.err.println("状态:\n " + status);}

java 使用CA认证相关推荐

  1. CA认证——使用吉大正元认证系统为门户把关

    最近使用JeeCMS的系统需要用到CA认证,之前很是苦逼了一段时间毕竟是第一次接触类似的东西,没有专业的工程师指导,只给了一个demo和几个文档,当时真的是无从下手.幸好通过两个熬夜,不断的尝试终于成 ...

  2. 吉大正元php,吉大正元CA认证服务器与客户端以及配置文档

    [实例简介] 吉大正元CA认证服务器与客户端以及配置文档,有服务器和客户端,有配置文档,一般人都可以看得懂. [实例截图] [核心代码] I网关报文认证Java版BSDemo ├── Debugger ...

  3. HTTPS与CA认证

    1. HTTP 协议 在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念. 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层. HT ...

  4. 互联网协议 — TLS — CA 认证

    目录 文章目录 目录 基本概念 PKI CA 机构 X.509 标准 数字证书的结构 数字证书的类型 数字证书的格式 CA 证书认证流程 浏览器 CA 认证流程 基本概念 PKI PKI(Public ...

  5. Openssl搭建私有CA认证

    概述 CA英文全称Certification Authority,即数字证书认机构.从广义上来说,CA是负责发放和管理数字证书的权威机构,并作为用户数字认证中受信任的第三方,承担公钥体系(PKI)中公 ...

  6. LNMP与CA认证的童话故事

    在前面的一篇博客中,我已经介绍过,如何通过源码编译安装LAMP,见教你源码编译制作LAMP详细过程 ,这里就介绍下如何编译安装LNMP,以及如何在LNMP中添加ssl认证. LNMP,也叫做LEMP. ...

  7. 浏览器获取CA认证流程

    首先说说证书的签发过程: 服务方 S 向第三方机构CA提交公钥.组织信息.个人信息(域名)等信息并申请认证: CA 通过线上.线下等多种手段验证申请者提供信息的真实性,如组织是否存在.企业是否合法,是 ...

  8. 大型企业CA认证系统部署应用案例解析

    国内某上市公司信息化起步较早,应用系统主要分布于总公司.局公司.处公司三级单位.已经初步实现OA系统的信息整合,信息化工作进一步将围绕信息流.工作流的整合,项目管理系统的建立以及公共基础安全平台建设展 ...

  9. CA认证简单介绍和工作流程

    CA是证书的签发机构,它是PKI的核心.CA是负责签发证书.认证证书.管理已颁发证书的机关.它要制定政策和具体步骤来验证.识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权..  ...

  10. CA认证简单介绍与工作流程

    转载自:https://blog.csdn.net/cnh294141800/article/details/25242765 CA工作原理 数字安全证书利用一对互相匹配的密钥进行加密.解密.每个用户 ...

最新文章

  1. 【转】ActiveMQ消息传送机制以及ACK机制详解
  2. 【ASM学习】普通数据库向ASM实例的迁移(二)
  3. (转)asp和asp.net区别
  4. 【linux】tcpdump抓包
  5. fiddler不能抓取浏览器数据_抓包软件 Fiddler 了解一下?
  6. Java中JDBC进阶教程之数据库的隔离级别!
  7. java file 堵塞_单元测试最终在Java 6中阻塞
  8. 菲尔茨奖得主丘成桐在清华设立数学英才班,比肩清华姚班
  9. mysql 修改数据库的数据库_如何更改MySQL数据库的数据库名
  10. mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...
  11. 基于IDEA的JavaWeb开发环境搭建
  12. 如何利用FNDLOAD更新FORM的Personalization(Moving Personalizations between instances)
  13. 世界上最简单的会计书(资产负债表)
  14. 【札记】Python处理TSV文件以及144790个英语单词的注音、释义、例句的.sql和.tsv文件下载
  15. Java基础知识与集合部分面试题整理
  16. 树莓派串口通信python,【树莓派Pico测评】- AD采集示例及串口通信
  17. vue、Dropdown 下拉菜单、Dropdown属性事件、vue Dropdown 全部下拉菜单、vue Dropdown 全部属性事件
  18. 英语的加减乘除怎么计算机,用英语表示加减乘除法的用法
  19. debussy和nlint常用快捷键
  20. SMTP 和 POP3 协议的区别和联系

热门文章

  1. 关于macbookpro外接显示器(非扩展屏幕,只有一个外接显示器当屏幕)手贱把分辨率设置成1080i(显示器所不支持的分辨率)所造成显示器黑屏并弹出“不支持此视频格式”的解决方法
  2. 985计算机硕士考公,985大学生不愿意考公务员?并不是瞧不起,真实原因有点扎心...
  3. 如何用 Python 和 Pandas 分析犯罪记录开放数据?
  4. 大学物理实验空气比热容比的计算
  5. between and 用法
  6. 苹果电池显示维修_苹果售后政策调整,iPhone非原装电池也提供维修!
  7. 花絮:用StyleGAN Encoder识别并重建国画和油画中的人脸
  8. ResNet论文翻译——中文版
  9. cpu之ALUSrc_Reg1
  10. java的setbounds_Swing-setBounds()用法-入门