Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从外部证书创建SSLContext_Java_Ssl_Https - Fatal编程技术网

Java 无法从外部证书创建SSLContext

Java 无法从外部证书创建SSLContext,java,ssl,https,Java,Ssl,Https,我正在尝试创建自己的HTTPS服务器,我有两个代码段: 第一: private SSLContext createSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException, NoSuchProviderException { KeyStore key

我正在尝试创建自己的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;
}
在第一个代码段中,一切都很好,但是,我想得到更多-我为本地域创建了自签名SSL证书,并将其保存在外部文件中。当我尝试使用该证书(例如.crt2)时,出现了以下异常:

javax.net.ssl.SSLHandshakeException:没有通用的密码套件 位于sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 位于sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) 位于sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) 位于sun.security.ssl.Handshaker.fatalSE(Handshaker.java:292)

旋度的完整输出为:

$curl-k-vvv *重新生成的URL到: *不支持名称查找超时 *正在尝试127.0.0.1。。。 *已连接到example.org(127.0.0.1)端口443(#0) *ALPN,提供http/1.1 *密码选择:全部:!出口:!出口40:!出口56:!阿努尔:!低:!RC4:@强度 *已成功设置证书验证位置: *CAfile:C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt 卡帕斯:没有 *TLSv1.2(OUT)、TLS标头、证书状态(22): *TLSv1.2(输出),TLS握手,客户端问候(1): *TLSv1.2(IN),TLS标头,未知(21): *TLSv1.2(IN)、TLS警报、服务器你好(2): *错误:14077410:SSL例程:SSL23\u GET\u SERVER\u HELLO:sslv3警报握手失败 *正在关闭连接0 curl:(35)错误:14077410:SSL例程:SSL23\u GET\u SERVER\u 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"

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

在第二种情况下,没有私钥,只有证书。您需要使用包含私钥项的信任库初始化KeyManager

你所做的一切毫无意义。不能将同一文件同时用作密钥库和信任库。这没有任何意义。

没有共享密码
可能表明EC密钥和使用域参数而不是命名曲线存在问题。另请参见OpenSSL wiki上的。您需要提供导致问题的证书,以确定这是否是问题所在。