从jks证书中提取公钥和私钥(jks证书转pem证书)

从jks证书中提取公钥和私钥(jks证书转pem证书),第1张

jks转为p12,然后再将p12转为pem

AndroidStudio使用keystore文件对APK进行签名,但快应用中要求使用PEM文件对RPK进行签名。

现有demojks,证书密码为demopwd,转换成pem之后依然使用demopwd作为密码。

提取公钥:

切换到jks证书的存储路径,执行如下命令:keytool -list -rfc -keystore demojks -storepass demopwd

如果出现下图的错误提示:

那么请把demojks文件拷贝到与keytoolexe文件同目录下,keytool在jdk的bin目录下,拷贝之后cmd切换到bin目录重新执行刚才的命令

然后就能在命令行中看到打印的公钥内容(也即Certificate),如下图

提取私钥:

jks文件中的私钥不能直接得到,需要通过openssl将jks文件转换成pkcs12格式后再进行提取。

执行如下命令将demojks文件转换成demopfx文件:

keytool -v -importkeystore -srckeystore demojks -srcstoretype jks -srcstorepass demopwd -destkeystore demopfx -deststoretype pkcs12 -deststorepass demopwd -destkeypass demopwd

命令执行完成后目录下就会多了一个demopfx文件。

然后,执行如下命令便可以将demopfx的私钥导出:

openssl pkcs12 -in demopfx -nocerts -nodes -out demokey

输入密码后会生成一个demokey文件,打开查看内容

一:需要包含的包

import javasecurity;

import javaio;

import javautil;

import javasecurity;

import javasecuritycert;

import sunsecurityx509

import javasecuritycertCertificate;

import javasecuritycertCertificateFactory;

二:从文件中读取证书

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

CertificateFactory cf=CertificateFactorygetInstance("X509");

FileInputStream in=new FileInputStream("outcsr");

Certificate c=cfgenerateCertificate(in);

String s=ctoString();

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

String pass="123456";

FileInputStream in=new FileInputStream("keystore");

KeyStore ks=KeyStoregetInstance("JKS");

ksload(in,passtoCharArray());

javasecuritycertCertificate c=ksgetCertificate(alias);//alias为条目的别名

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

Systemoutprintln("输出证书信息:\n"+ctoString());

Systemoutprintln("版本号:"+tgetVersion());

Systemoutprintln("序列号:"+tgetSerialNumber()toString(16));

Systemoutprintln("主体名:"+tgetSubjectDN());

Systemoutprintln("签发者:"+tgetIssuerDN());

Systemoutprintln("有效期:"+tgetNotBefore());

Systemoutprintln("签名算法:"+tgetSigAlgName());

byte [] sig=tgetSignature();//签名值

PublicKey pk=tgetPublicKey();

byte [] pkenc=pkgetEncoded();

Systemoutprintln("公钥");

for(int i=0;i<pkenclength;i++)Systemoutprint(pkenc[i]+",");

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

String pass="123456";

FileInputStream in=new FileInputStream("keystore");

KeyStore ks=KeyStoregetInstance("JKS");

ksload(in,passtoCharArray());

Enumeration e=ksaliases();

while(ehasMoreElements())

javasecuritycertCertificate c=ksgetCertificate((String)enextElement());

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

String oldpass="123456";

String newpass="654321";

FileInputStream in=new FileInputStream("keystore");

KeyStore ks=KeyStoregetInstance("JKS");

ksload(in,oldpasstoCharArray());

inclose();

FileOutputStream output=new FileOutputStream("keystore");

ksstore(output,newpasstoCharArray());

outputclose();

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

FileInputStream in=new FileInputStream("keystore");

KeyStore ks=KeyStoregetInstance("JKS");

ksload(in,storepasstoCharArray());

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

PrivateKey pk=(PrivateKey)ksgetKey(alias,oldkeypasstoCharArray());获取别名对应条目的私钥

kssetKeyEntry(alias,pk,newkeypasstoCharArray(),cchain);向密钥库中添加条目

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

FileOutputStream output=new FileOutputStream("another");

ksstore(output,storepasstoCharArray())将keystore对象内容写入新文件

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

FileInputStream in=new FileInputStream("keystore");

KeyStore ks=KeyStoregetInstance("JKS");

ksload(in,storepasstoCharArray());

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

ksdeleteEntry("sage");删除别名对应的条目

FileOutputStream output=new FileOutputStream("keystore");

ksstore(output,storepasstoCharArray())将keystore对象内容写入文件,条目删除成功

九:JAVA程序签发数字证书

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

FileInputStream in=new FileInputStream("keystore");

KeyStore ks=KeyStoregetInstance("JKS");

ksload(in,storepasstoCharArray());

javasecuritycertCertificate c1=ksgetCertificate("caroot");

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

PrivateKey caprk=(PrivateKey)ksgetKey(alias,cakeypasstoCharArray());

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

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

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

X509CertInfo cinfo1=(X509CertInfo)cimp1get(X509CertImplNAME+""+X509CertImplINFO); 获取X509CertInfo对象

X500Name issuer=(X500Name)cinfo1get(X509CertInfoSUBJECT+""+CertificateIssuerNameDN_NAME); 获取X509Name类型的签发者信息

(4)获取待签发的证书

CertificateFactory cf=CertificateFactorygetInstance("X509");

FileInputStream in2=new FileInputStream("usercsr");

javasecuritycertCertificate c2=cfgenerateCertificate(in);

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

byte [] encod2=c2getEncoded();

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

X509CertInfo cinfo2=(X509CertInfo)cimp2get(X509CertImplNAME+""+X509CertImplINFO); 获取X509CertInfo对象

(6)设置新证书有效期

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

Date enddate=new Date(begindategetTime()+30002460601000L); 有效期为3000天

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

cinfo2set(X509CertInfoVALIDITY,cv); 设置有效期

(7)设置新证书序列号

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

CertificateSerialNumber csn=new CertificateSerialNumber(sn);

cinfo2set(X509CertInfoSERIAL_NUMBER,csn);

(8)设置新证书签发者

cinfo2set(X509CertInfoISSUER+""+CertificateIssuerNameDN_NAME,issuer);应用第三步的结果

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

AlgorithmId algorithm=new AlgorithmId(AlgorithmIdmd5WithRSAEncryption_oid);

cinfo2set(CertificateAlgorithmIdNAME+""+CertificateAlgorithmIdALGORITHM,algorithm);

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

X509CertImpl newcert=new X509CertImpl(cinfo2);

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

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

kssetCertificateEntry("lf_signed",newcert);

FileOutputStream out=new FileOutputStream("newstore");

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

十:数字证书的检验

(1)验证证书的有效期

(a)获取X509Certificate类型对象

CertificateFactory cf=CertificateFactorygetInstance("X509");

FileInputStream in1=new FileInputStream("aacrt");

javasecuritycertCertificate c1=cfgenerateCertificate(in1);

X509Certificate t=(X509Certificate)c1;

in2close();

(b)获取日期

Date TimeNow=new Date();

(c)检验有效性

try{

tcheckValidity(TimeNow);

Systemoutprintln("OK");

}catch(CertificateExpiredException e){ //过期

Systemoutprintln("Expired");

Systemoutprintln(egetMessage());

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

Systemoutprintln("Too early");

Systemoutprintln(egetMessage());}

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

(a)获取CA证书

CertificateFactory cf=CertificateFactorygetInstance("X509");

FileInputStream in2=new FileInputStream("carootcrt");

javasecuritycertCertificate cac=cfgenerateCertificate(in2);

in2close();

(c)获取CA的公钥

PublicKey pbk=cacgetPublicKey();

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

(c)检验证书

boolean pass=false;

try{

c1verify(pbk);

pass=true;

}catch(Exception e){

pass=false;

Systemoutprintln(e);

}

JavaKeyStore的类型JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型(我所知道的共有5种,JKS,JCEKS,PKCS12,BKS,UBER)。JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,14后我们都能够直接使用它。JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDes)。PKCS#12是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,也称为PFX文件,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。BKS来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互 *** 作,读者可以用Keytool去TryTry。UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。以前,SunJDK(提供者为SUN)允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。证书导入Der/Cer证书导入:要从某个文件中导入某个证书,使用keytool工具的-import命令:1keytool-import-filemycertder-keystoremykeystorejks如果在-keystore选项中指定了一个并不存在的密钥仓库,则该密钥仓库将被创建。如果不指定-keystore选项,则缺省密钥仓库将是宿主目录中名为keystore的文件。如果该文件并不存在,则它将被创建。创建密钥仓库时会要求输入访问口令,以后需要使用此口令来访问。可使用-list命令来查看密钥仓库里的内容:1keytool-list-rfc-keystoremykeystorejksP12格式证书导入:keytool无法直接导入PKCS12文件。第一种方法是使用IE将pfx证书导入,再导出为cert格式文件。使用上面介绍的方法将其导入到密钥仓库中。这样的话仓库里面只包含了证书信息,没有私钥内容。第二种方法是将pfx文件导入到IE浏览器中,再导出为pfx文件。新生成的pfx不能被导入到keystore中,报错:keytool错误:javalangException:所输入的不是一个X509认证。新生成的pfx文件可以被当作keystore使用。但会报个错误asunknownattr136141311171,查了下资料,说IE导出的就会这样,使用Netscape就不会有这个错误第三种方法是将pfx文件当作一个keystore使用。但是通过微软的证书管理控制台生成的pfx文件不能直接使用。keytool不认此格式,报keytool错误:javaioIOException:failedtodecryptsafecontentsentry。需要通过OpenSSL转换一下:1opensslpkcs12-inmycertspfx-outmycertspem2opensslpkcs12-export-inmycertspem-outmykeystorep12通过keytool的-list命令可检查下密钥仓库中的内容:1keytool-rfc-list-keystoremykeystorep12-storetypepkcs12这里需要指明仓库类型为pkcs12,因为缺省的类型为jks。这样此密钥仓库就即包含证书信息也包含私钥信息。P7B格式证书导入:keytool无法直接导入p7b文件。需要将证书链RootServerp7b(包含根证书)导出为根rootcacer和子rootcaservercer。将这两个证书导入到可信任的密钥仓库中。1keytool-import-aliasrootca-trustcacerts-filerootcacer-keystoretestkeytrustjks遇到是否信任该证书提示时,输入y1keytool-import-aliasrootcaserver-trustcacerts-filerootcaservercer-keystoretestkeytrustjks总结P12格式的证书是不能使用keytool工具导入到keystore中的TheSun'sPKCS12Keystore对从IE和其他的windows程序生成的pfx格式的证书支持不太好P7B证书链不能直接导入到keystore,需要将里面的证书导出成cer格式,再分别导入到keystore。

百度地图 Android签名证书的sha1值获取方式百度地图安全码构成:

Android签名证书的sha1值+“;”+packagename(即:数字签名+分号+包名),例如:

2D:0D:D8:32:EA:68:57:81:E5:6D:F7:3C:BA:B4:A8:D0:AE:00:9A:C1;combaidumapdemo

如果是app是debug版本(直接运行):可以在eclipse中直接查看:windows -> preferance -> android -> build

如下图示:

其中“SHA1 fingerprint”值即为Android签名证书的sha1值

如果是app是release版本:

1先给APP签名,签名会生成xxxxkeystore文件(app签名方法:>

jarsigner -verbose -keystore xxxjks -signedjar xxxapk(签名后的apk名字) xxxapk(需要签名的apk) xxx(keystore别名)

以linux下为例:

进入android sdk下的platform-tools:输入如下指令

jarsigner -verbose -keystore /cloud/xxxjks -signedjar /cloud/appapk( /cloud/app-unsignedapk xxx

然后输入密码,即可签名成功。

Keystore是Android系统中用于存储密钥的一种机制,可以用于保护应用程序的机密信息。在使用Keystore之前,需要创建一个Keystore,并在其中添加密钥。下面是使用Keystore的一些基本步骤:

创建Keystore:可以使用keytool命令行工具或者Java代码来创建Keystore。例如,使用keytool工具创建Keystore可以使用如下命令:

keytool -genkey -v -keystore my-release-keykeystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

其中,-genkey表示创建Keystore和密钥,-v表示输出详细信息,-keystore指定Keystore文件名,-alias指定密钥别名,-keyalg指定密钥算法,-keysize指定密钥长度,-validity指定密钥的有效期。

在Keystore中添加密钥:可以使用Java代码来添加密钥,例如:

KeyStore ks = KeyStoregetInstance(KeyStoregetDefaultType());

ksload(null, null);

KeyPairGenerator kpg = KeyPairGeneratorgetInstance("RSA");

kpginitialize(2048);

KeyPair kp = kpggenerateKeyPair();

Certificate[] chain = new Certificate[1];

chain[0] = generateCertificate(kp);

kssetKeyEntry("mykey", kpgetPrivate(), "password"toCharArray(), chain);

ksstore(new FileOutputStream("mykeystorejks"), "password"toCharArray());

其中,首先使用KeyStoregetInstance方法获取Keystore实例,然后使用ksload方法加载Keystore,接着使用KeyPairGeneratorgetInstance方法获取密钥生成器,初始化生成器并生成密钥对,使用generateCertificate方法生成证书,最后使用kssetKeyEntry方法将私钥添加到Keystore中。

使用Keystore:在应用程序中使用Keystore可以通过Java代码实现。例如,可以使用以下代码获取Keystore中的密钥:

KeyStore ks = KeyStoregetInstance("AndroidKeyStore");

ksload(null);

KeyStoreEntry entry = ksgetEntry("mykey", null);

PrivateKey privateKey = ((KeyStorePrivateKeyEntry) entry)getPrivateKey();

其中,使用KeyStoregetInstance方法获取Keystore实例,使用ksload方法加载Keystore,然后使用ksgetEntry方法获取Keystore中的密钥。在获取密钥后,就可以使用其进行加密和解密等 *** 作。

以上就是关于从jks证书中提取公钥和私钥(jks证书转pem证书)全部的内容,包括:从jks证书中提取公钥和私钥(jks证书转pem证书)、用Java编写一个程序,生成公钥和私钥对、java中怎么获取jks证书文件中的内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9294424.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存