证书链

举报
黄生 发表于 2022/11/05 16:25:16 2022/11/05
【摘要】 public static SslContextBuilder forServer(File keyCertChainFile, File keyFile)Creates a builder for new server-side SslContextkeyCertChainFile - an X.509 ce...
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服务器证书:

image.png

没完,续:

image.png

可以看到,TLS连接完成的一些信息

而如果存在问题,就可以看到一些比较有用的线索
下面这个,服务器是采用的自己签名的证书链文件(含客户证书、CA证书)。
image.png

而如果服务器是采用的只有客户证书,则是这样的:
image.png

s_client命令还有很多选项,比如 指定协议或不采用某协议 -tls1_2 -no_tls1_2 ; -tlsextdebug 没有增加很多信息出来;-showcerts ; 还有各种检查等等。

可以参考 openssl s_client commands and examples

但是,如果碰到netty客户端直接粗暴的报错,我拿它是没有什么好办法了,也许是它不喜欢服务器的证书:

image.png

但是,可以用上面的openssl的连接命令来连一下,看看表现,
也可以使用浏览器来连一下,也看看表现
这样综合起来,大致去推测netty是什么原因导致那个粗暴的报错

image.png

这个是NET::ERR_CERT_AUTHORITY_INVALID,应该是说用自建的CA进行证书认证无效。点“风险提示”,可以查看服务器证书。

image.png

终于成功了,netty的客户端实现有点问题

SslContext sslContext= SslContextBuilder.forClient().trustManager(....).build();
//这里要添加对trustManager()的调用,指定用于对服务器证书进行认证的证书,比如签发服务器证书的CA的证书

这里为了简单,使用的自签证书。所以服务器是ca_cert.pem和ca_key.pem,客户端这里也使用ca_cert.pem,就可以了。自己给自己签发,所以自己用自己的证书验证。

看一下浏览器访问,和Openssl访问的效果。

下面再试一下自建CA签发的用户证书。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。