java 使用CA认证
本文转自:
数字证书简介及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认证相关推荐
- CA认证——使用吉大正元认证系统为门户把关
最近使用JeeCMS的系统需要用到CA认证,之前很是苦逼了一段时间毕竟是第一次接触类似的东西,没有专业的工程师指导,只给了一个demo和几个文档,当时真的是无从下手.幸好通过两个熬夜,不断的尝试终于成 ...
- 吉大正元php,吉大正元CA认证服务器与客户端以及配置文档
[实例简介] 吉大正元CA认证服务器与客户端以及配置文档,有服务器和客户端,有配置文档,一般人都可以看得懂. [实例截图] [核心代码] I网关报文认证Java版BSDemo ├── Debugger ...
- HTTPS与CA认证
1. HTTP 协议 在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念. 1.1 HTTP 协议介绍 HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的应用层. HT ...
- 互联网协议 — TLS — CA 认证
目录 文章目录 目录 基本概念 PKI CA 机构 X.509 标准 数字证书的结构 数字证书的类型 数字证书的格式 CA 证书认证流程 浏览器 CA 认证流程 基本概念 PKI PKI(Public ...
- Openssl搭建私有CA认证
概述 CA英文全称Certification Authority,即数字证书认机构.从广义上来说,CA是负责发放和管理数字证书的权威机构,并作为用户数字认证中受信任的第三方,承担公钥体系(PKI)中公 ...
- LNMP与CA认证的童话故事
在前面的一篇博客中,我已经介绍过,如何通过源码编译安装LAMP,见教你源码编译制作LAMP详细过程 ,这里就介绍下如何编译安装LNMP,以及如何在LNMP中添加ssl认证. LNMP,也叫做LEMP. ...
- 浏览器获取CA认证流程
首先说说证书的签发过程: 服务方 S 向第三方机构CA提交公钥.组织信息.个人信息(域名)等信息并申请认证: CA 通过线上.线下等多种手段验证申请者提供信息的真实性,如组织是否存在.企业是否合法,是 ...
- 大型企业CA认证系统部署应用案例解析
国内某上市公司信息化起步较早,应用系统主要分布于总公司.局公司.处公司三级单位.已经初步实现OA系统的信息整合,信息化工作进一步将围绕信息流.工作流的整合,项目管理系统的建立以及公共基础安全平台建设展 ...
- CA认证简单介绍和工作流程
CA是证书的签发机构,它是PKI的核心.CA是负责签发证书.认证证书.管理已颁发证书的机关.它要制定政策和具体步骤来验证.识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权.. ...
- CA认证简单介绍与工作流程
转载自:https://blog.csdn.net/cnh294141800/article/details/25242765 CA工作原理 数字安全证书利用一对互相匹配的密钥进行加密.解密.每个用户 ...
最新文章
- 【转】ActiveMQ消息传送机制以及ACK机制详解
- 【ASM学习】普通数据库向ASM实例的迁移(二)
- (转)asp和asp.net区别
- 【linux】tcpdump抓包
- fiddler不能抓取浏览器数据_抓包软件 Fiddler 了解一下?
- Java中JDBC进阶教程之数据库的隔离级别!
- java file 堵塞_单元测试最终在Java 6中阻塞
- 菲尔茨奖得主丘成桐在清华设立数学英才班,比肩清华姚班
- mysql 修改数据库的数据库_如何更改MySQL数据库的数据库名
- mysql内连接部门平均值_详解MySql基本查询、连接查询、子查询、正则表达查询_MySQL...
- 基于IDEA的JavaWeb开发环境搭建
- 如何利用FNDLOAD更新FORM的Personalization(Moving Personalizations between instances)
- 世界上最简单的会计书(资产负债表)
- 【札记】Python处理TSV文件以及144790个英语单词的注音、释义、例句的.sql和.tsv文件下载
- Java基础知识与集合部分面试题整理
- 树莓派串口通信python,【树莓派Pico测评】- AD采集示例及串口通信
- vue、Dropdown 下拉菜单、Dropdown属性事件、vue Dropdown 全部下拉菜单、vue Dropdown 全部属性事件
- 英语的加减乘除怎么计算机,用英语表示加减乘除法的用法
- debussy和nlint常用快捷键
- SMTP 和 POP3 协议的区别和联系
热门文章
- 关于macbookpro外接显示器(非扩展屏幕,只有一个外接显示器当屏幕)手贱把分辨率设置成1080i(显示器所不支持的分辨率)所造成显示器黑屏并弹出“不支持此视频格式”的解决方法
- 985计算机硕士考公,985大学生不愿意考公务员?并不是瞧不起,真实原因有点扎心...
- 如何用 Python 和 Pandas 分析犯罪记录开放数据?
- 大学物理实验空气比热容比的计算
- between and 用法
- 苹果电池显示维修_苹果售后政策调整,iPhone非原装电池也提供维修!
- 花絮:用StyleGAN Encoder识别并重建国画和油画中的人脸
- ResNet论文翻译——中文版
- cpu之ALUSrc_Reg1
- java的setbounds_Swing-setBounds()用法-入门