JVM аварийно завершает работу, используя подчеркивание '_' как часть имени сервера SNI

Я использую Netty 4.1.14.Final для своего приложения. Я хочу реализовать, чтобы сервер мог проверять информацию SNI, когда клиенты запрашивают, используя netty-tcnative-boringssl-static.

Но мое приложение вылетает один раз, когда я указываю -servername как svc.v1, и я получил это сообщение:

java: ../ssl/handshake_server.c:541: negotiate_version: Assertion `!ssl->s3->have_version' failed.

с помощью команды OpenSSL:

openssl s_client -cert service.crt -key service.key -CAfile root_ca.pem -connect 127.0.0.1:8080 -servername svc.v1_1
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 210 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1532336403
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
---

Однако это работает хорошо, если я укажу -servername как svc.v1 без подчеркивания _.

Here is my Netty server implementation:
// define ssl provider
private static final SslProvider SSL_PROVIDER = SslProvider.OPENSSL;

// factory method for creating ssl context
public SslContext serverCtx(InputStream certificate, InputStream privateKey) {
        try {
            return SslContextBuilder.forServer(certificate, privateKey)
                                    .sslProvider(SSL_PROVIDER)                                         
                                    .clientAuth(ClientAuth.REQUIRE)
                               .trustManager(TwoWayTrustManagerFactory.INSTANCE)
                                    .build();
        } catch (Exception e) {
            throw new RuntimeException("failed to create ssl context", e);
        }
}

// SNI Matcher implementation
@Slf4j
public class MySNIMatcher extends SNIMatcher {

    private final byte[] hostIdentifier;

    public MySNIMatcher(Identifier hostIdentifier) {
        super(0);
        this.hostIdentifier = hostIdentifier.idDistKey().getBytes(StandardCharsets.US_ASCII);
    }

    @Override
    public boolean matches(SNIServerName sniServerName) {
        return Arrays.equals(sniServerName.getEncoded(), hostIdentifier);
    }
}

// Netty bootstrap
bootstrap.childHandler(new ChannelInitializer<Channel>() {
    @Override
    protected void initChannel(Channel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        if (conf.logEnable())
            pipeline.addLast("logging", new LoggingHandler());

        if (conf.sslEnable()) {
            // conf.sslCtx() will actually use serverCtx() to create context
            SSLEngine engine = conf.sslCtx().newEngine(ch.alloc());
            SSLParameters s = engine.getSSLParameters();
            s.setSNIMatchers(new MySNIMatcher(...));
            s.setEndpointIdentificationAlgorithm("HTTPS");
            engine.setSSLParameters(s);
            pipeline.addLast("ssl", new SslHandler(engine, true));
        }

        codec(pipeline);

        int idleTimeout = (int) TimeUnit.MILLISECONDS.toSeconds(conf.idleTimeout());
        if (0 < idleTimeout)
            pipeline.addLast("idle", new IdleStateHandler(0, 0, idleTimeout));

        pipeline.addLast("handler", handler);
    }                  
})

Версия: netty -> 4.1.14.Final netty-tcnative-boringssl-static -> 2.0.5.Final


person Muyoo    schedule 24.07.2018    source источник


Ответы (1)


Имена хостов не могут содержать символ подчеркивания в соответствии с исходным RFC 952 и изменены RFC 1123. Следующее взято со страницы Википедии для Имя хоста.

Интернет-стандарты (запросы на комментарии) для протоколов требуют, чтобы метки имени хоста компонента могли содержать только буквы ASCII от «a» до «z» (без учета регистра), цифры от «0» до «9» и минус знак ('-'). Первоначальная спецификация имен хостов в RFC 952 требовала, чтобы метки не могли начинаться с цифры или с знак минус и не должен заканчиваться знаком минус. Однако более поздняя спецификация (RFC 1123) разрешила метки имен хостов начинаться с цифр. Никакие другие символы, знаки препинания или пробелы не допускаются.

person Jim Garrison    schedule 24.07.2018
comment
Большое спасибо! Но одно и то же значение между параметром -servername и Hostnames? - person Muyoo; 24.07.2018
comment
Или в моем примере выше Hostname это 127.0.0.1, а также svc.v1_0? - person Muyoo; 24.07.2018
comment
И есть ли способы избежать сбоя JVM, когда имя хоста недопустимо? Спасибо - person Muyoo; 24.07.2018
comment
Похоже, что сбой, вероятно, является ошибкой, он должен создавать значимое исключение, а не сбой. - person Jim Garrison; 24.07.2018