Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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 在Jetty日志中使用SSL\u NULL\u NULL密码套件_Java_Ssl_Jetty_Ssl Certificate_Jsse - Fatal编程技术网

Java 在Jetty日志中使用SSL\u NULL\u NULL密码套件

Java 在Jetty日志中使用SSL\u NULL\u NULL密码套件,java,ssl,jetty,ssl-certificate,jsse,Java,Ssl,Jetty,Ssl Certificate,Jsse,我将Jetty与HTTPS和有效证书一起使用,但我不确定是否正确,因为密码套件在服务器日志中似乎是SSL\u NULL\u,带有\u NULL\u NULL。然而,客户端日志看起来不错 说来话长:我附加了一个Java示例,希望使用Jetty-7.6.10和两个脚本来创建密钥库和信任库 JettyHttpSpsforStackOverflow一起或分别运行客户端和服务器,以取消日志记录 sh脚本创建密钥库和信任库。密钥库包含一个链,该链由临时密钥库生成的根证书颁发机构结束。它复制了具有证书颁发机构

我将Jetty与HTTPS和有效证书一起使用,但我不确定是否正确,因为密码套件在服务器日志中似乎是
SSL\u NULL\u,带有\u NULL\u NULL
。然而,客户端日志看起来不错

说来话长:我附加了一个Java示例,希望使用Jetty-7.6.10和两个脚本来创建密钥库和信任库

JettyHttpSpsforStackOverflow
一起或分别运行客户端和服务器,以取消日志记录

sh脚本创建密钥库和信任库。密钥库包含一个链,该链由临时密钥库生成的根证书颁发机构结束。它复制了具有证书颁发机构和中间证书的真实案例

create single autosigned.sh
脚本也创建密钥库和信任库,但使用自签名证书

请注意,
SSL\u NULL\u WITH\u NULL\u NULL
显示为服务器的密码套件,包含两个证书链

我认为服务器域名没有问题。如果服务器运行在一台域名与正确签名证书中的可分辨名称匹配的机器上,我也会遇到同样的问题。SSLLab确认我的服务器上的SSL工作正常(B级),Google Chrome连接愉快

我认为Jetty客户没有问题。当我使用它时,它只调用我设置的
SSLContextFactory
来创建
SSLSocket
。令人惊讶的是,在Jetty客户端日志中,
TLS\u ECDHE\u RSA\u WITH\u AES\u 128\u CBC\u SHA
似乎是正在使用的密码套件

在Jetty服务器日志中使用_NULL_NULL获取SSL _NULL_是正常的吗?如果没有,如何使事情正确

创建-single-autosigned.sh

创建-single-autosigned.sh

JettyHttpsForStackOverflow.java


至少在以下情况下,您会看到这一点:

  • 您已修改了
    EnabledCipherSuite
    ,以包括所有受支持的密码套件。(不要!)

  • SSL握手尚未完成


  • 事实证明,Jetty-7.6.10.v20130312中的
    SslConnection
    记录不正确,而加密按其应有的方式进行

    长话短说:创建时,
    SslConnection
    SSLEngine
    中提取初始的
    SSLSession
    对象,并使用它保持日志记录。初始
    SSLSession
    有一个
    SSL\u NULL\u和\u NULL\u NULL
    密码,这是正常的,因为SSL握手尚未发生。激活
    -Djavax.net.debug=all
    表明确实发生了握手,而交互式调试表明
    SSLEngine
    升级为带有真正密码的
    SSLSession
    。问题在于Jetty的
    SslConnection
    仍然使用initial
    SSLSession
    对象记录日志。(它还使用initial
    SSLSession
    中的值来分配缓冲区,但这是另一个问题。)

    为使用
    \u engine.getSession()
    进行日志记录修补
    SslConnection
    ,可获得预期结果


    结语:Jetty 9完全重写了它的
    SslConnection

    ,在上面的示例中,我不涉及可用的密码套件,但我涉及生产服务器。这只是为了限制列表,因为SSL实验室将许多列表标记为不安全。我让这个例子静静地运行着。它产生了一个404和一个加密消息,所以我认为SSL握手确实发生了。奇怪的是,我得到了一个非常基本的案例,但在谷歌上我发现没有人遇到同样的问题。
    #!/bin/bash
    
    rm  their-keystore.jks 2> /dev/null
    rm  my-keystore.jks    2> /dev/null
    rm  my-truststore.jks  2> /dev/null
    
    echo "===================================================="
    echo "Creating fake third-party chain ca2 -> ca1 -> ca ..."
    echo "===================================================="
    
    keytool -genkeypair -alias ca  -dname cn=ca                           \
      -validity 10000 -keyalg RSA -keysize 2048                           \
      -ext BasicConstraints:critical=ca:true,pathlen:10000                \
      -keystore their-keystore.jks -keypass Keypass -storepass Storepass
    
    keytool -genkeypair -alias ca1 -dname cn=ca1                          \
      -validity 10000 -keyalg RSA -keysize 2048                           \
      -keystore their-keystore.jks -keypass Keypass -storepass Storepass
    
    keytool -genkeypair -alias ca2 -dname cn=ca2                          \
      -validity 10000 -keyalg RSA -keysize 2048                           \
      -keystore their-keystore.jks -keypass Keypass -storepass Storepass
    
    
      keytool -certreq -alias ca1                                            \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass   \
    | keytool -gencert -alias ca                                             \
        -ext KeyUsage:critical=keyCertSign                                   \
        -ext SubjectAlternativeName=dns:ca1                                  \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass   \
    | keytool -importcert -alias ca1                                         \
        -keystore   their-keystore.jks -keypass Keypass -storepass Storepass
    
    #echo "Debug exit" ; exit 0
    
      keytool -certreq -alias ca2                                           \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
    | keytool -gencert -alias ca1                                           \
        -ext KeyUsage:critical=keyCertSign                                  \
        -ext SubjectAlternativeName=dns:ca2                                 \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
    | keytool -importcert -alias ca2                                        \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass
    
    keytool -list -v -storepass Storepass -keystore their-keystore.jks
    
    
    echo  "===================================================================="
    echo  "Fake third-party chain generated. Now generating my-keystore.jks ..."
    echo  "===================================================================="
    read -p "Press a key to continue."
    
    # Import authority's certificate chain
    
      keytool -exportcert -alias ca                                         \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
    | keytool -importcert -trustcacerts -noprompt -alias ca                 \
        -keystore  my-keystore.jks -keypass Keypass -storepass Storepass
    
      keytool -exportcert -alias ca1                                        \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
    | keytool -importcert -noprompt -alias ca1                              \
        -keystore  my-keystore.jks -keypass Keypass -storepass Storepass
    
      keytool -exportcert -alias ca2                                        \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
    | keytool -importcert -noprompt -alias ca2                              \
        -keystore  my-keystore.jks -keypass Keypass -storepass Storepass
    
    # Create our own certificate, the authority signs it.
    
    keytool -genkeypair -alias e1  -dname cn=e1                        \
      -validity 10000 -keyalg RSA -keysize 2048                        \
      -keystore my-keystore.jks -keypass Keypass -storepass Storepass
    
      keytool -certreq -alias e1                                            \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass     \
    | keytool -gencert -alias ca2                                           \
        -ext SubjectAlternativeName=dns:localhost,ip:127.0.0.1              \
        -ext KeyUsage:critical=keyEncipherment,digitalSignature             \
        -ext ExtendedKeyUsage=serverAuth,clientAuth                         \
        -keystore their-keystore.jks -keypass Keypass -storepass Storepass  \
    | keytool -importcert -alias e1                                         \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass
    
    keytool -list -v  -storepass Storepass -keystore  my-keystore.jks
    
    echo "================================================="
    echo "Keystore generated. Now generating truststore ..."
    echo "================================================="
    read -p "Press a key to continue."
    
      keytool -exportcert -alias ca                                        \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
    | keytool -importcert -trustcacerts -noprompt -alias ca                \
        -keystore my-truststore.jks -keypass Keypass -storepass Storepass
    
      keytool -exportcert -alias ca1                                       \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
    | keytool -importcert -noprompt -alias ca1                             \
        -keystore my-truststore.jks -keypass Keypass -storepass Storepass
    
      keytool -exportcert -alias ca2                                       \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
    | keytool -importcert -noprompt -alias ca2                             \
        -keystore my-truststore.jks -keypass Keypass -storepass Storepass
    
      keytool -exportcert -alias e1                                        \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
    | keytool -importcert -noprompt -alias e1                              \
        -keystore my-truststore.jks -keypass Keypass -storepass Storepass
    
    keytool -list -v  -storepass Storepass -keystore  my-truststore.jks
    
    rm  their-keystore.jks 2> /dev/null
    
    #!/bin/bash
    
    rm  my-keystore.jks    2> /dev/null
    rm  my-truststore.jks  2> /dev/null
    
    keytool -genkeypair -alias e1  -dname cn=e1                        \
      -validity 10000 -keyalg RSA -keysize 2048                        \
      -keystore my-keystore.jks -keypass Keypass -storepass Storepass
    
    
    
    keytool -list -v  -storepass Storepass -keystore  my-keystore.jks
    
    echo "================================================="
    echo "Keystore generated. Now generating truststore ..."
    echo "================================================="
    read -p "Press a key to continue."
    
      keytool -exportcert -alias e1                                        \
        -keystore my-keystore.jks -keypass Keypass -storepass Storepass    \
    | keytool -importcert -noprompt -alias e1                              \
        -keystore my-truststore.jks -keypass Keypass -storepass Storepass
    
    keytool -list -v  -storepass Storepass -keystore  my-truststore.jks
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URL;
    import java.security.KeyManagementException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.Certificate;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLEngine;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    
    import org.eclipse.jetty.client.ContentExchange;
    import org.eclipse.jetty.client.HttpClient;
    import org.eclipse.jetty.server.Server;
    import org.eclipse.jetty.server.ssl.SslSelectChannelConnector;
    import org.eclipse.jetty.util.ssl.SslContextFactory;
    
    
    /**
     * Code sample for Jetty {@link HttpClient} with HTTPS, in a completely standalone fashion.
     * Use create-chains.sh and create-empty.sh to generate completely standalone certificates.
     */
    public class JettyHttpsForStackOverflow {
    
      public static void main( final String... arguments ) throws Exception {
        System.setProperty( "javax.net.debug", "all" ) ;
    
        try {
          if( arguments.length == 0 || "server".equals( arguments[ 0 ] ) ) {
            runServer() ;
          }
          if( arguments.length == 0 || "client".equals( arguments[ 0 ] ) ) {
            runClient() ;
          }
        } catch( Exception e ) {
          e.printStackTrace() ;
          System.exit( 1 ) ; // Avoids keeping the port open.
        }
    
      }
    
      private static void runServer() throws Exception {
        final KeyStore keyStore = loadKeystore() ;
        final SSLContext sslContext = createSslContext(
            keyStore,
            KEYPASS,
            newTrustManagers( keyStore, CERTIFICATE_ALIAS )
        ) ;
    
        final SslContextFactory sslContextFactory = new SslContextFactory() {
          @Override
          public SSLEngine newSslEngine() {
            return sslContext.createSSLEngine() ;
          }
          @Override
          public SSLEngine newSslEngine( final String host, final int port ) {
            return sslContext.createSSLEngine( host, port ) ;
          }
        } ;
        sslContextFactory.setAllowRenegotiate( true ) ;
        sslContextFactory.setNeedClientAuth( false ) ;
        sslContextFactory.setWantClientAuth( false ) ;
        sslContextFactory.setKeyStorePath( keyStore.toString() ) ; // Better logging.
        sslContextFactory.setKeyStore( keyStore ) ;
        sslContextFactory.setCertAlias( CERTIFICATE_ALIAS ) ;
        sslContextFactory.setKeyManagerPassword( KEYPASS ) ;
    
        final SslSelectChannelConnector sslConnector =
            new SslSelectChannelConnector( sslContextFactory ) ;
        sslConnector.setPort( PORT ) ;
        sslConnector.open() ;
    
        final Server jettyServer = new Server() ;
        jettyServer.addConnector( sslConnector ) ;
    
        jettyServer.start() ;
      }
    
      public static void runClient() throws Exception {
        final KeyStore keyStore = loadTruststore() ;
    
        final HttpClient httpClient = new HttpClient() ;
        httpClient.getSslContextFactory().setKeyStore( keyStore ) ; // Better logging.
        httpClient.getSslContextFactory().setKeyStorePassword( "storepwd" ) ;
        httpClient.getSslContextFactory().setKeyManagerPassword( KEYPASS ) ;
        httpClient.setConnectorType( HttpClient.CONNECTOR_SELECT_CHANNEL ) ;
        httpClient.setConnectorType(HttpClient.CONNECTOR_SOCKET);
    
    
        // Don't need that because shipping our own certificate in the truststore.
        // Anyways, it blows when set to true.
    //    httpClient.getSslContextFactory().setValidateCerts( false ) ;
    
        httpClient.start() ;
    
        final ContentExchange contentExchange = new ContentExchange() ;
        contentExchange.setURI( new URL( "https://localhost:" + PORT ).toURI() ) ;
        contentExchange.setTimeout( 36_000_000 ) ; // Leave time for debugging.
        httpClient.send( contentExchange ) ;
        contentExchange.waitForDone() ;
        assert( contentExchange.getStatus() == ContentExchange.STATUS_COMPLETED ) ;
      }
    
      private static SSLContext createSslContext(
          final KeyStore keyStore,
          final String keypass,
          final TrustManager[] trustManagers
      ) {
        try {
          final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance( "SunX509" ) ;
          keyManagerFactory.init( keyStore, keypass == null ? null : keypass.toCharArray() ) ;
          final KeyManager[] keyManagers = keyManagerFactory.getKeyManagers() ;
          final SecureRandom secureRandom = new SecureRandom() ;
    
          final SSLContext sslContext = SSLContext.getInstance( "TLS" ) ;
          sslContext.init(
              keyManagers,
              trustManagers,
              secureRandom
          ) ;
          return sslContext ;
        } catch( NoSuchAlgorithmException | UnrecoverableKeyException | KeyStoreException
            | KeyManagementException e
        ) {
          throw new RuntimeException( e ) ;
        }
      }
    
    
    
      private static TrustManager[] newTrustManagers(
          final KeyStore keyStore,
          final String certificateAlias
      ) {
        try {
          final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance( "SunX509" ) ;
          trustManagerFactory.init( keyStore ) ;
          final TrustManager[] trustManagers ;
          if( certificateAlias == null ) {
            trustManagers = trustManagerFactory.getTrustManagers() ;
          } else {
            final Certificate certificate = keyStore.getCertificate( certificateAlias ) ;
            final X509Certificate[] x509Certificates ;
            if( certificate == null ) {
              x509Certificates = new X509Certificate[ 0 ] ;
            } else {
              x509Certificates = new X509Certificate[] { ( X509Certificate ) certificate } ;
            }
            trustManagers = new TrustManager[] { newX509TrustManager( x509Certificates ) } ;
    
          }
          return trustManagers ;
        } catch( KeyStoreException | NoSuchAlgorithmException e ) {
          throw new RuntimeException( e );
        }
    
      }
    
      private static final TrustManager newX509TrustManager( final X509Certificate[] certificates ) {
        return new X509TrustManager() {
    
          public X509Certificate[] getAcceptedIssuers() {
            return certificates ;
          }
    
          public void checkClientTrusted(
              final X509Certificate[] certs,
              final String authType
          ) { ; }
    
          public void checkServerTrusted(
              final X509Certificate[] certs,
              final String authType
          ) { ; }
        } ;
      }
    
    
      public static KeyStore loadKeystore()
          throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException
      {
        return loadKeystore( KEYSTORE_RESOURCE_URL ) ;
      }
    
      public static KeyStore loadTruststore()
          throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException
      {
        return loadKeystore( TRUSTSTORE_RESOURCE_URL ) ;
      }
    
      public static KeyStore loadKeystore( final URL keystoreResourceUrl )
          throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException
      {
        try( final InputStream inputStream = keystoreResourceUrl.openStream() ) {
          final KeyStore keyStore = KeyStore.getInstance( "JKS" ) ;
          // We don't need the storepass for just reading one password-protected certificate
          // of our own, or a trusted entry.
          keyStore.load( inputStream, null ) ;
          return keyStore ;
        }
      }
    
    
      private static final int PORT = 8443 ;
    
      private static final String CERTIFICATE_ALIAS = "e1";
    
      private static final String KEYPASS = "Keypass";
    
      private static final URL KEYSTORE_RESOURCE_URL
          = JettyHttpsForStackOverflow.class.getResource( "my-keystore.jks" ) ;
    
      private static final URL TRUSTSTORE_RESOURCE_URL
          = JettyHttpsForStackOverflow.class.getResource( "my-truststore.jks" ) ;
    
    
    }