证书链
public static SslContextBuilder forServer(File keyCertChainFile,
File keyFile)
Creates a builder for new server-side SslContext
keyCertChainFile - an X.509 certificate chain file in PEM format
keyFile - a PKCS#8 private key file in PEM format
public abstract class SslContext
A secure socket protocol implementation which acts as a factory for SSLEngine and SslHandler. Internally, it is implemented via JDK's SSLContext or OpenSSL's SSL_CTX.
Making your server support SSL/TLS
// In your ChannelInitializer:
ChannelPipeline p = channel.pipeline();
SslContext sslCtx = SslContextBuilder.forServer(...).build();
p.addLast("ssl", sslCtx.newHandler(channel.alloc()));
...
Making your client support SSL/TLS
// In your ChannelInitializer:
ChannelPipeline p = channel.pipeline();
SslContext sslCtx = SslContextBuilder.forClient().build();
p.addLast("ssl", sslCtx.newHandler(channel.alloc(), host, port));
...
比如上面的一个参数文件要求,是
X.509 certificate chain file in PEM format
其实制作一个chain 文件很简单,用cat串接就行:
cat ca_certificate >> user_certificate
是不是很简单。越是顶级,越在文件的后面部分。
PKI标准和证书格式,可以参考这个(哎,华为云博客把外链都屏蔽了)
常见的PKI标准(X.509、PKCS)及证书相关介绍
DER编码是二进制的,PEM就是把二进制内容用base64编码一下,加上----
这样的头和尾的注释,它可以用文本编辑器打开。
这2种格式可以用openssl互相转换。
openssl 的s_client命令是一个SSL/TLS连接调试的好帮手。
最基本的用法是:
openssl s_client -connect your_ip_of_tls_server:port
会打印证书链、会话连接等信息
比如下面是一个向证书签发机构(CA)申请的HTTPS服务器证书:
没完,续:
可以看到,TLS连接完成的一些信息
而如果存在问题,就可以看到一些比较有用的线索
下面这个,服务器是采用的自己签名的证书链文件(含客户证书、CA证书)。
而如果服务器是采用的只有客户证书,则是这样的:
s_client命令还有很多选项,比如 指定协议或不采用某协议 -tls1_2 -no_tls1_2 ; -tlsextdebug 没有增加很多信息出来;-showcerts ; 还有各种检查等等。
可以参考 openssl s_client commands and examples
但是,如果碰到netty客户端直接粗暴的报错,我拿它是没有什么好办法了,也许是它不喜欢服务器的证书:
但是,可以用上面的openssl的连接命令来连一下,看看表现,
也可以使用浏览器来连一下,也看看表现
这样综合起来,大致去推测netty是什么原因导致那个粗暴的报错
这个是NET::ERR_CERT_AUTHORITY_INVALID,应该是说用自建的CA进行证书认证无效。点“风险提示”,可以查看服务器证书。
终于成功了,netty的客户端实现有点问题
SslContext sslContext= SslContextBuilder.forClient().trustManager(....).build();
//这里要添加对trustManager()的调用,指定用于对服务器证书进行认证的证书,比如签发服务器证书的CA的证书
这里为了简单,使用的自签证书。所以服务器是ca_cert.pem和ca_key.pem,客户端这里也使用ca_cert.pem,就可以了。自己给自己签发,所以自己用自己的证书验证。
看一下浏览器访问,和Openssl访问的效果。
下面再试一下自建CA签发的用户证书。
- 点赞
- 收藏
- 关注作者
评论(0)