「java证书公钥私钥」ca证书公钥私钥

博主:adminadmin 2022-11-27 04:54:04 57

今天给各位分享java证书公钥私钥的知识,其中也会对ca证书公钥私钥进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java使用keytool生成证书的时候怎们样设置公钥和私钥还有keystore密码是什么?

1.私钥公钥不是用户自己输入的,是RSA算法自动生成的,而你输入的密码只是打开那个文件或生成的证书的密码.

2.密码为“changeit”,而如果尝试几次都不成功的话,就到$JAVA_HOME\jre\lib\security\目录下去配就可以了

关于公私钥、各种证书、https基本概念扫盲

最近实习需要写一些生成证书的脚本,借此机会顺便搞清楚了许多关于证书这块的疑惑。说到这一块东西,名词多到爆炸,对称加密、非对称加密、密钥、密钥库、公钥、私钥、CA、证书、数字签名、ssh、https、ssl、keytool、openssl、PKCS、X.509以及令人眼花缭乱的文件后缀名,cer、crt、pem、keystore、jks、key、p12、pfx...

先听我讲个故事,这次我们不用Bob和Alice,听完之后再去看这些概念,绝壁恍然大悟。

故事背景: 这是2018年,为了能够安全的进行通信,假设每个人都有俩把锁,一个叫A锁,一个叫B锁,这俩把锁和一般的锁有点区别,每把锁上即带有自己的锁孔又带有另一把锁的钥匙,因此A锁和B锁既是锁又是钥匙。 A锁和B锁唯一配对,A锁锁住之后,只有B锁可以打开,同样B锁锁住之后,只有A锁可以打开 。其中一把锁是公开的,而一把锁则自己保管,不公开。假设默认A锁是公开的,B锁是私有的。

故事内容: 阿里巴巴子弟小学的小明想给隔壁班的小花写封表白信,为了不被别人看到,他将信放入在信箱中,并用小花的A锁将信箱锁住,因为小花的B锁(同是A锁的钥匙)只有小花自己有,所以除了小花以外的任何人拿到信件,都无法看到信件内容。同样小花要给小明写信,那么也要用小明的A锁对信件内容进行保护。

小明与小花通过就这样聊了有一段时间,后来小花觉得差不多了,可以进入秀恩爱的阶段了,跟小明说,以后写信别tm加密了,又不是银行卡密码,被人看到又能怎么样呢?只要看了之后别瞎改就行了。于是小明在写完信后,把信里每个字的拼音首字母拼凑了一个字符串,并取名为 消息摘要 ,然后仅仅将消息摘要放入信箱,用自己的B锁锁住这个信箱。虽然信件本身没有放入安全的信箱,但小明作为一个情书高手,随便一封信都是上万字,如果其他人对信件内容做任何改变,那么拼音首字母组成的字符串几乎肯定会改变,因此小花拿到信件后,先用小明的A锁(B锁的钥匙)打开信箱,拿到小明的摘要,然后小花再对信件内容做同样的处理(即计算信件每个字的拼音首字母,实际上不会用这么简单的算法,而是会用不可逆的hash算法),计算出的字符串值如与小明的信息摘要一致,说明这封信就是小明写给自己的,没有被任何人篡改。

故事高潮: 事情并没有那么简单,小花发现小明只是在信件里对自己热情似火,平常见了面连声招呼都不打,一副不认识的样子。终于有一天小花忍不住了,当面质问小明,小明却说,我什么时候给你写情书了,自作多情吧...于是小花把昨天刚收到的情书狠狠甩在了小明脸上:“上面落款不是你小明吗?怎么了,怂了?”小明一看上面还真是自己的名字,但是自己写没写信自己还不知道吗?小明把自己的作业本拿给小花,并叫自己的同桌做笔迹鉴定,小花发现笔迹的确不大像,看来是有人恶作剧,冒充小明给自己写情书,哎,好尴尬啊。。。

故事讲完了,文章开头涉及的所有概念都与信息的安全传输有关,可以说,一切都是为了安全。关于通信安全,我们通常有三个基本的需求

我们以上面的故事为例说一下这三点安全需求,一开始小明与小花通过A锁( 对应公钥 )加密,B锁( 对应私钥 )解密的通信方式即符合第一点,信件内容本身被加密,而因为公私钥唯一配对,只有配对的密钥才可以解密,因此很难被第三人破解。

之后,为了秀恩爱,他们采用了B锁( 私钥 )加密,A锁( 公钥 )解密的通信方式,其中用私钥对消息摘要加密后的字符串称为 数字签名 ,这样虽然信件可以被人直接看到,但如果被人篡改掉后可以轻易发现数据被篡改。本来以为满足第一条和第二条就可以安全的通信了,但最后才发现小明根本不是小明!为什么会出现这样的问题?因为“小明”说他是小明,小花就以为他是小明,他没有提供任何证明自己真的是小明的认证。因此要想安全通信,我们还需要一个权威第三方的机构来做身份认证,这个机构就是CA机构,通过认证后,CA机构会颁发权威的证书,而有了证书就可以证明身份,就不会出现身份被假冒的情况。而认证的过程则需要向CA机构提供自己的身份信息以及私钥。

对称加密就是通信双方或多方采用的密钥是一样的。加解密速度快,但不够安全。因为一旦密钥泄露,谁都可以对数据进行解密。非对称加密就是当然就是通信双方使用的密钥不同。而公钥和私钥就是非对称加密的一种方式。比较常用的对称加密算法如

AES、DES,非对称加密比较常见的则有sha256,RSA。

非对称加密算法有俩个密钥,一个公钥,一个私钥。公钥和私钥必须配对出现,一对公钥和一个私钥统称为一个 密钥 ,而 密钥库 中可以存放多个密钥,即多对公私钥。

如果你用github的话,应该注意到github链接有俩种方式。一种是https,一种是ssh,通过https经常需要输密码,而通过ssh则不需要。回忆你设置ssh的步骤,本地生成了一个密钥对,并将公钥上传到了github。每次传输用自动本地私钥加密,服务器用你上传的公钥解密,就不需要手动输入密码了。

keytool和openssl是俩个证书管理工具.keytool是java JDK自带的证书管理工具,使用keytool可以生成密钥,创建证书。只要装了jdk,并正确设置了环境变量,就可以之间通过命令行执行keytool命令来管理证书。

openssl则是一个开源的安全套接字层密码库,功能比keytool更加丰富。

PKCS全称Public-Key Cryptography Standards 即公钥标准,PKCS已经发布了15个标准。

PKCS#12 包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀

X.509 则是一个通用的证书标准,规定了证书应该包含哪些内容,X.509通常有俩种编码方式,一种是二进制编码,另一种是base64编码

X.509#DER 二进制格式证书,常用后缀.cer .crt

X.509#PEM 文本格式证书,常用后缀.pem

因为http是明文传输,非常不安全,因此又提出了ssl(Secure Sockets Layer即安全套接字)层协议,即在原来的基础上又加了一层协议用于保障安全传输,可以认为https=ssl+http。很多人刚开始接触https,用浏览器F12打开控制台后。可能发现数据仍然没有加密。要注意https是 传输层加密 ,浏览器F12控制台你看到的还是应用层的数据。

因为本文主要是概念扫盲,帮助理解,因此关于这部分具体细节不作介绍。

.keystore和.jks和.truststore都是java用来存放密钥的文件

.key nginx中私钥文件

而不同的证书文件后缀都是为了区分不同种类的证书的,主要有俩个分类维度

用Java编写一个程序,生成公钥和私钥对

一:需要包含的包

import java.security.*;

import java.io.*;

import java.util.*;

import java.security.*;

import java.security.cert.*;

import sun.security.x509.*

import java.security.cert.Certificate;

import java.security.cert.CertificateFactory;

二:从文件中读取证书

用keytool将.keystore中的证书写入文件中,然后从该文件中读取证书信息

CertificateFactory cf=CertificateFactory.getInstance("X.509");

FileInputStream in=new FileInputStream("out.csr");

Certificate c=cf.generateCertificate(in);

String s=c.toString();

三:从密钥库中直接读取证书

String pass="123456";

FileInputStream in=new FileInputStream(".keystore");

KeyStore ks=KeyStore.getInstance("JKS");

ks.load(in,pass.toCharArray());

java.security.cert.Certificate c=ks.getCertificate(alias);//alias为条目的别名

四:JAVA程序中显示证书指定信息

System.out.println("输出证书信息:\n"+c.toString());

System.out.println("版本号:"+t.getVersion());

System.out.println("序列号:"+t.getSerialNumber().toString(16));

System.out.println("主体名:"+t.getSubjectDN());

System.out.println("签发者:"+t.getIssuerDN());

System.out.println("有效期:"+t.getNotBefore());

System.out.println("签名算法:"+t.getSigAlgName());

byte [] sig=t.getSignature();//签名值

PublicKey pk=t.getPublicKey();

byte [] pkenc=pk.getEncoded();

System.out.println("公钥");

for(int i=0;ipkenc.length;i++)System.out.print(pkenc[i]+",");

五:JAVA程序列出密钥库所有条目

String pass="123456";

FileInputStream in=new FileInputStream(".keystore");

KeyStore ks=KeyStore.getInstance("JKS");

ks.load(in,pass.toCharArray());

Enumeration e=ks.aliases();

while(e.hasMoreElements())

java.security.cert.Certificate c=ks.getCertificate((String)e.nextElement());

六:JAVA程序修改密钥库口令

String oldpass="123456";

String newpass="654321";

FileInputStream in=new FileInputStream(".keystore");

KeyStore ks=KeyStore.getInstance("JKS");

ks.load(in,oldpass.toCharArray());

in.close();

FileOutputStream output=new FileOutputStream(".keystore");

ks.store(output,newpass.toCharArray());

output.close();

七:JAVA程序修改密钥库条目的口令及添加条目

FileInputStream in=new FileInputStream(".keystore");

KeyStore ks=KeyStore.getInstance("JKS");

ks.load(in,storepass.toCharArray());

Certificate [] cchain=ks.getCertificate(alias);获取别名对应条目的证书链

PrivateKey pk=(PrivateKey)ks.getKey(alias,oldkeypass.toCharArray());获取别名对应条目的私钥

ks.setKeyEntry(alias,pk,newkeypass.toCharArray(),cchain);向密钥库中添加条目

第一个参数指定所添加条目的别名,假如使用已存在别名将覆盖已存在条目,使用新别名将增加一个新条目,第二个参数为条目的私钥,第三个为设置的新口令,第四个为该私钥的公钥的证书链

FileOutputStream output=new FileOutputStream("another");

ks.store(output,storepass.toCharArray())将keystore对象内容写入新文件

八:JAVA程序检验别名和删除条目

FileInputStream in=new FileInputStream(".keystore");

KeyStore ks=KeyStore.getInstance("JKS");

ks.load(in,storepass.toCharArray());

ks.containsAlias("sage");检验条目是否在密钥库中,存在返回true

ks.deleteEntry("sage");删除别名对应的条目

FileOutputStream output=new FileOutputStream(".keystore");

ks.store(output,storepass.toCharArray())将keystore对象内容写入文件,条目删除成功

九:JAVA程序签发数字证书

(1)从密钥库中读取CA的证书

FileInputStream in=new FileInputStream(".keystore");

KeyStore ks=KeyStore.getInstance("JKS");

ks.load(in,storepass.toCharArray());

java.security.cert.Certificate c1=ks.getCertificate("caroot");

(2)从密钥库中读取CA的私钥

PrivateKey caprk=(PrivateKey)ks.getKey(alias,cakeypass.toCharArray());

(3)从CA的证书中提取签发者的信息

byte[] encod1=c1.getEncoded(); 提取CA证书的编码

X509CertImpl cimp1=new X509CertImpl(encod1); 用该编码创建X509CertImpl类型对象

X509CertInfo cinfo1=(X509CertInfo)cimp1.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); 获取X509CertInfo对象

X500Name issuer=(X500Name)cinfo1.get(X509CertInfo.SUBJECT+"."+CertificateIssuerName.DN_NAME); 获取X509Name类型的签发者信息

(4)获取待签发的证书

CertificateFactory cf=CertificateFactory.getInstance("X.509");

FileInputStream in2=new FileInputStream("user.csr");

java.security.cert.Certificate c2=cf.generateCertificate(in);

(5)从待签发的证书中提取证书信息

byte [] encod2=c2.getEncoded();

X509CertImpl cimp2=new X509CertImpl(encod2); 用该编码创建X509CertImpl类型对象

X509CertInfo cinfo2=(X509CertInfo)cimp2.get(X509CertImpl.NAME+"."+X509CertImpl.INFO); 获取X509CertInfo对象

(6)设置新证书有效期

Date begindate=new Date(); 获取当前时间

Date enddate=new Date(begindate.getTime()+3000*24*60*60*1000L); 有效期为3000天

CertificateValidity cv=new CertificateValidity(begindate,enddate); 创建对象

cinfo2.set(X509CertInfo.VALIDITY,cv); 设置有效期

(7)设置新证书序列号

int sn=(int)(begindate.getTime()/1000); 以当前时间为序列号

CertificateSerialNumber csn=new CertificateSerialNumber(sn);

cinfo2.set(X509CertInfo.SERIAL_NUMBER,csn);

(8)设置新证书签发者

cinfo2.set(X509CertInfo.ISSUER+"."+CertificateIssuerName.DN_NAME,issuer);应用第三步的结果

(9)设置新证书签名算法信息

AlgorithmId algorithm=new AlgorithmId(AlgorithmId.md5WithRSAEncryption_oid);

cinfo2.set(CertificateAlgorithmId.NAME+"."+CertificateAlgorithmId.ALGORITHM,algorithm);

(10)创建证书并使用CA的私钥对其签名

X509CertImpl newcert=new X509CertImpl(cinfo2);

newcert.sign(caprk,"MD5WithRSA"); 使用CA私钥对其签名

(11)将新证书写入密钥库

ks.setCertificateEntry("lf_signed",newcert);

FileOutputStream out=new FileOutputStream("newstore");

ks.store(out,"newpass".toCharArray()); 这里是写入了新的密钥库,也可以使用第七条来增加条目

十:数字证书的检验

(1)验证证书的有效期

(a)获取X509Certificate类型对象

CertificateFactory cf=CertificateFactory.getInstance("X.509");

FileInputStream in1=new FileInputStream("aa.crt");

java.security.cert.Certificate c1=cf.generateCertificate(in1);

X509Certificate t=(X509Certificate)c1;

in2.close();

(b)获取日期

Date TimeNow=new Date();

(c)检验有效性

try{

t.checkValidity(TimeNow);

System.out.println("OK");

}catch(CertificateExpiredException e){ //过期

System.out.println("Expired");

System.out.println(e.getMessage());

}catch((CertificateNotYetValidException e){ //尚未生效

System.out.println("Too early");

System.out.println(e.getMessage());}

(2)验证证书签名的有效性

(a)获取CA证书

CertificateFactory cf=CertificateFactory.getInstance("X.509");

FileInputStream in2=new FileInputStream("caroot.crt");

java.security.cert.Certificate cac=cf.generateCertificate(in2);

in2.close();

(c)获取CA的公钥

PublicKey pbk=cac.getPublicKey();

(b)获取待检验的证书(上步已经获取了,就是C1)

(c)检验证书

boolean pass=false;

try{

c1.verify(pbk);

pass=true;

}catch(Exception e){

pass=false;

System.out.println(e);

}

java证书公钥私钥的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于ca证书公钥私钥、java证书公钥私钥的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。