
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证书文件中的内容等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)