Yeah, will do.

Rogan
On Wed, 25 Oct 2017 at 16:05 'Norman Maurer' via Netty discussions <
[email protected]> wrote:

> Hey Rogan,
>
> Maybe you want to provide a PR for netty to not pass I note null stuff ?
>
> Sorry but I never used Bouncycastle so I am not a big help.
>
>
> On 25. Oct 2017, at 16:03, Rogan Dawes <[email protected]> wrote:
>
> Seems like I'm talking to myself here :-(
>
> Anyway, current status is that BouncyCastle requires use of the PKIX
> implementation of a KeyManager, and this is not the default. In order to do
> this, it looks like I have to replicate a whole lot of code that already
> exists in SslContextBuilder and SslContext, unless I do:
>
> Security.setProperty("ssl.KeyManagerFactory.algorithm","PKIX");
>
> But that feels like a "big stick" approach, being a global change! :-(
>
> Also also noted that I have to change JdkSslServerContext (and place a
> copy in my own code), because when initialising the SSLContext, it passes a
> null value instead of a SecureRandom instance.:
>
>             SSLContext ctx = sslContextProvider == null ?
> SSLContext.getInstance(PROTOCOL)
>                 : SSLContext.getInstance(PROTOCOL, sslContextProvider);
>             ctx.init(keyManagerFactory.getKeyManagers(),
>                      trustManagerFactory == null ? null :
> trustManagerFactory.getTrustManagers(),
>                      null);
>
>
> BouncyCastle does not like that at all.
>
> Rogan
>
> On Thursday, October 5, 2017 at 1:06:20 PM UTC+2, Rogan Dawes wrote:
>>
>> Ok, so I figured out I could specify
>>
>> sslContextBuilder.sslContextProvider(Security.getProvider("BCJSSE"));
>>
>> Now it seems that I'm not configuring something correctly for EC
>> algorithms, or else Netty and BouncyCastle are not playing nicely together.
>> Below is a slightly modified EchoServer. It pre-loads the BouncyCastle
>> providers, and uses a pre-generated EC key and certificate, since
>> SelfSignedCertificate is hard coded to use RSA.
>>
>> package io.netty.example.echo;
>>
>>
>> import java.io.ByteArrayInputStream;
>>
>> import java.security.Security;
>>
>>
>> import javax.net.ssl.SSLEngine;
>>
>>
>> import org.bouncycastle.jce.provider.BouncyCastleProvider;
>>
>> import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider;
>>
>>
>> import io.netty.bootstrap.ServerBootstrap;
>>
>> import io.netty.channel.ChannelFuture;
>>
>> import io.netty.channel.ChannelHandler.Sharable;
>>
>> import io.netty.channel.ChannelHandlerContext;
>>
>> import io.netty.channel.ChannelInboundHandlerAdapter;
>>
>> import io.netty.channel.ChannelInitializer;
>>
>> import io.netty.channel.ChannelOption;
>>
>> import io.netty.channel.ChannelPipeline;
>>
>> import io.netty.channel.EventLoopGroup;
>>
>> import io.netty.channel.nio.NioEventLoopGroup;
>>
>> import io.netty.channel.socket.SocketChannel;
>>
>> import io.netty.channel.socket.nio.NioServerSocketChannel;
>>
>> import io.netty.handler.logging.LogLevel;
>>
>> import io.netty.handler.logging.LoggingHandler;
>>
>> import io.netty.handler.ssl.SslContext;
>>
>> import io.netty.handler.ssl.SslContextBuilder;
>>
>> import io.netty.handler.ssl.SslHandler;
>>
>>
>> /**
>>
>>  * Echoes back any received data from a client.
>>
>>  */
>>
>> public final class EchoServer {
>>
>>
>> private static byte[] KEY =
>>
>> ("-----BEGIN PRIVATE KEY-----\n"
>>
>> + "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgujVVI0eva1wiEgIK\n"
>>
>> + "lBon2bp0ZFnS8JCuYe3djnfvPG6hRANCAARXIyQz9p/u9IdnLX/hKokNTD5VLMTX\n"
>>
>> + "OwA+sTCBY4i2iyZBr0IJQ2ckcoOaljMIFDL/ZKsZKM0hJsoylUD9ZVW1\n"
>>
>> + "-----END PRIVATE KEY-----\n").getBytes();
>>
>> private static byte[] CERT =
>>
>> ("-----BEGIN CERTIFICATE-----\n"
>>
>> + "MIIBHDCBwqADAgECAgRZ1gxLMAoGCCqGSM49BAMCMBYxFDASBgNVBAMMC2V4YW1w\n"
>>
>> + "bGUub3JnMB4XDTE3MTAwNTEwNDIxOFoXDTE4MTAwNTEwNDIxOFowFjEUMBIGA1UE\n"
>>
>> + "AwwLZXhhbXBsZS5vcmcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARXIyQz9p/u\n"
>>
>> + "9IdnLX/hKokNTD5VLMTXOwA+sTCBY4i2iyZBr0IJQ2ckcoOaljMIFDL/ZKsZKM0h\n"
>>
>> + "JsoylUD9ZVW1MAoGCCqGSM49BAMCA0kAMEYCIQD2/7J9u4Cz5ewdgXAe7jM9B3w2\n"
>>
>> + "R8Cg4Tph4i9629mF1QIhAL59cMvwwEuN7HxYYZoZNB3nGOoMVFXwVvdZwuMhOo5Z\n"
>>
>> + "-----END CERTIFICATE-----").getBytes();
>>
>>
>> public static void main(String[] args) throws Exception {
>>
>> // Configure SSL.
>>
>> Security.addProvider(new BouncyCastleProvider());
>>
>> BouncyCastleJsseProvider bcjsp = new BouncyCastleJsseProvider();
>>
>> Security.addProvider(bcjsp);
>>
>>
>> ByteArrayInputStream cert = new ByteArrayInputStream(CERT);
>>
>> ByteArrayInputStream key = new ByteArrayInputStream(KEY);
>>
>> final SslContext sslCtx = SslContextBuilder.forServer(cert, key
>> ).sslContextProvider(bcjsp).build();
>>
>>
>> // Configure the server.
>>
>> EventLoopGroup bossGroup = new NioEventLoopGroup(1);
>>
>> EventLoopGroup workerGroup = new NioEventLoopGroup();
>>
>> try {
>>
>> ServerBootstrap b = new ServerBootstrap();
>>
>> b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class
>> ).option(ChannelOption.SO_BACKLOG, 100)
>>
>> .handler(new LoggingHandler(LogLevel.INFO)).childHandler(new 
>> ChannelInitializer<SocketChannel>()
>> {
>>
>> @Override
>>
>> public void initChannel(SocketChannel ch) throws Exception {
>>
>> ChannelPipeline p = ch.pipeline();
>>
>> SslHandler s = sslCtx.newHandler(ch.alloc());
>>
>> SSLEngine e = s.engine();
>>
>> e.setEnabledCipherSuites(e.getSupportedCipherSuites());
>>
>> p.addLast(s);
>>
>> p.addLast(new LoggingHandler(LogLevel.INFO));
>>
>> p.addLast(new EchoServerHandler());
>>
>> }
>>
>> });
>>
>>
>> // Start the server.
>>
>> ChannelFuture f = b.bind(4433).sync();
>>
>>
>> // Wait until the server socket is closed.
>>
>> f.channel().closeFuture().sync();
>>
>> } finally {
>>
>> // Shut down all event loops to terminate all threads.
>>
>> bossGroup.shutdownGracefully();
>>
>> workerGroup.shutdownGracefully();
>>
>> }
>>
>> }
>>
>>
>> @Sharable
>>
>> public static class EchoServerHandler extends ChannelInboundHandlerAdapter
>> {
>>
>>
>> @Override
>>
>> public void channelRead(ChannelHandlerContext ctx, Object msg) {
>>
>> ctx.write(msg);
>>
>> }
>>
>>
>> @Override
>>
>> public void channelReadComplete(ChannelHandlerContext ctx) {
>>
>> ctx.flush();
>>
>> }
>>
>>
>> @Override
>>
>> public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
>>
>> // Close the connection when an exception is raised.
>>
>> cause.printStackTrace();
>>
>> ctx.close();
>>
>> }
>>
>> }
>>
>> }
>>
>> I try to connect to it using OpenSSL (1.1 has better support for EC
>> algorithms, it seems, in particular):
>>
>> openssl s_client
>>
>> And I get:
>>
>> Oct 05, 2017 1:00:48 PM org.bouncycastle.jsse.provider.ProvTlsServer
>> notifyAlertRaised
>>
>> INFO: Server raised fatal(2) handshake_failure(40) alert: Failed to read
>> record
>>
>> org.bouncycastle.tls.TlsFatalAlert: handshake_failure(40)
>>
>> at org.bouncycastle.tls.AbstractTlsServer.getSelectedCipherSuite(Unknown
>> Source)
>>
>> at
>> org.bouncycastle.jsse.provider.ProvTlsServer.getSelectedCipherSuite(Unknown
>> Source)
>>
>> at org.bouncycastle.tls.TlsServerProtocol.sendServerHelloMessage(Unknown
>> Source)
>>
>> at org.bouncycastle.tls.TlsServerProtocol.handleHandshakeMessage(Unknown
>> Source)
>>
>> at org.bouncycastle.tls.TlsProtocol.processHandshakeQueue(Unknown Source)
>>
>> at org.bouncycastle.tls.TlsProtocol.processRecord(Unknown Source)
>>
>> at org.bouncycastle.tls.RecordStream.readRecord(Unknown Source)
>>
>> at org.bouncycastle.tls.TlsProtocol.safeReadRecord(Unknown Source)
>>
>> at org.bouncycastle.tls.TlsProtocol.offerInput(Unknown Source)
>>
>> at org.bouncycastle.jsse.provider.ProvSSLEngine.unwrap(Unknown Source)
>>
>> at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
>>
>> at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(
>> SslHandler.java:281)
>>
>> at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1215)
>>
>> at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(
>> SslHandler.java:1127)
>>
>> at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1162)
>>
>> at
>> io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(
>> ByteToMessageDecoder.java:489)
>>
>> at io.netty.handler.codec.ByteToMessageDecoder.callDecode(
>> ByteToMessageDecoder.java:428)
>>
>> at io.netty.handler.codec.ByteToMessageDecoder.channelRead(
>> ByteToMessageDecoder.java:265)
>>
>> at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(
>> AbstractChannelHandlerContext.java:362)
>>
>> at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(
>> AbstractChannelHandlerContext.java:348)
>>
>> at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(
>> AbstractChannelHandlerContext.java:340)
>>
>> at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(
>> DefaultChannelPipeline.java:1359)
>>
>> at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(
>> AbstractChannelHandlerContext.java:362)
>>
>> at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(
>> AbstractChannelHandlerContext.java:348)
>>
>> at io.netty.channel.DefaultChannelPipeline.fireChannelRead(
>> DefaultChannelPipeline.java:935)
>>
>> at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(
>> AbstractNioByteChannel.java:134)
>>
>> at io.netty.channel.nio.NioEventLoop.processSelectedKey(
>> NioEventLoop.java:645)
>>
>> at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(
>> NioEventLoop.java:580)
>>
>> at io.netty.channel.nio.NioEventLoop.processSelectedKeys(
>> NioEventLoop.java:497)
>>
>> at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
>>
>> at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(
>> SingleThreadEventExecutor.java:858)
>>
>> at
>> io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(
>> DefaultThreadFactory.java:138)
>>
>> at java.lang.Thread.run(Thread.java:748)
>>
>> I have confirmed that this works using old-style Threads, etc, and can
>> provide that code here if needed.
>>
>> Any idea what I am doing wrong? If I remove the
>> "builder.sslContextProvider(bcjsp)", it also works, BUT only BouncyCastle
>> has support for "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8", which need! Sigh!
>>
>> Rogan
>>
>> On Tuesday, September 26, 2017 at 9:40:55 AM UTC+2, Rogan Dawes wrote:
>>>
>>> Hi,
>>>
>>> I'm trying to write a proxy to intercept COAP connections from an
>>> embedded device. I am able to clone the TLS certificates that it thinks it
>>> is connecting to, obviously using my own keys (for the TLS server side),
>>> and insert the CA cert into the firmware of this device. By this, I mean
>>> that an ASN.1 dump of my CA certificate and the "expected" CA certificate
>>> show differences only in the actual key values, not any other parameters of
>>> the keys or certificates.
>>>
>>> However, so far I have been unable to convince netty to negotiate a
>>> connection using the only supported algorithm offered by the device,
>>> being TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8. When I do, I get handshake errors
>>> that the handshaker was unable to establish a common cipher suite.
>>>
>>> I have tried using the native JDK 8 options (build 1.8.0_102-b14), as
>>> well as tried specifying use of the Openssl provider via
>>>
>>>
>>> sslContext = SslContextBuilder.forServer(km.getPrivateKey(target), km
>>> .getCertificateChain(target))
>>>
>>> .sslContextProvider(new BouncyCastleProvider()).build();
>>>
>>>
>>> I have also tried:
>>>
>>>
>>> sslContext = SslContextBuilder.forServer(km.getPrivateKey(target), km
>>> .getCertificateChain(target))
>>>
>>> .sslProvider(SslProvider.OPENSSL).build();
>>>
>>>
>>> where km is an X509KeyManager instance that holds the relevant keys.
>>>
>>>
>>> Any suggestions?
>>>
>>>
>>> Rogan
>>>
>>>
>>>
> --
> You received this message because you are subscribed to the Google Groups
> "Netty discussions" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/netty/08e97b0d-4be2-4ab3-8c6b-65455a0c5d57%40googlegroups.com
> <https://groups.google.com/d/msgid/netty/08e97b0d-4be2-4ab3-8c6b-65455a0c5d57%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Netty discussions" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/netty/9980AA91-B445-4B29-BB16-8264FADF1470%40googlemail.com
> <https://groups.google.com/d/msgid/netty/9980AA91-B445-4B29-BB16-8264FADF1470%40googlemail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/netty/CAOYdKdgGSdyLe8wVFt4z3GqrXZ-A0Q2BJMWr1MpbiG4YqDzytQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to