`
darkjune
  • 浏览: 309057 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK Keytool 使用及理解

 
阅读更多

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);
                   }
               }
           }
       }

 

分享到:
评论

相关推荐

    JDK中利用keytool创建自签名证书

    在Java Development Kit (JDK) 中,`keytool` 是一个强大的命令行工具,用于管理密钥对(公钥和私钥)以及...通过实践和理解`keytool`命令以及在Java代码中使用`KeyStore`和相关类,开发者能够确保数据传输的安全性。

    keytool-api-1.5-1.5.zip

    9. **文档和示例**:一个完善的开源项目会提供详尽的API文档、教程和示例代码,帮助开发者理解和使用Ridioc。 综上所述,"keytool-api-1.5-1.5.zip"和"ridioc.zip"分别代表了Java安全工具的关键组件和一个开源的IoC...

    导出JVM KeyStore中私钥的Java程序

    对于标签"Java keytool keystore SSL",理解这些关键词至关重要。`keytool`是Java SDK提供的命令行工具,用于管理KeyStore。`keystore`是存储密钥和证书的地方。`SSL`是网络安全协议,用于加密网络通信,确保数据...

    Keytool IUI(version #2.3)

    总之,Keytool IUI 2.3是一款增强版的Java密钥管理工具,它通过图形界面优化了原生Keytool的使用体验,支持JDK1.6及以上版本,适用于各种需要安全通信的Java应用场景。无论是开发还是运维,它都是一个实用的辅助工具...

    keytool图形化工具

    `keytool`是Java Development Kit (JDK)自带的一个命令行工具,用于创建、管理和查看存储在Keystore中的密钥和证书。Keystore是存储私钥、公钥以及信任证书的地方,可以理解为一个安全的数据库。通过`keytool`,...

    密钥管理工具 Keytool-IUI

    Keytool是Java Development Kit(JDK)自带的一个用于管理密钥对和数字证书的工具,而Keytool-IUI则进一步提升了用户体验。 在Java安全模型中,密钥对(包括公钥和私钥)用于加密和解密数据,以及创建和验证数字...

    keytool查询apk证书指纹.zip

    `keytool`是Java开发工具包(JDK)中提供的一个命令行工具,用于管理和创建密钥对以及数字证书,包括查询APK的签名信息。本篇将详细讲解如何使用`keytool`来查询APK的证书指纹,包括MD5、SHA1和SHA256等安全摘要算法...

    keytool_gui

    对于初学者,理解并正确使用 `keytool` 工具是提高Java安全编程能力的重要步骤。通过`keytool_gui`,用户无需记住复杂的命令行参数,可以更方便地进行证书管理和密钥库操作,这对于不熟悉命令行环境的开发者来说是一...

    命令行keytool使用 证书DN生成数字证书容器 空格

    `keytool`是Java Development Kit (JDK)自带的一个工具,用于管理密钥对(公钥和私钥)和证书,它可以帮助我们创建、存储和管理数字证书,确保数据传输的安全性。本篇文章将深入探讨`keytool`的使用,特别是如何通过...

    KeyTool 工具生成X.509证书

    KeyTool是Java Development Kit (JDK)的一部分,它提供了一系列命令来创建、查看、导出、导入和管理密钥对和证书。下面是一些主要的KeyTool命令: 1. **生成密钥对**:`keytool -genkeypair` 使用此命令,你可以...

    keytool-importkeypair.zip

    在签名APK时,开发者会使用`keytool`来生成一个Keystore文件,然后使用这个Keystore中的私钥对APK进行签名。签名后的APK在安装时,Android系统会验证其数字签名,确保应用未经篡改并来自于可信源。 在压缩包内的...

    基于Java的密钥管理工具 Keytool-IUI.zip

    Keytool-IUI是对Java标准版(JDK)自带的keytool命令行工具的一种增强,提供了更加用户友好的图形界面,使得密钥库的管理和操作变得更加直观和简便。 Keytool是Java平台上的一个标准工具,用于生成、存储和管理密钥...

    基于java的开发源码-密钥管理工具 Keytool-IUI.zip

    Keytool的全名是“Java Key Tool”,它被集成在Java Development Kit (JDK) 中,提供了生成、存储和管理密钥对、证书请求以及导入和导出证书的功能。在Java应用程序中实现安全的HTTPS连接、SSL/TLS协议或数字签名时...

    keytool-advanced-v2.01.zip

    《深入理解Java Keytool工具:以keytool-advanced-v2.01为例》 Java Keytool,作为Java Development Kit(JDK)中的一个重要组件,是一个用于管理数字证书和密钥对的命令行工具。它提供了生成、存储和管理密钥对、...

    jdk-6u45-linux-i586

    此外,JDK还提供了许多其他工具,如jar(打包和管理Java档案)、jconsole(监视Java应用程序的性能)、keytool(管理密钥和证书),以及jmap、jhat等用于内存分析和故障排查的工具。 在学习和研究JDK 6u45时,...

    linux切换JDK脚本

    --slave /usr/bin/keytool keytool /opt/jdk1.6.0_11/jre/bin/keytool --slave /usr/bin/orbd orbd /opt/jdk1.6.0_11/jre/bin/orbd --slave /usr/bin/pack200 pack200 /opt/jdk1.6.0_11/jre/bin/pack200 ``` 4....

    Java&keytool生成RSA密钥

    Keytool是一个命令行工具,位于JDK的bin目录下。生成密钥对的命令格式如下: ``` keytool -genkeypair -alias &lt;别名&gt; -keyalg RSA -keysize &lt;密钥长度&gt; -keystore &lt;密钥库文件路径&gt; ``` 例如,我们可以创建一个名...

    jdk5.0 资源下载

    Java Development Kit(JDK)是Java编程语言的...通过配置并使用JDK5.0,开发者能够更好地理解和掌握Java编程,从而积累丰富的学习经验。同时,了解和熟练使用bin目录下的各种工具,将有助于日常开发工作的高效进行。

    Java jdk 86位软件下载

    4. **Java文档生成器**(javadoc):用于从源代码中生成HTML格式的API文档,便于理解和使用Java库。 5. **Java调试器**(jdb):帮助开发人员调试Java应用程序,找出并修复代码中的错误。 6. **Java归档工具**...

    [重要]Java代码验证keytool工具生成的密钥对

    Java代码验证keytool工具生成的密钥...总的来说,理解并熟练使用keytool生成和验证密钥对是Java开发者必备的技能之一,它关乎到应用程序的安全性和合规性。通过学习和实践,你可以更好地掌控这些核心的加密和认证技术。

Global site tag (gtag.js) - Google Analytics