Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 使用SSLEngine使用为内部网络位置签名的证书 背景_Java_Ssl_Sslengine - Fatal编程技术网

Java 使用SSLEngine使用为内部网络位置签名的证书 背景

Java 使用SSLEngine使用为内部网络位置签名的证书 背景,java,ssl,sslengine,Java,Ssl,Sslengine,我试图创建两个java应用程序,它们在内部网络上通过SSL相互通信。我这样做是通过授予对密钥库的SSLEngine访问权,该密钥库包含要使用的证书的私钥条目 private static SSLEngine createSslEngine() { try { KeyStore ks = KeyStore.getInstance( KeyStore.getDefaultType() ); char[] pwdArray = &

我试图创建两个java应用程序,它们在内部网络上通过SSL相互通信。我这样做是通过授予对密钥库的SSLEngine访问权,该密钥库包含要使用的证书的私钥条目

   private static SSLEngine createSslEngine()
   {
      try
      {
         KeyStore ks = KeyStore.getInstance( KeyStore.getDefaultType() );
         char[] pwdArray = "changeit".toCharArray();
         ks.load( null, pwdArray );
         try ( InputStream ksIs = ServerAssociationConnector.class.getResourceAsStream( "clientkeystore" ) )
         {
            ks.load( ksIs, pwdArray  );
         }
         KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm() );

         kmf.init( ks, pwdArray );
         SSLContext context = SSLContext.getInstance( "TLSv1.3" );
         context.init( kmf.getKeyManagers(), null, null );

         return context.createSSLEngine();
      }
      catch ( NoSuchAlgorithmException | UnrecoverableKeyException | KeyStoreException | CertificateException | IOException | KeyManagementException exception )
      {
         throw new AssertionError( "SSLException", exception );
      }
   }
这在使用根证书时可以正常工作(在浏览器中点击dubrovnik:2762会抱怨证书不可信,但在其他情况下也可以正常工作)。然而;我想使用一个由内部CA签名的非根证书,该证书仅用于所讨论的域(在本例中称为dubrovnik)

当我改为使用根证书对证书进行签名,并将dubrovnik作为主题替代名称时,java拒绝使用该证书,而是生成一个
javax.net.ssl.SSLHandshakeException:No available authentication scheme
异常

我使用的密钥库包含以下内容:

Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 2 entries

dubrovnik, 2 Nov 2020, PrivateKeyEntry,
Certificate fingerprint (SHA-256): 88:5F:53:7C:85:8E:65:01:3E:E1:E8:F0:D6:17:7A:8B:22:EF:11:DD:5F:E6:30:FE:A7:3B:F1:FA:07:C8:46:38
thecaroot, 2 Nov 2020, trustedCertEntry,
Certificate fingerprint (SHA-256): 9E:2F:86:B6:17:83:D2:26:88:42:49:E4:3F:DA:DA:19:31:11:18:F7:15:6D:16:35:C4:3E:1B:E4:F8:E6:FC:3A
我是如何创建我的证书的 我一直在使用openssl和keytool创建本地ca和签名证书

openssl genrsa -des3 -out myCA.key 2048
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem

##create the certificate to sign
keytool -keystore clientkeystore -genkey -alias dubrovnik -dname "CN=dubrovnik" -ext san=dns:dubrovnik
##create a request to have certificate signed
keytool –certreq –keystore clientkeystore –alias dubrovnik –keyalg rsa –file dubrovnik.csr

##CREATE A FILE CALLED dubrovnik.conf as described in https://stackoverflow.com/a/47779814/2187042

##sign the request
openssl x509 -req -CA myCA.pem -CAkey myCA.key -in dubrovnik.csr -out dubrovnik.cer -days 3650 -CAcreateserial -extfile dubrovnik.conf -extensions v3_req
##import the root level certificate (just the certificate, not the private key)
keytool -import -keystore clientkeystore -file myCA.pem -alias theCARoot 
##import the signed client certificate
keytool -import -keystore clientkeystore -file dubrovnik.cer -alias dubrovnik
问题:
我需要做什么才能使SSLEngine接受内部网络证书(不是根证书)并避免
javax.net.ssl.SSLHandshakeException:No available authentication scheme
exception

我相信我的问题实际上只是根证书是RSA证书,而非根证书是DSA,DSA已被弃用(因此被忽略)

这一问题也在会议上遇到

证书的DSA性质可以在证书详细信息中看到

需要修改keygen命令以使用RSA


keytool-keystore-clientkeystore-genkey-alias dubrovnik–keyalg rsa我认为我的问题实际上只是根证书是rsa证书,而非根证书是DSA,DSA已被弃用(因此被忽略)

这一问题也在会议上遇到

证书的DSA性质可以在证书详细信息中看到

需要修改keygen命令以使用RSA


keytool-keystore clientkeystore-genkey-alias dubrovnik–keyalg rsa

由于缺少“确认”而导致“javax.net.ssl.SSLHandshakeException:无可用的身份验证方案”-您使用的是其他方不知道的自行创建的证书。您需要使用第二个密钥库,但其功能是信任库(在双方)来建立SSL连接。SSLEngine根据信任库检查证书,并得到证书有效的“确认”。我想我的问题可能与相同。我生成的是DSA证书(java忽略了它们),而不是我应该生成的RSA证书using@MichaelFehr:不正确/缺失的信任库将产生不同的异常,而不是此Q中的异常。这就像告诉某人(传统汽油动力)汽车无法运行,因为火花塞已被取下,它们需要在油箱中添加更多燃油,但幸运的是OP忽略了它。“javax.net.ssl.SSLHandshakeException:No available authentication scheme”是由于缺少“confirmation”(确认)而导致的-您使用的是其他方不知道的自创证书。您需要使用第二个密钥库,但其功能是信任库(在双方)来建立SSL连接。SSLEngine根据信任库检查证书,并得到证书有效的“确认”。我想我的问题可能与相同。我生成的是DSA证书(java忽略了它们),而不是我应该生成的RSA证书using@MichaelFehr:不正确/缺失的信任库将产生不同的异常,而不是此Q中的异常。这就像告诉某人(传统汽油动力)汽车无法行驶,因为火花塞已经拆下,需要在油箱中添加更多燃油,但幸运的是,OP忽略了这一点。