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

无法从外部证书创建SSLContext

韩麒
2023-03-14

我试图创建自己的HTTPS服务器,我有两个代码片段:

private SSLContext createSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException, NoSuchProviderException {
    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(new FileInputStream("c:\\tmp\\clientkeystore.jks"), "123456".toCharArray());

    // Create key manager
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    keyManagerFactory.init(keyStore, "123456".toCharArray());
    KeyManager[] km = keyManagerFactory.getKeyManagers();

    // Create trust manager
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
    trustManagerFactory.init(keyStore);
    TrustManager[] tm = trustManagerFactory.getTrustManagers();

    // Initialize SSLContext
    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(km, tm, null);

    return sslContext;
}
private SSLContext createSSLContext2() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException, NoSuchProviderException {
    String path = "c:/tmp/example.crt2";
    byte[] certbytes = Files.readAllBytes(Paths.get(path));

    ByteArrayInputStream derInputStream = new ByteArrayInputStream(certbytes);
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
    String alias = cert.getSubjectX500Principal().getName();

    KeyStore trustStore = KeyStore.getInstance("JKS");
    trustStore.load(null, "".toCharArray());
    trustStore.setCertificateEntry(alias, cert);
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(trustStore, null);
    KeyManager[] keyManagers = kmf.getKeyManagers();

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(trustStore);
    TrustManager[] trustManagers = tmf.getTrustManagers();

    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
    sslContext.init(keyManagers, trustManagers, null);
    return sslContext;
}

$curl-k-vvv https://example.org:443*重新构建URL到:https://example.org:443/*不支持名称查找超时*尝试127.0.0.1...*连接到example.org(127.0.0.1)端口443(#0)*ALPN,提供HTTP/1.1*密码选择:all:!导出:!导出40:!导出56:!anull:!low:!RC4:@strength*成功设置证书验证位置:*cafile:c://program files/git/mingw64/ssl/certs/ca-bundle.crt Capath:none*TLSV1.2(OUT),TLS标头,证书状态(22):*TLSV1.2(OUT),TLS标头,TLS握手,客户端您好(1):*TLSV1.2(IN),TLS标头,未知*错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:SSLV3警报握手失败*关闭连接0 curl:(35)错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:SSLV3警报握手失败

clientkeystore.jks中的证书由以下命令行生成:

keytool -genkey ...

第二个代码片段的证书是通过OpenSSL生成的:

$ openssl version -a
OpenSSL 1.0.2e 3 Dec 2015
built on: reproducible build, date unspecified
platform: mingw64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,2,long) idea(int) blowfish(idx)
compiler: gcc -I. -I.. -I../include -I/mingw64/include -D_WINDLL -DOPENSSL_PIC -DZLIB_SHARED -DZLIB -DOPENSSL_THREADS -D_MT -DDSO_WIN32 -DL_ENDIAN -O3 -Wall -DWIN32_LEAN_AND_MEAN -DUNICODE -D_UNICODE -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/mingw64/ssl"

我做错了什么?求求你,救命!

共有1个答案

南门志
2023-03-14

在第二种情况下,没有私钥,只有证书。您需要用包含私钥条目的TrustStore初始化KeyManager。

反正你的所作所为也没道理。不能同时将同一文件用作密钥库和信任库。没有任何意义。

 类似资料:
  • 过去,我一直在通过导出带有密码的PFX证书来制作安全的TcpListener,但我想知道是否可以跳过这一步。 我没有使用商业SSL证书,并且有一个根CA,用于颁发服务器证书。在C#中托管TcpListener时,这些服务器证书需要额外的步骤(我想是因为没有使用CSR)。。。但是如果我有私钥和OpenSSL生成/使用的证书呢。 这很好,但是我必须发出openssl命令,从证书和私钥生成pfx文件,然

  • 我有一个集成,在其中验证另一个服务创建的JSON。它们提供了一个公共endpoint来获取要验证的公共证书。 但我正在为此设置一个测试,并希望与Nimbus创建相同的JWT,以使用我自己的私钥对其进行签名。所以我这样做(这是一个嵌套的加密JWT):https://connect2id.com/products/nimbus-jose-jwt/examples/signed-and-encrypte

  • 问题内容: 我有一个已创建的模块/ jar,正在用作util 库。我在那里创建了一个服务,如下所示: …它位于以下包中的位置:com.inin.architect.permissions和我的主应用程序中,我正在引用/加载此jar(即,设置为该应用程序的Maven POM.xml文件中的依赖项),例如所以: 在应用程序中,我想使用该服务,例如: 在应用程序的spring设置中,我得到了以下信息:

  • 试图从aws lambda连接到外部soap服务,但遇到以下异常。 通用域名格式。太阳xml。内部的ws。客户ClientTransportException:HTTP传输错误:javax。网ssl。例外:太阳。安全验证器。ValidatorException:PKIX路径生成失败:sun。安全供应商。certpath。SunCertPathBuilderException:找不到请求目标的有效证

  • 我一直在尝试使用githubrowsersample对sunflower应用程序示例进行Restfulise,所以我一直在尝试进行一些复制和粘贴。然而,我完全搞不懂为什么会出现这个错误。此特定代码是完整的复制和粘贴。 我收到的错误是: 错误:DataBoundViewHolder(T)在DataBoundViewHolder中不是公共的;无法从T为类型变量的包外部访问:T扩展了DataBoundV

  • 它是使用.NET 4.7.2生成的,类似于本问题中的答案:使用纯.NET Framework生成和签名证书请求 然后将序列化的CSR发送到服务器,服务器需要创建证书--问题是如何做到这一点。