`

用java导入密钥和证书,组成密钥对导入同一密钥库

 
阅读更多

1.使用openssl转换将pem的密钥和证书成der格式

openssl pkcs8 -topk8 -nocrypt -in key.pem -inform PEM -out key.der -outform DER
openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER

 2.使用java程序ImportKey创建密钥库,可以修改java代码中的密码,别名,文件路径和名字

java ImportKey key.der cert.der

 也可以创建后,使用keytool命令修改密码,别名

 检查一个keystore中的内容
        keytool -list -v -alias mykeypair -keystore mykeystore -storetype JCEKS
        参数   -v 指明要列出详细信息
                -alias 指明列出指定的别名为mykeypair的keypair信息(不指定则列出所有)
                -keystore 指明要列出名字为mykeystore的keystore中的信息

                -storetype 指明keystore类型(不指定默认为jks)

ImportKey.java

import java.security.*;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.DataInputStream;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.security.spec.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.Collection;
import java.util.Iterator;

/**
 * ImportKey.java
 *
 * 

This class imports a key and a certificate into a keystore
* ($home/keystore.ImportKey). If the keystore is
* already present, it is simply deleted. Both the key and the
* certificate file must be in DER-format. The key must be
* encoded with PKCS#8-format. The certificate must be
* encoded in X.509-format.

 *
 * 

Key format:

 * 

openssl pkcs8 -topk8 -nocrypt -in YOUR.KEY -out YOUR.KEY.der
* -outform der

 * 

Format of the certificate:

 * 

openssl x509 -in YOUR.CERT -out YOUR.CERT.der -outform
* der

 * 

Import key and certificate:

 * 

java comu.ImportKey YOUR.KEY.der YOUR.CERT.der


 *
 * 

Caution: the old keystore.ImportKey-file is
* deleted and replaced with a keystore only containing YOUR.KEY
* and YOUR.CERT. The keystore and the key has no password;
* they can be set by the keytool -keypasswd-command for setting
* the key password, and the keytool -storepasswd-command to set
* the keystore password.
*

The key and the certificate is stored under the alias
* importkey; to change this, use keytool -keyclone.
*
* Created: Fri Apr 13 18:15:07 2001
* Updated: Fri Apr 19 11:03:00 2002
*
* @author Joachim Karrer, Jens Carlberg
* @version 1.1
**/
public class ImportKey {

/**
*

Creates an InputStream from a file, and fills it with the complete
* file. Thus, available() on the returned InputStream will return the
* full number of bytes the file contains

     * @param fname The filename
     * @return The filled InputStream
     * @exception IOException, if the Streams couldn't be created.
     **/
    private static InputStream fullStream ( String fname ) throws IOException {
        FileInputStream fis = new FileInputStream(fname);
        DataInputStream dis = new DataInputStream(fis);
        byte[] bytes = new byte[dis.available()];
        dis.readFully(bytes);
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        return bais;
    }
        
    /**
     * 

Takes two file names for a key and the certificate for the key,
* and imports those into a keystore. Optionally it takes an alias
* for the key.
*

The first argument is the filename for the key. The key should be
* in PKCS8-format.
*

The second argument is the filename for the certificate for the key.
*

If a third argument is given it is used as the alias. If missing,
* the key is imported with the alias importkey
*

The name of the keystore file can be controlled by setting
* the keystore property (java -Dkeystore=mykeystore). If no name
* is given, the file is named keystore.ImportKey
* and placed in your home directory.
* @param args [0] Name of the key file, [1] Name of the certificate file
* [2] Alias for the key.
**/
public static void main ( String args[]) {

// change this if you want another password by default
String keypass = "importkey";

// change this if you want another alias by default
String defaultalias = "importkey";

// change this if you want another keystorefile by default
String keystorename = System.getProperty("keystore");

if (keystorename == null)
keystorename = System.getProperty("user.home")+
System.getProperty("file.separator")+
"keystore.ImportKey"; // especially this ;-)


// parsing command line input
String keyfile = "";
String certfile = "";
if (args.length < 2 || args.length>3) {
System.out.println("Usage: java comu.ImportKey keyfile certfile [alias]");
System.exit(0);
} else {
keyfile = args[0];
certfile = args[1];
if (args.length>2)
defaultalias = args[2];
}

try {
// initializing and clearing keystore
KeyStore ks = KeyStore.getInstance("JKS", "SUN");
ks.load( null , keypass.toCharArray());
System.out.println("Using keystore-file : "+keystorename);
ks.store(new FileOutputStream ( keystorename ),
keypass.toCharArray());
ks.load(new FileInputStream ( keystorename ),
keypass.toCharArray());

// loading Key
InputStream fl = fullStream (keyfile);
byte[] key = new byte[fl.available()];
KeyFactory kf = KeyFactory.getInstance("RSA");
fl.read ( key, 0, fl.available() );
fl.close();
PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
PrivateKey ff = kf.generatePrivate (keysp);

// loading CertificateChain
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certstream = fullStream (certfile);

Collection c = cf.generateCertificates(certstream) ;
Certificate[] certs = new Certificate[c.toArray().length];

if (c.size() == 1) {
certstream = fullStream (certfile);
System.out.println("One certificate, no chain.");
Certificate cert = cf.generateCertificate(certstream) ;
certs[0] = cert;
} else {
System.out.println("Certificate chain length: "+c.size());
certs = (Certificate[])c.toArray();
}

// storing keystore
ks.setKeyEntry(defaultalias, ff,
keypass.toCharArray(),
certs );
System.out.println ("Key and certificate stored.");
System.out.println ("Alias:"+defaultalias+" Password:"+keypass);
ks.store(new FileOutputStream ( keystorename ),
keypass.toCharArray());
} catch (Exception ex) {
ex.printStackTrace();
}
}

}// KeyStore

 原文请参见http://knowledge-oracle.blogspot.com/2009/02/import-private-key-and-certificate-in.html

分享到:
评论

相关推荐

    java解析证书程序(认证功能).doc

    - `keytool`是Java提供的一个命令行工具,用于管理密钥库和证书,包括生成自签名证书、导入和导出证书等。 总的来说,Java解析证书程序是网络安全中不可或缺的一部分,它涉及到证书的读取、验证和管理,确保了数据...

    经典加密工具

    它可以帮助开发者生成、导入、导出、删除和查看密钥对和证书。这对于创建和管理SSL/TLS证书,进行HTTPS通信,或者在非对称加密中生成和管理密钥对非常有用。 5. **如何使用keyTool**: - **生成密钥对**:使用`...

    java 实现加密解密

    - 导出和导入密钥通常涉及Base64编码或PEM格式。 7. **解密代码示例** - 基于上述的描述,Decrypt.java可能包含以下内容: ```java import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; ...

    JAVA上加密算法的实现用例

    在这些算法中,加密和解密使用的是同一密钥。AES(Advanced Encryption Standard)是目前广泛使用的对称加密标准,因其高效性和安全性而被广泛采用。 2. 非对称加密:例如RSA、DSA、ECC等,它使用一对公钥和私钥,...

    JAVA数据加密jar包之sunjce_provider.rar

    对称加密则使用同一密钥进行加解密。 6. 安全存储和管理密钥:密钥必须安全存储,避免泄露。可以使用`KeyStore`类来保存密钥和证书。 7. 验证和签名:为了确保数据完整性和来源,可以使用数字签名。`Signature`类...

    java、android、web三端通用的RSA和AES工具

    2. AES的加密与解密:使用同一密钥,对明文进行固定次数的迭代操作,转换成密文,反之则解密。 3. AES的安全性:至今尚未发现实际可行的攻击方法来破解AES,因此广泛应用于数据存储和传输。 在Java、Android和Web三...

    Java利用DES私钥对称加密代码实例

    先实例化`Cipher`,然后用密钥和加密模式(如`ENCRYPT_MODE`)对其进行初始化,最后调用`doFinal`方法进行加密。 ```java Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher....

    基于Java的实例源码-加密库 BeeCrypt.zip

    同一密钥既用于加密也用于解密。 2. **非对称加密**:如RSA、DSA(数字签名算法)或ECC(椭圆曲线加密),使用一对公钥和私钥,公钥用于加密,私钥用于解密,增强了安全性。 3. **哈希函数**:如MD5、SHA-1或SHA-...

    java常用加解密算法

    对称加密是最基础的加密方式,其特点是加密和解密使用同一密钥。在Java中,DES(Data Encryption Standard)是一种常见的对称加密算法。DES由IBM开发,采用64位的数据块和56位的密钥进行操作,通过一系列复杂的置换...

    aip-java-sdk-4.11.1.zip

    这里使用的json-20160810.jar是JSON解析库,支持SDK在处理请求和响应时的数据转换。 3. **slf4j-api-1.7.25.jar**:Simple Logging Facade for Java (SLF4J) 是一个为各种日志框架提供一个简单统一的接口,使得最终...

    bcprov-jdk15on-1.67.jar中文-英文对照文档.zip

    2. **对称加密**:使用同一密钥进行加密和解密,如AES、DES。 3. **非对称加密**:使用一对公钥和私钥,公钥用于加密,私钥用于解密,如RSA、ECC。 4. **哈希函数**:将任意长度的输入转换为固定长度的输出,如MD5、...

    face++人脸识别SDK(包含java和matlab版本)

    对于Java和MATLAB开发者来说,集成Face++ SDK需要按照官方文档的指导进行,通常包括下载SDK、注册API密钥、导入库文件以及调用相关函数。在开发过程中,可能需要对识别结果进行调试和优化,以提高准确性和稳定性。 ...

    AndroidSign

    签名过程包括生成密钥对(公钥和私钥)、使用私钥对APK进行签名,然后使用公钥验证签名。Android系统在安装APK时会检查签名,只有签名有效,应用才能被安装。此外,签名还有助于维护应用更新的连续性,同一应用的...

    tomcat同时使用http和https访问的配置方法

    - `truststoreFile`和`truststorePass`:定义信任的证书存储库,通常是同一密钥库,但也可以不同。 2. **保留HTTP Connector**: 如果你希望同时支持HTTP,保持现有的HTTP Connector配置,例如: ```xml ...

    BouncyCastle.Crypto

    支持PKCS#7(用于封装和签名数据)和PKCS#12(个人证书存储格式),方便导入和导出证书和密钥。 6. **X.509证书**: X.509证书用于表示公钥及其相关属性,BouncyCastle提供读取、解析和创建X.509证书的能力,这...

    Android应用源码 打包签名 从生成keystore到完成签名.zip

    1. **Keystore生成**:在Android开发中,`keytool`是Java提供的一个命令行工具,用于创建和管理密钥库。开发者通常会使用`keytool`来生成一个包含私钥和证书的keystore文件。执行`keytool -genkeypair`命令,需要...

    signapk.jar

    开发者可以使用keytool生成新的keystore,或者导入已有的密钥对。 4. **signapk.jar工具**:这个工具就是我们所讨论的重点。它是Google提供的一个jar包,用于将APK和keystore结合,生成签名后的APK。使用时,开发者...

    安卓数据加密

    密钥用于控制加密和解密过程,而加密算法则定义了如何使用密钥对数据进行变换。常见的加密算法有DES、3DES、AES等,其中AES(Advanced Encryption Standard)是目前广泛使用的对称加密标准。 二、对称加密与非对称...

Global site tag (gtag.js) - Google Analytics