JDK Keytool 使用及理解

简介: windows系统的根证书放置在注册表中:KEY_LOCAL_MACHINE-SOFTWARE-Microsoft-SystemCertificate-ROOT-Certificate    java信任的根证书放置位置在:  D:\Program Files\Java\jdk1.

windows系统的根证书放置在注册表中:KEY_LOCAL_MACHINE-SOFTWARE-Microsoft-SystemCertificate-ROOT-Certificate

 

 java信任的根证书放置位置在:

 D:\Program Files\Java\jdk1.6.0_24\jre\lib\security\cacerts

 在此目录下用 keytool -list -keystore cacerts 显示所有证书,默认密码changeit

 

 导入操作系统的证书可以通过IE将操作系统中的root证书导出成.cer格式的文件,再通过keytool工具导入JDK的证书库:

 keytool -import -file oracle.cer -alias oracle

Enter keystore password:

...

 

 导入后通过证书指纹来验证下库中的证书:

 D:\Program Files\Java\jdk1.6.0_24\jre\lib\security>keytool -list -keystore cacerts|findstr DB:23

Enter keystore password:  changeit

Certificate fingerprint (MD5): DB:23:3D:F9:69:FA:4B:B9:95:80:44:73:5E:7D:41:83

 

keytool可以直接在命令行输出.cer证书的内容:

 keytool -printcert -file "oracle.cer"

 

keystore中有几种Entry,其

KeyStore.Entry

|-KeyStore.PrivateKeyEntry

|-KeyStore.TrustedCertificateEntry

|-KeyStore.SecretKeyEntry

 

PrivateKeyEntry保存私钥和对应的证书链。其实就是非对称算法的公钥和私钥。

TrustedCertificateEntry保存受信任的证书。

SecretKeyEntry保存一个SecretKey,其保存的是一个对称算法的密钥。

 

KeyStore有几种类型,常用的就是JKS,JCEKS。 JKS是keystore的默认类型,但这个类型只能存储公私钥和证书,如果还需要存储secret key,只能用JCEKS:

keytool -genseckey -alias seckey -keyalg DES -storetype jceks

查询时也要强制指定类型,因为默认类型是JKS:

keytool -list -storetype JCEKS

生成公钥对:

keytool -genkeypair -alias pubKey -keyalg "RSA" -storetype JCEKS

 

 Keytool 生成keypair的源码如下,如果自己想直接定制一个可以直接参考:

private void doGenCert(String alias, String sigAlgName, InputStream in, PrintStream out)
               throws Exception {
   
   
           Certificate signerCert = keyStore.getCertificate(alias);
           byte[] encoded = signerCert.getEncoded();
           X509CertImpl signerCertImpl = new X509CertImpl(encoded);
           X509CertInfo signerCertInfo =
				(X509CertInfo)signerCertImpl.get(
                X509CertImpl.NAME + "." + X509CertImpl.INFO);
           X500Name issuer =
				(X500Name)signerCertInfo.get(X509CertInfo.SUBJECT + "." +
           
			CertificateSubjectName.DN_NAME);
   
           Date firstDate = getStartDate(startDate);
           Date lastDate = new Date();
           lastDate.setTime(firstDate.getTime() +
				validity*1000L*24L*60L*60L);
           CertificateValidity interval = new
				CertificateValidity(firstDate,
               
				lastDate);
   
           PrivateKey privateKey =
                   (PrivateKey)recoverKey(alias, storePass,
					keyPass).fst;
           if (sigAlgName == null) {
               sigAlgName =
				getCompatibleSigAlgName(privateKey.getAlgorithm());
           }
           Signature signature = Signature.getInstance(sigAlgName);
           signature.initSign(privateKey);
   
           X509CertInfo info = new X509CertInfo();
           info.set(X509CertInfo.VALIDITY, interval);
           info.set(X509CertInfo.SERIAL_NUMBER, new
				CertificateSerialNumber(
                       new java.util.Random().nextInt() & 0x7fffffff));
           info.set(X509CertInfo.VERSION,
                       new CertificateVersion(CertificateVersion.V3));
           info.set(X509CertInfo.ALGORITHM_ID,
                       new CertificateAlgorithmId(
                           AlgorithmId.getAlgorithmId(sigAlgName)));
           info.set(X509CertInfo.ISSUER, new
				CertificateIssuerName(issuer));
   
           BufferedReader reader = new BufferedReader(new
				InputStreamReader(in));
           boolean canRead = false;
           StringBuffer sb = new StringBuffer();
           while (true) {
               String s = reader.readLine();
               if (s == null) break;
               // OpenSSL does not use NEW
               //if (s.startsWith("-----BEGIN NEW CERTIFICATE

					REQUEST-----")) {
               if (s.startsWith("-----BEGIN") && s.indexOf("REQUEST")
					>= 0) {
                   canRead = true;
               //} else if (s.startsWith("-----END NEW CERTIFICATE
					REQUEST-----")) {
               } else if (s.startsWith("-----END") &&
					s.indexOf("REQUEST") >= 0) {
                   break;
               } else if (canRead) {
                   sb.append(s);
               }
           }
           byte[] rawReq = new BASE64Decoder().decodeBuffer(new
				String(sb));
           PKCS10 req = new PKCS10(rawReq);
   
           info.set(X509CertInfo.KEY, new
				CertificateX509Key(req.getSubjectPublicKeyInfo()));
           info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(
                   dname==null?req.getSubjectName():new
					X500Name(dname)));
           CertificateExtensions reqex = null;
           Iterator<PKCS10Attribute> attrs =
				req.getAttributes().getAttributes().iterator();
           while (attrs.hasNext()) {
               PKCS10Attribute attr = attrs.next();
               if
					(attr.getAttributeId().equals(PKCS9Attribute.EXTENSION_REQUEST_OID)) {
                   reqex =
						(CertificateExtensions)attr.getAttributeValue();
               }
           }
           CertificateExtensions ext = createV3Extensions(
                   reqex,
                   null,
                   v3ext,
                   req.getSubjectPublicKeyInfo(),
                   signerCert.getPublicKey());
           info.set(X509CertInfo.EXTENSIONS, ext);
           X509CertImpl cert = new X509CertImpl(info);
           cert.sign(privateKey, sigAlgName);
           dumpCert(cert, out);
           for (Certificate ca: keyStore.getCertificateChain(alias)) {
               if (ca instanceof X509Certificate) {
                   X509Certificate xca = (X509Certificate)ca;
                   if (!isSelfSigned(xca)) {
                       dumpCert(xca, out);
                   }
               }
           }
       }

 

目录
相关文章
|
10月前
|
Java iOS开发 MacOS
使用JDK自带的keytool工具生成签名文件
使用JDK自带的keytool工具生成签名文件
107 0
JDK的生成keytool证书
JDK的生成keytool证书
|
Web App开发 算法 Java
Java Web Start学习,与JDK中keytool常用命令
Java Web Start(以下简称JWS)是SUN提供的一种通过Web来部署和发布Java 程序的新技术,它既可以用来发布Application,也可以用来发布Applet,它获去年全球Java技术最佳创意奖。它仅在第一次运行时下载程序,以后的事情,就全全交给JWS,包括版本的自动更新和维护。这是我们曾经梦寐以求的事情,程序运行在客户端(本地运行,当然有足够的速度),但不用去安装配置客户端
1228 0
|
8天前
|
Java Linux 应用服务中间件
在Rocky Linux 9上安装JDK并配置环境变量!
本教程介绍在Rocky Linux 9上安装JDK并配置环境变量的完整步骤。首先更新系统,清理旧版本JDK相关包及残留文件,确保环境干净。接着搜索并安装所需版本的JDK(如OpenJDK 17),验证安装是否成功。然后查找JDK安装路径,配置全局环境变量`JAVA_HOME`和`PATH`,最后验证环境变量设置。按照此流程操作,可顺利完成Java开发环境搭建,支持多版本切换(如JDK 8/11/17)。生产环境请谨慎操作,避免影响现有服务。
59 21
|
6月前
|
Java
安装JDK18没有JRE环境的解决办法
安装JDK18没有JRE环境的解决办法
597 61
|
21天前
|
Oracle Java 关系型数据库
课时4:JDK的安装与配置
课时4:JDK的安装与配置 摘要: 1. JDK安装:从Oracle官网下载适合操作系统的JDK版本,确保关闭防火墙,选择正确的位数(如64位),并进行一键式安装。 2. JDK配置:将JDK的bin目录路径(如D:\Java\jdk1.8.0_74\bin)添加到系统环境变量PATH中,确保Java开发命令(如javac、java)可用。配置完成后,重启命令行工具验证安装是否成功。 通过以上步骤,确保Java开发环境的正确搭建。
105 0
|
21天前
|
Java
课时5:JDK安装与配置
课时5:JDK安装与配置,主讲人李兴华。课程详细讲解了JDK的安装步骤和环境配置方法,包括选择安装路径、配置系统环境变量(如path),确保javac和java命令在命令行中可用。建议将所有程序安装在D盘,便于管理。安装完成后,需重启命令行以加载新环境配置,确保Java开发环境正常运行。
|
7月前
|
Oracle Java 关系型数据库
Mac安装JDK1.8
Mac安装JDK1.8
904 4
|
7月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
91 1
|
3月前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
271 7