当前位置: 首页 > 知识库问答 >
问题:

将证书添加到密钥存储区和信任存储区

呼延修然
2023-03-14

证书、私钥(客户端)和客户端证书都是pem格式的,我必须将它们添加到信任存储区和密钥存储区中。我该怎么做呢?到目前为止,我在cmd(windows)中有命令:

>

  • 要生成PKC(key:客户端私钥,cert:客户端cert,CA:CACERT):openssl pkcs12-inKey key.pem-in cert.pem-export-out keystored.p12-certfile CA.pem

    keytool-importkeystore-destkeystore mykeystore.jks-srckeystore keystore.p12-srcstoreType pkcs12

    这些命令正确吗?

    我写了一个程序,通过SSL连接服务器。但是,它在线程“main”javax.net.ssl.sslPeerUnverifiedException中显示错误异常:对等体未在sun.security.ssl.sslSessionImpl.GetPeerCertificates(未知源)上进行身份验证

    以下程序:(程序是为了获取docker信息)

    package test_abc;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.security.KeyStore;
    import java.security.SecureRandom;
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.conn.ssl.StrictHostnameVerifier;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.util.EntityUtils;
    public class TrustHttp {
    public static void main(String[] args) throws Exception {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    try {
    SSLContext ctx = SSLContext.getInstance("TLS");
    TrustManager[] trustManagers = getTrustManagers("jks", new FileInputStream(new File("C:\\Users\\akarki\\Desktop\\certi\\abcd\\mykeystore.jks")), "password1");
    KeyManager[] keyManagers = getKeyManagers("pkcs12", new FileInputStream(new File("C:\\Users\\akarki\\Desktop\\certi\\abcd\\KeyStore.p12")), "password1");
    ctx.init(keyManagers, trustManagers, new SecureRandom());
    SSLSocketFactory factory = new SSLSocketFactory(ctx, new StrictHostnameVerifier());
    ClientConnectionManager manager = httpClient.getConnectionManager();
    manager.getSchemeRegistry().register(new Scheme("https", 443, factory));
    //as before
    HttpGet httpget = new HttpGet("https://URL:2376/images/json");
    System.out.println("executing request" + httpget.getRequestLine());
    HttpResponse response = httpClient.execute(httpget);
    HttpEntity entity = response.getEntity();
    System.out.println("----------------------------------------");
    System.out.println(response.getStatusLine());
    if (entity != null) {
    System.out.println("Response content length: " + entity.getContentLength());
    }
    EntityUtils.consume(entity);
    }finally {
    // When HttpClient instance is no longer needed,
    // shut down the connection manager to ensure
    // immediate deallocation of all system resources
    httpClient.getConnectionManager().shutdown();
    }
    }
    protected static KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) throws Exception {
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(keyStoreFile, keyStorePassword.toCharArray());
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(keyStore, keyStorePassword.toCharArray());
    return kmf.getKeyManagers();
    }
    protected static TrustManager[] getTrustManagers(String trustStoreType, InputStream trustStoreFile, String trustStorePassword) throws Exception {
    KeyStore trustStore = KeyStore.getInstance(trustStoreType);
    trustStore.load(trustStoreFile, trustStorePassword.toCharArray());
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(trustStore);
    return tmf.getTrustManagers();
    }
    }
    
  • 共有1个答案

    叶书
    2023-03-14

    使用此命令,您可以将证书导入到现有或新的密钥存储库:

    keytool -import -alias aliasForCert -file /path/to/ca.pem -keystore cacerts –storepass changeit
    

    根据需要重命名aliasForCert、cacerts,如果是新的密钥存储库,则更改密码。

     类似资料:
    • 我有一个纯Java的应用程序,目前使用基于. jks的密钥和信任存储。据我所知,Bluemix下的SSL协议处理是在网络端使用单个端口和用于主机和域标识的通配符证书完成的。我关心的是信任存储的使用,在那里我用来添加可信伙伴节点的证书,例如身份提供者。是否有高级上传工具可以帮助安装受信任的证书?有了这些功能,Java可以将其功能限制在非常基本的HTTP实现上,并由云及其在动态端口上发生的HTTP到H

    • 资源组 集成帐户 密钥库 Active Directory 使用命令set-azurermkeyvaultaccesspolicy向我的用户授予所有密钥和机密的权限 每当我转到集成帐户>Certificates>Add>choose[Certificate Type]=“Private”时,组合框资源组和密钥库会自动填充,但密钥名称会抛出以下错误: 与密钥库[MY_KEY_VAULT]通信失败。请

    • 问题内容: 我们可以在密钥存储区中加载多个证书和密钥吗? 是否总是需要仅加载对(即证书和密钥一起)? 如果密钥库具有多个证书和密钥,那么当Java SSL尝试建立作为服务器的连接时,将选择哪个证书和密钥? 问题答案: 尽管这取决于KeyStore类型,但是通常,您可以在单个存储中存储多个私钥和证书。 基于Java的服务器使用哪种密钥和证书组合取决于应用程序的实现方式。许多应用程序允许您使用 别名

    • 来自服务器端的PEM文件,打开时为以下格式: 我试图将其转换为两个JKS文件(信任存储和密钥存储),我可以通过SSL使用java应用程序调用服务器。 谢谢你在这方面的帮助。

    • 我在配置spring boot tomcat SSL以使用Comodo EV证书时遇到问题。然而,这是我第一次这样做,所以很明显,我在某处犯了一些愚蠢的错误。如果有任何帮助,我会非常感激,因为我已经在这方面挣扎了好几天了... 所以,我的场景是这样的: > Java spring boot。 我创建了keystore2.jks,创建了CSR,并将其发送给了Comodo。我还导出了私钥,以防我搞砸了

    • 我在java中实现了一个加密和解密器,它可以在密钥存储库文件上工作。我的密钥库已经有两个RSA的别名,但现在我需要添加DES。 有办法通过keytool做到这一点吗?我找不到任何地方可以做这件事。