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

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

姬实
2023-03-14
   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时,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

共有1个答案

史洛城
2023-03-14

在javax.net.ssl.sslhandShakeException中也遇到了这个问题:没有可用的身份验证方案

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

需要修改keygen命令以使用RSA

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

 类似资料:
  • 问题内容: 我的任务是实现一个定制/独立的Java Web服务器,该服务器可以在同一端口上处理SSL和非SSL消息。 我已经实现了NIO服务器,并且对于非SSL请求,它可以很好地工作。我在SSL方面花了很长时间,可以真正使用一些指导。 到目前为止,这是我所做的。 为了区分SSL消息和非SSL消息,我检查了入站请求的第一个字节,看看它是否是SSL / TLS消息。例: 在parseTLS()方法中,

  • 我们想使用自我签署的证书为我们的内部服务,真的只是这样所有的东西都是通过网络加密发送。 我遇到的问题是自我签名证书的安全问题。所有Jetty实例都使用相同的密钥库,所以理论上证书是加载的...事实上,从调试日志记录中,我有 密钥:Sun RSA公钥,2048位模数:2259478458720030969063289131205915080468730897380892158059109626353

  • 我正在尝试将支付网关集成到我的nodejs应用程序中。当支付完成时,网关用支付结果将用户重定向到我的站点。结果是RSA签名的,我需要用支付网关提供的公钥来验证它。 下面是支付网关为签名验证提供的示例PHP代码。 有谁知道怎么把这件事搞定吗?

  • 我一直在尝试使用andriod中的融合位置应用程序接口获取位置(lat/lon)。当wifi和gps都打开时,我的代码运行良好。如果我关闭gps,那么我不会得到任何位置更新。 我正在使用BALANCED_POWER_ACCURACY进行位置请求。我在清单中添加了Access_FINE_Location权限,并在我的build.gradle文件中使用了播放服务版本9.2.1。 我正在真实设备上进行测

  • 问题内容: 我是android编程的初学者。我的研究生项目是关于跟踪移动设备的,我需要代码将位置(不使用GPS)保存为文本文件。有人建议我这样做的代码。这将对我有很大的帮助。 问题答案: 试试这个。 用于写SD卡

  • 我正在编写一些代码,试图对一些数据进行签名。在将openssl生成的私钥转换为Java密钥库之后,我将Java签名类与SHA256withRSA一起使用。我试图确认openssl中Java类返回的签名,但由于某些原因,我无法让openssl进行验证。我最终需要在iOS Swift 3中实现这个签名验证,但在找到库之前,我想尝试根据openssl标准检查Java签名。 例如,我从我们的登录服务器得到