我为我的域名购买了证书(来自comodo),它包含3个文件:私钥,证书和ca-bundle文件。
我将它添加到我的apache server / mod_ssl它完美地工作。我可以轻松配置,因为它有3个配置参数:SSLCertificateFile,SSLCertificateKeyFile,SSLCertificateChainFile。
我尝试使用Netty作为网络库添加到我的其他Java应用程序中。 以下是我的服务器代码:
SslContext sslContext = null;
File cert = new File(Config.CERT_FILE_PATH);
File key = new File(Config.KEY_FILE_PATH);
sslContext = SslContextBuilder.forServer(cert, key).build();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.localAddress(port)
.childOption(ChannelOption.TCP_NODELAY, true)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childHandler(new WebServerInitializer(sslCtx));
Channel ch = b.bind().sync().channel();
Config.CERT_FILE_PATH
是我的证书文件路径,Config.KEY_FILE_PATH
是我的私钥文件路径。
但问题是某些浏览器说证书错误(更多细节是Mac OS上的Chrome,浏览器不信任我的证书)。
我做了一些研究,发现我的netty http服务器没有向客户端发送完整的证书链(包含我的证书的中间证书),它只发送我的证书(我通过KeyStore Explorer工具检查)。
我尝试将Config.CERT_FILE_PATH
值替换为ca-bundle文件的路径,或者将证书文件的值附加到ca-bundle文件并使用新文件,但仍然没有运气。抛出了一个例外:
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: decrypt_error
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:358)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:230)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.net.ssl.SSLException: Received fatal alert: decrypt_error
at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1646)
at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1614)
at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1780)
at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1075)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:901)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:775)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1135)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1025)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:965)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:327)
... 12 more
如何正确地将我的证书与ca-bundle一起添加到netty服务器?
为什么其他浏览器(除了mac上的chrome base browser之外的所有Windows浏览器和Mac上的浏览器)仍可以使用我的错误服务器?
答案 0 :(得分:1)
你是如何连接文件的?如果您站点公开,我建议访问What's My Chain Cert?并下载正确的链(保持"包括根证书"未选中)。将此文件用作cert
。
至于为什么该网站适用于大多数浏览器,而不是某些浏览器,see this answer。
您可以使用SSL Labs来诊断任何证书和SSL相关问题。