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

指定tls握手的密码套件

危飞跃
2023-03-14

在我的需求规格中写着:

支持这些安全框架的TLS实现应至少实现以下密码组:TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

Java说它在Java7的TLSv1.2中提供了这个密码套件的实现。

我不熟悉安全,所以不知道如何使用它。

在我的客户端,我使用:

sslcontext = SSLContexts.custom()
                    .loadTrustMaterial(..)
                   .loadKeyMaterial(..)
                   .useProtocol("TLSv1.2")
                    .build();

我从谷歌那里学到的是,客户端为服务器提供了一系列选项,服务器需要选择其中之一。如果我错了,请纠正我。

现在我想在服务器端指定它,我不知道该怎么办,如果我使用安全连接器的码头:

<Call name="addConnector">
     <Arg>
       <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
         <Arg>
           <New class="org.eclipse.jetty.http.ssl.SslContextFactory">
             <Set name="KeyStore">./etc/keystores/server.jks</Set>
             <Set name="KeyStorePassword">password</Set>
             <Set name="KeyManagerPassword">password</Set>
             <Set name="TrustStore">./etc/keystores/trust_store.jks</Set>
             <Set name="TrustStorePassword">password</Set>
             <Set name="wantClientAuth">true</Set>
             <Set name="needClientAuth">true</Set>
           </New>
         </Arg>
         <Set name="port">8443</Set>
         <Set name="maxIdleTime">30000</Set>
       </New>
     </Arg>
</Call> 

它工作,

如果我添加以下内容,将启用TLSv1。1:

<Set name="excludeProtocols">
      <Array type="java.lang.String">
        <Item>SSLv3</Item>
        <Item>TLSv1.2</Item>
        <Item>TLSv1</Item>
        <Item>SSLv2Hello</Item>
      </Array>
     </Set>

它将给出错误:

执行requestGEThttps://localhost:8443/线程“main”javax中的HTTP/1.1异常。网ssl。SSLHandshakeException:服务器选择了TLSv1。1,但客户端未启用或不支持该协议版本。

但如果我只允许TLSv1。2、它运行:

<Set name="excludeProtocols">
          <Array type="java.lang.String">
            <Item>SSLv3</Item>
            <Item>TLSv1.1</Item>
            <Item>TLSv1</Item>
            <Item>SSLv2Hello</Item>
          </Array>
         </Set>

但是在这里,如果我指定协议和ciphersuite规范:

 <Set name="IncludeCipherSuites">
    <Array type="java.lang.String">
      <Item>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256</Item>
    </Array>
  </Set>

我得到以下例外:

线程"main"javax.net.ssl.SSLHandshakeExc0019:远程主机在握手期间关闭连接sun.security.ssl.SSLSocketImpl.read记录(SSLSocketImpl.java:912)sun.security.ssl.SSLSocketImpl.perform初始握手(SSLSocketImpl.java:1294)在sun.security.ssl.SSLSocketImpl.start握手(SSLSocketImpl.java:1321)在sun.security.ssl.SSLSocketImpl.start握手(SSLSocketImpl.java:1305)在org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)在org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)在org.apache.http.impl.conn.DefaultHttpClientConnection操作员。PoolingHttpClientConnectionManager. Connect(PoolingHttpClientConnectionManager. java: 353),网址为org. apache. http. imp. exchain。在org. apache. http. implified. exec上建立路由(Main ClientExec. java: 380)。在org. apache. http. imp. exc.执行(Main ClientExec. java: 236)。在org. apache. http. imp. exchain中执行(原型执行. java: 184)。执行(RetryExec. java: 88)在org. apache. http. imp. exchain。执行(ReDirectExec. java: 110)在org. apache. http. imp. client.InternalHttpClient. doExecute(InternalHttpClient. java: 184)at org. apache. http. pp. client.执行(CloseableHttpClient. java: 82)在org. apache. http. imp. client.在客户端执行(CloseableHttpClient. java: 107)。ClientCustomSSL. main(ClientCustomSSL. java: 69)引起:java. io.在sun. security. ssl错误地关闭SSL对等点。在sun. security. ssl上读取(InputRecord. java: 352)。SSLSocketImp. readRecords(SSLSocketInp. java: 893)...16 more

我尝试的下一件事是在客户端使用factory:

SSLConnectionSocketFactory factory=new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1.2"},sslcontext.getDefaultSSLParameters().getCipherSuites(), SSLConnectionSocketFactory.getDefaultHostnameVerifier());

我已经在屏幕上打印了这些密码套件。

sslcontext.getDefaultSSLParameters().getCipherSuites()

然后我排除了所有的密码套件,除了“TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256”,它给了我错误

<Set name="ExcludeCipherSuites">
        <Array type="java.lang.String">
           <Item>...</Item>

                  <!--
            <Item>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256</Item>
              -->
            </Array>
      </Set>

但如果我排除了除“TLS_RSA_WITH_AES_128_CBC_SHA256”之外的所有选项,它就起作用了。

<Set name="ExcludeCipherSuites">
        <Array type="java.lang.String">
          <Item>...</Item>
          <!--
            <Item>TLS_RSA_WITH_AES_128_CBC_SHA256</Item>
             -->
                </Array>
      </Set>

这意味着一些密码套件由jetty支持,而另一些则不支持。

是这样吗?,我们有这样的清单吗。或者有没有其他方法可以做到这一点。请导游。我想用这个密码套件来握手,但我不知道怎么做。

共有1个答案

谷梁凌
2023-03-14

在进一步的研究中,我知道这可能是因为用于创建证书的密钥算法。

我在keytool中使用RSA作为keyalg创建证书,它不支持TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,但它支持TLS_RSA_WITH_AES_128_CBC_SHA256。

所以,我使用EC作为关键字,支持TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

 类似资料:
  • 我有一个关于TLS初次握手的问题。(我不是专家,所以我想要一个简单易懂的解释)。 根据维基百科: *谈判阶段: 客户端发送ClientHello消息,指定其支持的最高TLS协议版本、随机数、建议的密码套件列表和压缩方法 服务器用一条ServerHello消息进行响应,其中包含从客户端提供的选项中选择的协议版本、随机数、密码套件和压缩方法。服务器还可以发送会话id作为消息的一部分,以执行恢复的握手*

  • 我正在开发一个java应用程序,它将实现TLS协议。因为我最近开始实施它。在开发类型握手的记录协议实现时,我从google chrome和mozilla firefox获得了奇怪的密码套件。正如本文所述,在握手协议中有类型、握手长度、版本、随机、会话id长度、会话id、密码套件长度、密码套件。。。。。。。 我得到的所有字段都是正确的(在密码套件之前),但在密码套件上,我从google chrome

  • 我正在go中运行https web服务器。我正在使用angular web应用程序(Chrome浏览器)对其进行测试,该应用程序可以对web服务器进行ajax调用。 如果我不断地点击网络服务器,一切似乎都正常。但每当我让它闲置一段时间并点击web服务器时,来自浏览器的ajax调用都不会得到响应。我几乎总是在服务器日志中看到此日志行。 我可以确认IP地址是我的IP地址。 我像这样启动我的https服

  • 我已经创建了自己的私有注册表(私有注册表),但我无法将图像推送到它。比我得到以下错误: 正在运行的注册表的日志显示以下内容: 我无法卷曲我的注册表(超时)。以下是我执行的步骤: 首先,我创建了自签名证书: 我已创建注册表,它将使用以下证书: 我授予了正确的权限: 我创建了:,并复制了我的在它里面。我编辑了我的并添加了:(我的内部ip和注册表名) 我还重新启动了docker和我的注册表。 编辑:

  • 我需要与外部服务连接,而且我的客户端身份验证有问题。该服务需要证书、用户名和密码以及请求。 我正在使用Windows Server 2008 R2。 我已经收到带有证书的PKCS#7包并导入: 本地计算机/个人的SSL证书(仅含公钥) 中间CA和根CA到本地计算机/受信任的RootCertificationAuthorities 我已经在Windows注册表中启用了TLS 1.0、1.1、1.2客

  • 我们很难与远程机器(如PayPal vb)建立https连接谁从我们的系统中禁用了SSL3协议。Net应用程序。HttpWebRequest实例的GetResponse方法出现以下异常。 请求被中止:无法创建SSL/TLS安全通道。 当我们使用WireShark深入并跟踪网络日志时,我们看到远程机器返回以下错误 TLSv1。2警报(级别:致命,描述:握手失败)握手失败40 更有趣的情况是,当我尝试