Я реализовал сервер (Netty 3.6.6, Java 6), который принимает соединения SSL/TLS и требуется для аутентификации цепочки сертификатов клиента. У меня есть общий центр сертификации в моем доверенном магазине. Запрещая описанный здесь случай, SSL-реализация сервера в основном работает. Учитывая действительный подписанный сертификат (который работает для подключения к другим серверам), я могу успешно подключиться к серверу с:Java SSL-сервер, не принимающий промежуточную цепочку сертификатов
openssl s_client -connect 127.0.0.1 -key test.key -cert test.pem -CAfile capath.pem
Если, однако, сертификат и промежуточные объединяются вместе, и я связываю с:
openssl s_client -connect 127.0.0.1 -key test.key -cert all.pem
затем я получаю unable to find valid certification path to requested target
брошен; Я ожидаю, что этот подход будет работать.
Мой код (сокращенно):
public class MySslConnectionHandler extends FrameDecoder {
// this class is added into the netty ChannelPipeline (not shown)
private SSLContext sslContext;
public MySslConnectionHandler() {
KeyStore clientKeyStore = KeyStore.getInstance('JKS');
clientKeyStore.load(new FileInputStream(trustStoreFilename), trustStorePassword);
PKIXSSLContextFactory contextFactory = new PKIXSSLContextFactory(serverKeyStore, keyStorePassword, clientKeyStore, true);
this.sslContext = contextFactory.buildSSLContext();
}
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) throws Exception {
SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(false);
engine.setNeedClientAuth(true);
engine.setEnabledProtocols(new String[] {"TLSv1","SSLv3"});
SslHandler sslHandler = new SslHandler(engine);
sslHandler.setEnableRenegotiation(false);
ChannelFuture handshakeFuture = sslHandler.handshake();
handshakeFuture.addListener(new MySslHandshakeListener(engine));
return buffer.readBytes(buffer.readableBytes());
}
}
Что я делаю неправильно? Наши клиенты сообщают, что это поведение отличается от других используемых ими серверов, поэтому я не хочу, чтобы это вызывало у них проблемы; это разумно? (Обширный прибегая к помощи не помогло ...)
Спасибо :-)
Благодарим за это.Команды openssl - это то, что коллега использовал для тестирования сервера, и дать пользователю достаточно информации, чтобы они могли исправить свою (неизвестную) реализацию. Теперь я понимаю, что эти проблемы - это разные проблемы. Без реализации пользователя я не могу быть уверен, что могу воспроизвести их точную проблему; учитывая, что они прекрасно соединяются с другими серверами, либо у нас есть ошибка, либо другие серверы как-то менее строгие. Tricky! Спасибо за вашу помощь. – Liche
Почему вы верите, что Java будет игнорировать остальную цепь? Он должен установить путь от фактического сертификата клиента через цепочку до сертификата в доверительном магазине. Как это игнорируется? – EJP
@EJP, если фактическая цепочка SheepMolly/Shepherd1/WoollyRoot и вы ставите Shepherd1 в truststore (потому что несовместимый одноранговый узел отправляет SheepMolly), тогда появляется Java, который построит цепочку SheepMolly - Shepherd1 и остановится там, потому что Shepherd1 доверен, в соответствии с «HandshakeCompletedEvent.getPeerCertificates». Но на самом деле Shepherd1, возможно, был отозван, и релейер, который смотрел на всю цепочку, мог бы обнаружить это. –